为什么我在使用Android Volley发布到我的php时会出现foreach错误?

时间:2018-04-14 23:13:38

标签: php foreach android-volley

在我的Android应用中,我使用volley echo我的response,其形式应为:

[
    {
        "category":"whatever",
        "name":"whatever",
        "phone":"whatever",
        "comment":"whatever",
        "reviewid":32
    },
    {
        "category":"whatever",
        "name":"whatever",
        "phone":"whatever",
        "comment":"whatever",
        "reviewid":76
    }
]

相反,我得到的回应是:

Warning: Invalid argument supplied for foreach() in php file on line 13

我不知道我是否从java发错了,或者问题是我的php

在我的应用中,我有:

selectOwnUserReviews = Arrays.toString(category.getUserReviewIds());

当我举杯selectOwnUserReviews时,我可以看到selectOwnUserReviews的格式如下:

[63,59,42][234][34,29]等...

我正在尝试将带有selectOwnUserReviews的{​​{1}}数组发布到我的volley,其中包含:

php

这是我的 @Override //post info to php protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); //KEY_REVIEWID_USER is reviewiduser params.put(KEY_REVIEWID_USER, selectOwnUserReviews); return params; }

php
我的<?php require('file.php'); $ReviewID = $_POST['reviewiduser']; $results = array(); foreach($ReviewIDs as $ReviewID) { $sql2 = "SELECT * FROM review WHERE review_id = ?"; $stmt2 = $con->prepare($sql2) or die(mysqli_error($con)); $stmt2->bind_param('i', $ReviewID) or die ("MySQLi-stmt binding failed ".$stmt2->error); $stmt2->execute() or die ("MySQLi-stmt execute failed ".$stmt2->error); $result2 = $stmt2->get_result(); //if user_id has reviews in the db while($row = mysqli_fetch_array($result2)) { //make an array called $results $results[] = array( 'category' => $row['cat_name'], 'name' => $row['name'], 'phone' => $row['phone'], 'comment' => $row['comment'], 'reviewid' => $row['review_id'], ); } } $json = json_encode($results); echo $json; ?> 代码中的

Line 13是:

php

4 个答案:

答案 0 :(得分:4)

不同的变量名称!

$ReviewID = $_POST['reviewiduser']; //without final s
foreach($ReviewIDs as $ReviewID) {  //with final s.
/*               ^    */

编辑: 你说你还有问题。 可能你的$ _POST是一个字符串。试试:

$reviewIDs = json_decode($_POST['reviewiduser']);

这可能会使$ reviewID成为与foreach合作的正确数组。

答案 1 :(得分:2)

使用Android Volley发布到您的php b / c时,您收到foreach错误所有输入值都是PHP中的字符串,而您不能foreach字符串。

您可能首先想要将字符串解码为数组,然后您可以foreach结束。但是,如果你的意图是否有意,我的问题并不清楚,所以我不能非常具体地说明我的回答,只提供这个作为一般提示。解码JSON通常很常见,但在您的情况下请不要这样:http://php.net/json_decode

除此之外还要注意你实际上正在使用正确的变量,正如其他人指出的那样,我需要使用正确编写的变量名称,即使一个字符关闭也会给你一个不同的变量名称将在PHP中评估为NULL,您可以{&#t;} foreach以及与字符串一样。

答案 2 :(得分:0)

我作为JavaPhp发布到string,并在php中将其视为array

Java我发布的selectOwnUserReviews格式为"[1,34,78]"。它看起来像array,但都被视为一个单位。即使我在php尝试了操作,我也会在[134以及78]上进行操作,而不是134和{ {1}}。

所以我在78做了:

Java

现在我有了字符串//convert [56,23,87] to a string selectOwnUserReviews = Arrays.toString(category.getUserReviewIds()); //remove [ and ] so we have a string of 56,23,87 selectOwnUserReviews = selectOwnUserReviews.substring(1,selectOwnUserReviews.length()-1); ,并将此56,23,87发布到我的string。在我的php我使用php获取单个值,我的完整代码如下:

explode

完成工作。

答案 3 :(得分:0)

扩展其他答案,并根据评论提供更完整的答案。

如您所述,var_dump($_POST)会产生以下结果:

array(1) {
  ["reviewiduser"]=>
  string(4) "[63]"
}

意味着您的帖子值是以4个字符的字符串形式接收的,格式为数组。而不是所需的整数数组。但是,您可以对值使用json_decode将字符串解析为所需的整数数组。

示例:https://3v4l.org/64v30

由于我们永远不应该信任来自最终用户的数据,尤其是跨平台/站点的数据,因此您应该在处理数据之前对其进行清理和验证。

此外,您可以混合使用mysqli的过程和面向对象,以及mysql可以返回falsenull的缺失控件。最好只使用一种风格来确保您的代码具有凝聚力/连贯性。除了涵盖函数/方法调用可能返回所需值以外的所有情况外,还可以更好地预测所需的行为或失败。

<?php

require __DIR__ . '/file.php';

//ensure the desired post key exists otherwise set a default value
if (!array_key_exists('reviewiduser', $_POST)) {
    $_POST['reviewiduser'] = '[]';
}

//ensure json decode returns as the desired data type
$ReviewIDs = json_decode($_POST['reviewiduser']);
if (!is_array($ReviewIDs)) {
   $ReviewIDs = [];
}

//declare results for use with json_encode
$results = [];

//declare ReviewID as a variable for use with bind_param
$ReviewID = null;

//prepare the database query for multiple executions
$sql2 = 'SELECT cat_name AS category, name, phone, comment, review_id AS reviewid FROM review WHERE review_id = ?';

//create a statement for use with prepare
$stmt2 = $con->stmt_init();
$stmt2->prepare($sql2) or die($con->error);

//bind ReviewID by reference so that it changes for each execute iteration
$stmt2->bind_param('i', $ReviewID) or die ('MySQLi-stmt binding failed ' . $stmt2->error);

//iterate over ReviewIDs
foreach ($ReviewIDs as $ReviewID) {
    //validate the value is of the desired type
    if (!is_numeric($ReviewID)) {
       continue;
    }
    $stmt2->execute() or die ('MySQLi-stmt execute failed ' . $stmt2->error);
    $result2 = $stmt2->get_result() or die('MySQLi-smt get_result failed' . $smt2->error);

    //ensure a result is retrieved from the database
    if ($row = $result2->fetch_assoc()) {
        $results[] = $row;
    }
}
$stmt2->close();

echo json_encode($results);
exit;