为什么我在用Android截图发布到我的php时会出现foreach错误?
在我的Android应用程序中,我使用为什么我在用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
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;