Николай Ланец
21 мая 2017 г., 20:41

Заставляем SQL-запросы возвращать цифры, а не только строки

Интересный момент сегодня заметил... Сформировал Ajax-запрос, получил от сервера JSON-ответ, пытаюсь его использовать в своих целях, но возникает проблемка... Там, где должны были числовые значения быть, на самом деле сидят обычные строки. Пример:

В javascript это очень важно, так как он более типизированный язык, чем php, и от типа данных и результат при сравнении может отличаться, и переменные разные методы будут иметь.

Я сначала подумал, что это у меня процессор не правильно обрабатывает данные и переводит числовые значения в строки, но оказалось, что это сам PDO так делает (при чем именно PDO, а не xPDO).
Это легко проверить, выполнив в консоли простой запрос:
$q = $modx->newQuery("modResource"); $q->select(array( "id", )); $q->limit(1); $s = $q->prepare(); $s->execute(); var_dump($s->fetch(2));
На выходе я получаю вот такой результат:
array(1) { ["id"]=> string(1) "1" }
То есть id содержит строку, а не число.

Решение нашлось такое:
$modx->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Если выполнить его перед выполнением запроса, то данные приходят в нормальном виде.
array(1) { ["id"]=> int(1) }
Если кому такое тоже понадобится, и чтобы это заработало на всем сайте, можно в плагине на OnMODXInit прописать эту строчку, а можно в каком-нибудь своем компоненте в metadata.mysql.php прописать
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


Я обычно перепроверяю любое числовое значение уже на javascript: parseint()
Тоже верно, но вот это тоже на всякий случай учту для себя.

Добавить комментарий