Я переношу свои коды PHP из mysql
(устарел в 5.5) на PDO_MySQL
. Однако mysql_fetch_row
возвращает целое число, в то время как PDOStatement::fetch
возвращает строки для чисел. Как я могу заставить PDO вести себя так же, как и предыдущий?
Результат mysql_fetch_row
:
array(1) { ["id"]=> int(1) }
Результат PDOStatement::fetch
:
array(1) { ["id"]=> string(1) "1" }
Установите PDO::ATTR_EMULATE_PREPARES
на значение false, если вам действительно нужно это с помощью слабо типизированного PHP
Если mysql_fetch_row
возвращает значение int для SUM (мне никогда не приходилось проверять) – тогда он делает некоторую магию, как if (ctype_digit($val)) $row[$key] = (int)$val;
– так что вы можете сделать в своем DBAL
Насколько я понимаю, как работает подготовленные операторы, он использует ту же структуру пакетов для отправки и получения данных, и этот пакет содержит тип данных.
Похоже, что этот сервер может возвращать данные в 2 форматах – native и mysqlnd, зависит от типа запроса. Последний может быть интерпретирован библиотекой-клиентом для выдачи результирующего значения.
Для записей PDO предоставляет функцию, которая изменила бы это, PDO::ATTR_STRINGIFY_FETCHES
:
Преобразование числовых значений в строки при извлечении. Требуется
bool
.
Обоснованием настройки является то, что двигатели базы данных могут обрабатывать очень большие числа (например, Oracle, например, 38-значные числа), а PHP не может. Получение этих чисел в виде строк – это метод, обеспечивающий безопасность и предотвращение потери данных.
К несчастью, драйвер MySQL не поддерживает его :
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); $sql = 'SELECT 1 AS integer_number, 3.14 AS floating_point'; $res = $pdo->query($sql); while($row = $res->fetch(PDO::FETCH_ASSOC)){ var_dump($row); }
array(2) { ["integer_number"]=> string(1) "1" ["floating_point"]=> string(4) "3.14" }