[英]PHP JSON parsing giving an error
我正在嘗試使用PHP解析JSON字符串,JSON以這種格式使用jQuery $.ajax
發送到PHP文件, [{"value":"59"},{"value":"7"},{"value":"46"}]
,但由於一些奇怪的原因,我不斷收到此錯誤"Invalid argument supplied for foreach()"
,這是我的PHP和jQuery代碼,
jQuery的:
$(".systems").each( function(i, system) {
// for each location block
system = $(system);
var sys = {
'value' : $("select[data-prod='products']", system).val()
};
allSystems.push( sys );
});
$.ajax({
type: 'POST',
url: 'systems.php',
dataType: 'json',
data: { systems: JSON.stringify(allSystems), uid: uid },
success: function(data){
alert(data)
}
});
PHP:
require_once 'classes/Zend/Json.php';
$json = $_POST['systems'];
$uid = $_POST['uid'];
$array= Zend_Json::decode("$json");
mysql_connect('localhost','user','pass') or die(mysql_error());
mysql_select_db('products') or die(mysql_error());
//insert the suppliers products into the database
foreach($array as $key){
$query = mysql_query("INSERT INTO suppliersProducts (product_id, supplier_id) VALUES('".$key['value']."', '".$uid."' ) ") or die(mysql_error());
}
print_r($json);
正如您所看到的,我正在使用Zend框架的JSON解碼函數來解碼傳遞給PHP的JSON字符串,並且該格式對我來說似乎是正確的,所以我不知道它可能導致此錯誤,也許編碼? 有任何想法嗎?
Thanx提前!
看起來json_decode()無法處理該post參數中的數據。 在腳本中添加一些錯誤處理。
$test = json_decode($json, true);
if ( is_null($test) ) {
die('data is not encoded as valid json');
}
else if ( !is_array($test) ) {
die('Unexpected data structure. Array expected.');
}
您可能也對json_last_error()感興趣
更新:也許這是一個編碼問題。 由於您無權訪問json_last_error(),因此您可能需要“手動”檢查字符串和編碼,例如
if ( is_null($test) ) {
// <--- for debugging purposes only
echo '<pre>Debug: $json=';
var_dump($json);
echo 'hex=';
for($i=0; $i<strlen($json); $i++) {
printf('%02X ', ord($json[$i]));
}
echo '</pre>';
// for debugging purposes only -->
die('data is not encoded as valid json');
在將值作為字符串文字混合到sql語句中時,還必須使用mysql_real_escape_string() ,請參閱CWE-89:SQL命令中使用的特殊元素的不正確中和('SQL注入')
$mysql = mysql_connect('localhost','user','password') or die(mysql_error());
mysql_select_db('products', $mysql) or die(mysql_error($mysql));
...
$sql = "
INSERT INTO
suppliersProducts
(product_id, supplier_id)
VALUES
(
'" . mysql_real_escape_string($key['value'], $mysql) . "'
, '" . mysql_real_escape_string($uid, $mysql) . "'
)
";
$query = mysql_query($sql, $mysql) or die(mysql_error($mysql));
聽起來$test
在你的其他服務器上並不是一個真正的數組,所以json_decode
可能沒有返回一個數組。 json_decode
甚至可以在該服務器上使用嗎? 它僅在php 5.2.0之后可用。 查看phpinfo()
了解版本詳細信息。
將error_reporting(E_ALL)
和ini_set('display_errors', 1)
在頂部,以便在foreach之前看到任何錯誤。
由於foreach()
僅適用於Arrays,因此在調用foreach()
之前,應該使用is_array($test)
檢查是否從json獲取了一個數組。
當我在$ json上執行var_dump時,我得到這個字符串(19)“[{\\”value \\“:\\”6 \\“}]”
看起來像magic_quotes_gpc一樣。 實際的json編碼字符串將是[{"value":"6"}]
但是由於可怕的魔術引號,所有雙引號都被\\“替換為”,這使得它對json_decode()無效。你可以使用stripslashes( )“扭轉損害”。
$json = get_magic_quotes_gpc()
? stripslashes($_POST['systems']) : $_POST['systems'];
檢查$ test和$ json的值。 $ json似乎不是注釋中所述的JSON-Array,因此$ test不會成為PHP數組。
在foreach循環中使用它之前,應檢查$ test是否為數組。
if(is_array($test)) {
// proceed..
}
只需更改以下內容:
$json = $_POST['systems'];
$uid = $_POST['uid'];
$test = json_decode($json, true);
至
$json = !empty($_POST['systems']) ? json_decode($_POST['systems'], true) : array();
$json = is_array($json) ? $json : array();
$uid = $_POST['uid'];
foreach($json as $key => $value)
{
//Less error prone.
}
正如其他人所說的那樣,如果你嘗試將它與一個不是數組或根本沒有設置的變量一起使用,foreach()將拋出此錯誤,所以如果可能發生這種情況,你應該在之前檢查is_array() foreach循環。
但是我想發布一個答案,指出你看到的消息只是PHP中的警告級別消息。 換句話說,遇到此錯誤后,程序將繼續工作(它將跳過foreach()循環並繼續執行)。 此外,可以使用PHP.ini設置PHP以禁止顯示警告消息(或實際上任何其他錯誤消息)。 因此,可能(例如,如果您對系統進行了更改,或者如果您在不同的系統上運行程序),您可能一直有錯誤,但之前從未見過它。
在通過Zend_Json::decode()
之前,您是否檢查了字符串的編碼? 這是一個常見的問題 - 如果您強制格式化,例如,utf8(通過utf8_encode()
)它可能適合您。
您可能嘗試的一件事是當您在.each循環中聲明系統時,將值包裝在引號中。 像這樣的東西:
var sys = {
'value' : "'" + $("select[data-prod='products']", system).val() + "'"
};
PHP解析器可能要求值在引號中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.