Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果数组包含数组,使用slimphp的restfulapi将返回空_Php_Arrays_Rest_Api_Slim - Fatal编程技术网

如果数组包含数组,使用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);
}