【问题标题】:JSON to PHP, then foreach?JSON到PHP,然后foreach?
【发布时间】:2011-01-05 14:46:29
【问题描述】:

我从 jQueryscript 向我的 PHP 页面发送了一个有效的 JSON 字符串:

var data = '{
 "data":[
  {
   "id":"12",
   "checked":"true"
  },{
   "id":"4",
   "checked":"false"
  },{
   "id":"33",
   "checked":"false"
  }
 ]
}';


$.post ("page.php", { data_input:data }, function (data) {
 // code
});

在我的 PHP 页面中获取数据后,我使用json_decode 方法对其进行解析,然后尝试在为PDO 查询创建的foreach 语句中使用它:

<?php

$data_input = json_decode ($_REQUEST['data_input'], true);

$sql = "UPDATE my_table SET user_enabled = :checked WHERE node_prop_id = :id";
$stmt = $dns->prepare ($sql);

foreach ($data_input as $data) {
 $ok = $stmt->execute ($data);
 $num = $stmt->rowCount ();
} 
if ($ok) return 1;
else return 0;

?>

这会返回错误:

PHP 警告:在第 XX 行的 /home/.../page.php 中为 foreach() 提供了无效参数

我能否找到在foreach 语句中使用我的 JSON 数据的方法?

【问题讨论】:

  • 您是否检查过 $_REQUEST['data'] 字符串不包含转义字符?如果确实如此(而且他们经常这样做),我敢打赌 json_decode 无法对其进行解码,并返回 null。您可以使用 stripslashes($string) 摆脱它们

标签: php jquery mysql json pdo


【解决方案1】:

返回值

以适当的 PHP 类型返回以 json 编码的值。值 true、false 和 null(不区分大小写)分别返回为 TRUE、FALSE 和 NULL。如果无法解码 json 或编码数据深度超过递归限制,则返回 NULL。

虽然在你的情况下,它应该是。我赌的是解码错误。

编辑: Victor Nicollet 发现了实际错误。用 json_last_error 多做些检查还是不错的!

【讨论】:

  • 奇怪,我有 json 库但没有方法 json_last_error 返回缺少函数错误
  • 你能用 print_r 做一个 $_REQUEST["data_input"] 的测试输出并发布结果吗?
【解决方案2】:

您将 $_REQUEST['data'] 视为 JSON 字符串,但情况并非总是如此(如果我愿意,我可以发送带有无效值的请求),它也不总是代表一个 JSON 字符串数组或字典。您需要事先检查,如果不是,请做出相应的反应。

现在,针对您的实际错误。你写道:

 $.post (page.php, { data_input:data }, function (data) {
   // code
 });

这将是一个错误,因为page.php 没有被引用。但即使假设它在您的实际代码中,服务器端的数据也会存储在$_POST['data_input'],而不是$_POST['data']

【讨论】:

  • 对不起,它们只是复制/粘贴错误(我已经简化了代码),我已经修复了它们
【解决方案3】:

我发现了问题:

<?php

// I've changed $data to $json for more clarity
$json = json_decode (stripslashes ($_REQUEST['json_string']), true); // added stripslashes method for more debug, but i think it still works without
$json = $json["data"]; // this was the problem

$sql = "UPDATE my_table SET user_enabled = :checked WHERE node_prop_id = :id";
$stmt = $dns->prepare ($sql);

foreach ($json as $value) {
    $ok = $stmt->execute ($value);
    $num = $stmt->rowCount ();
} 
if ($ok) return 1;
else return 0;

?>

【讨论】:

  • 昨天一位用户给出了正确答案,但已将其删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多