簡體   English   中英

PHP中編碼數組的問題

[英]Problems with encoded array in php

我在解析包含數組的get變量並使用jquery ajax發送它時遇到問題。

我發送的數組如下所示

ids%5B%5D   1403172219
ids%5B%5D   1530542001
ids%5B%5D   1582588379

但是當我嘗試轉儲( $_GET['ids] )時,我得到的是空值,我將$_GET孔比看起來小

ids%5B%5D] => 1530542001 

JQuery的

function update_category(selected) {
    console.log(cids);
    $.ajax({
        url: '/admin/',
        type: 'GET',
        dataType: "application/JSON",
        data: {
            ids: cids,
            s_category: selected,
            controller: 'products',
            traditional: true,
            action: 'update_category'
        },
        success: function(data) {
            addAlert('alert-'+data, data);
        },
        error: function(data) {
            addAlert('alert-'+data.responseText, data.responseText);
        }
    });

調節器

  protected function update_category() {
        print_r($_GET);
        $cat_ids = $_GET['ids'];
        $category = $_GET['s_category'];       
        if(!empty($cat_ids) && !empty($category)){
            $this->model->updateCategory($cat_ids, $category);
        } else {
            echo 'Fähler in der Daten übergabe!';
            exit();
        }              
    }
}

在本地主機上,我使用PHP 5.4,在Live Server ubuntu PHP 5.3.10上我沒有遇到任何問題,錯誤仍然存​​在

本地主機上的正確輸出

Array ( 
[ids] => Array (
    [0] => B6Q09EA#ABD 
    [1] => H4P04EA#ABD 
    ) 
[s_category] => 4
[controller] => products 
[traditional] => true 
[action] => update_category 
) 

ID的建立像

cids = [];
jQuery.each(sData, function(key, value) {
       cids.push(value.value);
});

您的實時服務器可能是啟用IPv6的主機。 這意味着[] (或%5B%5D )是保留字符。 應用於您的字符串化請求字符串的encodeURI不會,或者不能正確編碼這些字符,就像&=未被編碼一樣。
我認為這里的問題是您已在服務器上安裝的PHP版本(或suhosin)。 我是根據此錯誤報告做出此假設的,其中一個答復指出以下內容:

我剛剛從PHP 5.3(帶有suhosin 0.9.33)更新到PHP 5.5(沒有suhosin),這解決了這個問題。 我猜想suhosin中的一些安全問題可能是導致我出現旋轉圖標問題的原因。

我可以切換回PHP 5.3並刪除suhosin模塊以進一步研究此問題,但我認為公眾利益可能不會太高,因為我似乎是唯一報告此問題的案例。 :-)

驗證您的服務器是否已安裝suhosin,並在兩台服務器上檢查phpinfo() ,這應該可以對其進行修復。
或者,您可以選擇為此使用jQuery,並編寫自己的XMLHttpRequest ,並添加一個encodeURI(stringifiedObject).replace(/%5B/g, '[').replace(/%5D/g,']'); 在發送數據之前。

有關IPv6的更多詳細信息: 關於MDN

如果您不願意放棄jQ,則臨時的解決方法/修復可能是修復請求服務器端:

$post = http_get_request_body();//requires http extension
$post = str_replace(
    array('%5B', %5D'),
    array('[',']'),
    $post;
);

然后使用parse_str ,可以構造$_POST數組:

parse_str($post, $_POST);

那應該為您提供所需的陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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