簡體   English   中英

PHP JSON解析給出錯誤

[英]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));

甚至更好:使用准備好的參數化查詢,參見例如PDO - 准備好的語句和存儲過程

聽起來$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM