通过 extraParams 将数组传递给商店只给出 ExtJS 中的最后一个值

Passing an array via extraParams to a store only gives the last value in ExtJS

我正在构建一个 Web 应用程序,其中有一部分需要从给定一组 ID 的商店加载记录。我解决这个问题的方法是获取所有 ID,将它们存储在一个数组中,然后使用该数组作为额外参数加载存储。

这是我的代码:

for(var i = 0 ; i < store.count() ; i++){
    console.log("id person = " + store.getAt(i).get("ID_PERSON"));
    idArray.push(store.getAt(i).get("ID_PERSON"));
}

console.log("id array = " + idArray);

store = Ext.getStore('borrowerListStore');

store.getProxy().extraParams={
    idArray: idArray
};

store.load({
    callback: function(records, operation, success) {

        var total = operation.request.scope.reader.jsonData['total'];
        var message = operation.request.scope.reader.jsonData['message'];

        console.log("message  = " + message);
    }

});

首先,我遍历我的初始存储,然后获取所有 ID 并将它们存储在一个数组中。之后,我声明我的商店,我得到代理,我设置参数,然后我使用我组装的 idArray 作为数组。

控制台行向我显示了正确的值,例如 77, 24, 80,所以我知道我传递了 3 个值。

然后在我商店的 read 方法中链接的 PHP 代码中,我这样做:

else if(isset($_GET['idArray'])){

    $idArray = $_GET['idArray'];

    $array = $idArray;

    for($i = 0 ; $i < count($idArray) ; $i++){
        array_push($array, $idArray[$i]);
    }

    $sql = "SELECT * FROM TABLE WHERE ID IN(".implode(',',$array).")";

$result = mysql_query($sql);    

    $res->message .= " Loaded data ";
    $res->message .= " sql = " . $sql;
    $res->message .= " idArray = " . $idArray;
    $res->message .= " array = " . $array;

    $total = mysql_fetch_array($totalquery);
}

这样当商店加载并且我进入回调函数时,我可以看到返回的消息。

但是,当我发出消息时,在我看来,只有最后一个数组元素是我的 PHP 收到的唯一内容,因为日志看起来像:

message  =  Message start  Loaded data  sql = SELECT * FROM TABLE WHERE ID IN() idArray = 80 array = 80

这里发生了什么?为什么我似乎不能将数组作为额外参数传递?

嘿,尝试更改此行

array_push($array, $idArray[$i]);

$array[] = $idArray[$i];

首先,我不确定你是否真的想将数组作为GET参数传输。如果数组变大,你 运行 变成最大 URL 长度问题。我肯定会推荐使用 POST 并将 JSON 传输到服务器。

ExtJS 4.2.2 将数组正确发送到服务器,我已经检查过 fiddle 这不是问题所在。

但我不确定 PHP 是否理解发送的格式。好像当我调用test.php?x=1&x=2时,$_GET['x']不是一个数组[1,2],而只是一个数字2。不过,我不确定为什么我没有研究 PHP 代码。作为快速破解,您可以使用

store.getProxy().extraParams={
    idArray: idArray.join(',')
};

在客户端将 id 作为字符串而不是数组传输,并使用

将该字符串解码回 id
$array = array_map("intval",explode(",",$_GET['idArray']));

在服务器端。 (如果不使用 intval 并且在 SQL 查询中使用未经任何检查的字符串,则容易受到 SQL 注入攻击。)