通过 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 注入攻击。)
我正在构建一个 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 注入攻击。)