JSON в PHP, тогда foreach? - PullRequest
       24

JSON в PHP, тогда foreach?

1 голос
/ 15 января 2010

Я отправляю допустимую строку JSON на мою страницу PHP из jQueryscript:

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, а затем пытаюсь использовать их в операторе foreach, созданном для запроса PDO:

<?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: неверный аргумент указан для foreach () в /home/.../page.php в строке XX

Могу ли я найти способ использовать мои данные JSON в операторе foreach?

Ответы [ 3 ]

1 голос
/ 15 января 2010

Вы рассматриваете $_REQUEST['data'], как если бы это была строка JSON, что не всегда так (я мог бы отправить запрос с недопустимым значением, если бы захотел), и при этом это не всегда будет строка JSON, представляющая массив или словарь. Вам нужно будет заранее проверить и соответственно отреагировать, если это не так.

Теперь, для вашей реальной ошибки. Вы написали:

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

Это было бы ошибкой, поскольку page.php не заключено в кавычки. Но даже если предположить, что это в вашем реальном коде, на стороне сервера данные будут храниться в $_POST['data_input'], а не $_POST['data'].

1 голос
/ 16 января 2010

Я нашел проблему:

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

?>
1 голос
/ 15 января 2010

Возвращаемое значение

Возвращает значение, закодированное в json в соответствующем типе PHP. Значения true, false и null (без учета регистра) возвращаются как TRUE, FALSE и NULL соответственно. NULL возвращается, если json не может быть декодирован или если закодированные данные глубже, чем предел рекурсии.

хотя в вашем случае так и должно быть. Я делаю ставку на ошибку декодирования.

Редактировать: Виктор Николетт обнаружил фактическую ошибку. Все еще хорошо использовать json_last_error и сделать еще несколько проверок!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...