Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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
为什么我在用Android截图发布到我的php时会出现foreach错误?_Php_Foreach_Android Volley - Fatal编程技术网

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

为什么我在用Android截图发布到我的php时会出现foreach错误?,php,foreach,android-volley,Php,Foreach,Android Volley,在我的Android应用程序中,我使用volley来echo我的response,其形式如下: [ { "category":"whatever", "name":"whatever", "phone":"whatever", "comment":"whatever", "reviewid":32 }, { "category":"whatever", "nam

在我的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
数组
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
代码中的
第13行是:

foreach($ReviewIDs as $ReviewID) {

不同的变量名

$ReviewID = $_POST['reviewiduser']; //without final s
foreach($ReviewIDs as $ReviewID) {  //with final s.
/*               ^    */
编辑: 你说你仍然有问题。 可能您的$\帖子是一个字符串。尝试:

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

这可能会使$reviewIDs成为使用foreach的合适数组。

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

您可能首先要将字符串解码成一个数组,然后可以
foreach
over。但是,如果这是由你或不是不清楚,我从你的问题,所以我不能非常具体的w/我的答案,这只是一个一般性的提示。解码JSON通常很常见,但请注意,在您的案例中不能是这种情况:


除此之外,还要注意使用正确的变量,正如其他人所指出的,我也支持他们,你需要使用正确的变量名,即使去掉一个字符,也会给你一个不同的变量名,它在PHP中的计算结果也会为NULL,你不能像处理字符串一样处理它。

我从
Java
发布到
PHP
作为
字符串
并在
PHP
中将它当作
数组处理

Java
中,我发布了
selectOwnUserReviews
,其格式类似于
“[1,34,78]”
。它看起来像一个
数组
,但都被视为一个单元。即使我在
php
中尝试操作,我也是在
[1
34
78]
上进行的,而不是在
1
34
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
获取各个值,我的完整代码如下所示:

<?php
    require('file.php');

    $ReviewID = $_POST['reviewiduser'];

    $ReviewID = explode(",",$ReviewID);

    $results = array();

    foreach($ReviewID 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();

        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'],
            );
        }
    }

        echo json_encode($results);

?>


工作完成。

展开其他答案,并根据评论给出更完整的回答

正如您所指出的,
var\u dump($\u POST)
会产生以下结果:

array(1) {
  ["reviewiduser"]=>
  string(4) "[63]"
}
这意味着您的post值将作为一个由4个字符组成的字符串接收,格式为数组。而不是所需的整数数组。但是,您可以使用该值将字符串解析为所需的整数数组

例如:

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

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

<?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;

$ReviewID=$\u POST['reviewiduser']vs
$ReviewIDs=$\u POST['reviewiduser']也可以将prepare移出foreach,因为参数正在更改并在其中执行
给我同样的错误消息。
var\u dump($ReviewID)
并发布输出。提示:您可以直接使用
echo json\u encode($results)
,而无需将其存储在变量中。
string(4)
(12)
是字符串中的字符数。话虽如此,您还是希望使用这个:
$ReviewIDs=json\u decode($\u POST['reviewiduser'])如Damian的回答所示,即使在这里,您仍然无法使用w/PHP;foreach字符串。)那么您的$u帖子可能是一个字符串。Try:$reviewIDs=json_decode($_POST['reviewiduser']);是的,我会调查的。我希望我不用JSON也能做到,因为它看起来很简单,只是尝试发布3,56,34之类的值,但是如果它都被当作字符串处理,那么可能需要JSON
可以做到这一点,但在某种程度上,依赖JSON会更容易,因为它在两端都得到了很好的支持,您不需要自己滚动所有代码。感谢您的回答,我们将寻找特定的解决方案,并在完成后发布。
<?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;