在我的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
答案 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)
我作为Java
从Php
发布到string
,并在php
中将其视为array
。
在Java
我发布的selectOwnUserReviews
格式为"[1,34,78]"
。它看起来像array
,但都被视为一个单位。即使我在php
尝试了操作,我也会在[1
和34
以及78]
上进行操作,而不是1
和34
和{ {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
将字符串解析为所需的整数数组。
由于我们永远不应该信任来自最终用户的数据,尤其是跨平台/站点的数据,因此您应该在处理数据之前对其进行清理和验证。
此外,您可以混合使用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;