Добрый день, я создаю веб-приложение, и есть часть, где мне нужно загружать записи из магазина с учетом набора идентификаторов. Я пошел по этому пути, чтобы получить все идентификаторы, сохранить их в массиве, а затем загрузить хранилище с этим массивом в качестве дополнительного параметра. Вот мой код:
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);
}
});
Сначала я иду в свой первоначальный магазин, затем получаю все идентификаторы и сохраняю их в массиве. После этого я объявляю свой магазин, я получаю прокси, я устанавливаю параметры, а затем использую собранный мной массив IDArray в качестве массива.
Строка консоли показывает мне правильные значения, например 77, 24, 80
так что я знаю, что я передал 3 значения.
Затем в моем PHP-коде, связанном в read
метод моего магазина, я делаю это:
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
Что тут происходит? Почему я не могу передать массив в качестве дополнительного параметра?
Прежде всего, я не уверен, действительно ли вы хотите передавать массивы как параметры GET. Если массивы становятся больше, вы сталкиваетесь с проблемами максимальной длины URL. Я определенно рекомендую использовать POST и передавать JSON на сервер.
ExtJS 4.2.2 отправляет массив на сервер правильно, я проверил в скрипке, что это не может быть проблемой.
Но я не уверен, понимает ли PHP формат, в котором он отправлен. Кажется как будто когда я звоню test.php?x=1&x=2
, $_GET['x']
это не массив [1,2]
, но только номер 2
, Я не уверен, почему, однако, я не изучал код PHP. В качестве быстрого взлома вы можете использовать
store.getProxy().extraParams={
idArray: idArray.join(',')
};
на стороне клиента передать идентификаторы в виде строки вместо массива и декодировать эту строку обратно в идентификаторы с помощью
$array = array_map("intval",explode(",",$_GET['idArray']));
на стороне сервера. (Если вы не используете intval
и использовать строку без какой-либо проверки в запросе SQL, вы подвержены атакам внедрения SQL.)
эй попробуй изменить эту строку
array_push($array, $idArray[$i]);
в
$array[] = $idArray[$i];