2013-04-21 2 views
12

Я переношу свои коды PHP с mysql (устарел в 5.5) на PDO_MySQL. Однако mysql_fetch_row возвращает целое число, а PDOStatement::fetch возвращает строки для чисел. Как я могу заставить PDO вести себя так же, как и предыдущий?Почему PDO_MySQL не возвращает целое число?

Результат mysql_fetch_row:

array(1) { 
    ["id"]=> 
    int(1) 
} 

Результат PDOStatement::fetch:

array(1) { 
    ["id"]=> 
    string(1) "1" 
} 

ответ

13

Установите PDO::ATTR_EMULATE_PREPARES ложь, если вам действительно нужно его свободно типизированных PHP

If mysql_fetch_row возвращает вас Int для SUM тоже (я никогда не заботился о проверке) - тогда он делает какую-то магию, как if (ctype_digit($val)) $row[$key] = (int)$val; - так что y ou может сделать в вашем DBAL

Насколько я понимаю, как работает подготовленные операторы, он использует ту же структуру пакета для отправки и получения данных, и этот пакет содержит тип данных.

Похоже, что этот сервер может возвращать данные в 2 форматах - native и mysqlnd, зависит от типа запроса. Последний может быть интерпретирован библиотекой-клиентом для выдачи результирующего значения.

+0

Он работает в большинстве случаев, но не работает для 'SELECT SUM (...' Кроме того, как указывает его название, будут ли преимущества подготовленных заявлений недействительными с этой опцией? – Haocheng

+0

Тому, кто читает этот ответ в будущем: 1) Нет, он не ошибся в вопросе. 2) Да, это фактически изменяет тип данных возвращаемых значений. –

+0

@Haocheng Внимательно прочитайте это предложение, это двойное отрицательное;) –

5

Для записей, PDO предоставляет функцию, которая будет изменять это, PDO::ATTR_STRINGIFY_FETCHES:

Преобразование числовых значений строк при выборке. Требуется bool.

Основанием для установки является то, что двигатели базы данных могут обрабатывать очень большие числа (Oracle, например, допускает 38-значное число), а PHP не может. Получение этих чисел в виде строк - это метод, обеспечивающий безопасность и предотвращение потери данных.

Unluckily, the MySQL driver does not support it:.

<?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" 
} 
+0

Мне нравится часть ответа, хотя, если я правильно ее видел, MySQL PDO не поддерживает 'PDO :: ATTR_STRINGIFY_FETCHES', поскольку _everything_ возвращается как тип данных' string' уже , что означает, что этот атрибут довольно бесполезен с этим драйвером. – Jon

+0

@Jon - Вы правы, я только что нашел его сам. Я обновил свой ответ. –

Смежные вопросы