ExtJS — Передача массива через extraParams в хранилище дает только последнее значение?

Добрый день, я создаю веб-приложение, и есть часть, где мне нужно загружать записи из магазина с учетом набора идентификаторов. Я пошел по этому пути, чтобы получить все идентификаторы, сохранить их в массиве, а затем загрузить хранилище с этим массивом в качестве дополнительного параметра. Вот мой код:

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

Что тут происходит? Почему я не могу передать массив в качестве дополнительного параметра?

1

Решение

Прежде всего, я не уверен, действительно ли вы хотите передавать массивы как параметры 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.)

1

Другие решения

эй попробуй изменить эту строку

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

в

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

По вопросам рекламы [email protected]