如果数组包含数组,使用slimphp的restfulapi将返回空
在我开始之前,我想让你知道我在如果数组包含数组,使用slimphp的restfulapi将返回空,php,arrays,rest,api,slim,Php,Arrays,Rest,Api,Slim,在我开始之前,我想让你知道我在PHP方面真的是一个noob,这是我制作的第一个API 如果我想回显一个数组的信息(例如食物细节),它的效果非常好,但是当我尝试对多个项目执行同样的操作时,它返回空的 我已经在调试中检查了变量值。它在调试中很好,我看到一个包含多个子数组的数组 我的代码 $app->get('/allfoods', 'authenticate', function () use ($app) { global $user_id; $db = new FoodHandler();
PHP
方面真的是一个noob,这是我制作的第一个API
如果我想回显一个数组的信息(例如食物细节),它的效果非常好,但是当我尝试对多个项目执行同样的操作时,它返回空的
我已经在调试中检查了变量值。它在调试中很好,我看到一个包含多个子数组的数组
我的代码
$app->get('/allfoods', 'authenticate', function () use ($app) {
global $user_id;
$db = new FoodHandler();
// In here i get foods with their details via mysql
$result = $db->GetAllFoods();
$response = array();
$response["error"] = false;
$response["foods"] = array();
// looping through result and preparing food array
while ($row = $result->fetch_assoc()) {
$tmp = array();
$tmp['food_id'] = $row['food_id'];
$tmp['food_name'] = $row['food_name'];
$tmp['food_desc'] = $row['food_desc'];
$tmp['food_category'] = $row['food_category'];
$tmp['food_creationDate'] = $row['food_creationDate'];
array_push($response["foods"], $tmp);
}
echoRespnse(200, $response);});
我的输出函数(如果我的数组中没有数组,则该函数非常有效)
我的设置是什么
- 使用PHP7.2.4的本地主机wamp
- Apache 2.4.33
- Mysql 5.7.21
我还使用邮递员发送我的请求(我也在
C#
中尝试过,两者都返回空内容)我发现您的代码有几个问题。首先,路线定义有问题。定义路由时,应该向get
方法传递两个参数:一个模式(在您的例子中是字符串,/allfoods
)和Clousure的实例(在您的例子中是可调用的,路由回调,匿名函数)
因此,首先要从方法参数中删除authenticate
字符串,并将路由定义更改为:
$app->get('/allfoods', function ($request, $response, $args) {
// Body of the function goes here
});
请注意,我还删除了use($app)
,因为您可以使用$this
关键字访问应用程序实例,因此也不需要使用该关键字
第二件事是生成响应。使用Slim框架时,最好返回$response
对象,而不是echo
ing response()。这给了您一些优势,例如helper方法whitJson
可以帮助您生成JSON输出
要以更精简的方式细化整个代码,请执行以下操作:
$app->get('/allfoods', function ($request, $response, $args) {
global $user_id;
$db = new FoodHandler();
// In here i get foods with their details via mysql
$result = $db->GetAllFoods();
$data= array();
$data["error"] = false;
$data["foods"] = array();
// looping through result and preparing food array
while ($row = $result->fetch_assoc()) {
$tmp = array();
$tmp['food_id'] = $row['food_id'];
$tmp['food_name'] = $row['food_name'];
$tmp['food_desc'] = $row['food_desc'];
$tmp['food_category'] = $row['food_category'];
$tmp['food_creationDate'] = $row['food_creationDate'];
array_push($data["foods"], $tmp);
}
// Return JSON data using helper method
return $response->withJson($data);
}
您将不再需要echoResponse
函数。将方法声明更改为function($request,$resp)use($app)
,然后您可以使用return$resp->withJson($response)
而不是您的EchoResponse()
调用。我的坏@Furgas我想检查api是否工作,但忘记将其更改回$response。有一点可能json\u encode
返回false
,即,在编码为json时出错。最好检查一下。@NigelRen我想你应该加上这个作为答案。这是在Slim中返回JSON的正确方法。它还将捕获json\u encode
错误并抛出一个包含详细信息的异常。@SaeedAsgari添加了另一个关于json\u encode
问题的问题,如果您不自己处理。Salam Nima,谢谢您的帮助。我是新来php的,请跟我说实话。当我使用你的代码时,我在我的Postman ArgumentCountError中得到了这个错误:函数{closure}()的参数太少,传递了0,在C:\wamp\www\v1\index.php中正好需要3。我的Rest请求没有参数,只有api作为授权。你有电报吗,我们可以进一步讨论这个问题。Salam:)不用担心,我们都在这里提供帮助,但你应该更准确地描述你的问题。这与您在问题中提到的代码部分无关。在您提到的错误中,它没有指出是哪一行index.php引起了错误。你能粘贴index.php的那一部分吗?(!)ArgumentCountError:函数{closure}()的参数太少,通过了0个,在C:\wamp\www\v1\index.php的第194行,即$app->get('/allfoods',function($request,$response,$args){你想通过teamviewer、anydesk或skype检查我的项目吗?
$app->get('/allfoods', function ($request, $response, $args) {
global $user_id;
$db = new FoodHandler();
// In here i get foods with their details via mysql
$result = $db->GetAllFoods();
$data= array();
$data["error"] = false;
$data["foods"] = array();
// looping through result and preparing food array
while ($row = $result->fetch_assoc()) {
$tmp = array();
$tmp['food_id'] = $row['food_id'];
$tmp['food_name'] = $row['food_name'];
$tmp['food_desc'] = $row['food_desc'];
$tmp['food_category'] = $row['food_category'];
$tmp['food_creationDate'] = $row['food_creationDate'];
array_push($data["foods"], $tmp);
}
// Return JSON data using helper method
return $response->withJson($data);
}