Как получить числовые типы из MySQL с помощью PDO?



Я использую PDO и MySQL, по какой-то причине при получении значений из базы данных, которые являются типом int, PDOStatement возвращает строковое представление числа, а не значение числового типа. Как мне предотвратить это?



Я заметил, что есть атрибут класса PDO:PDO::ATTR_STRINGIFY_FETCHES Это должно позаботиться об этом, но при попытке изменить его, он выдает ошибку, говоря, что атрибут не является допустимым для драйвера MySQL.



это нормально получить строки вместо чисел при консультации с базой данных?

548   4  

4 ответов:

Я не думаю, что "цифры" может быть сделано в PHP 5.2 : - (

в PHP 5.3, это становится возможным, если я правильно помню, когда вы используете новый (Новый как в PHP >= 5.3) mysql nd(MySQL Native Driver) драйвер.

Ну, после большего копания в моих закладках я нашел эту статью о mysqlnd:PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Он говорит, что это (цитата) :

преимущества использования mysqlnd для PDO

mysqlnd возвращает собственные типы данных, когда использование подготовленных операторов на стороне сервера, например, возвращается столбец INT как целочисленная переменная, а не как строка. Это означает, что меньше данных внутренние преобразования.

но это только PHP 5.3 (при условии, что ваша версия PHP 5.3 скомпилирована с mysqlnd (а не старый libmysql)), и, кажется, только в случае подготовленных заявлений : - (

извините...

решение было бы иметь, на PHP-стороне, систему отображения (как ОРМ -- см. доктрина; просто как пример ORM : я не знаю, делает ли он то, что вы просите) для преобразования результатов, поступающих из БД в типы данных PHP...

и да, это плохо, если вы хотите использовать операторы, такие как === и !==, которые чувствительны к типу...

чтобы ответить на ваш последний вопрос сначала, "да", к сожалению, это нормально, чтобы получать числа в виде строк. Как говорится в руководстве, приведенном Паскалем, mysqlnd (PHP 5.3) вернет собственные типы данных из подготовленных операторов, если вы отключите эмуляцию подготовленного оператора из PDO.

new PDO($dsn, $user, $pass, array(
    PDO::ATTR_EMULATE_PREPARES => false
))

PDO:: ATTR_STRINGIFY_FETCHES не имеет отношения к MySQL.

Если вы посмотрите на яркой стороне, это хорошая практика, чтобы использовать подготовленные операторы, так... ;)

Паскаль является правильным. У меня были некоторые проблемы с тем, чтобы все это работало. Вот что вам нужно сделать.

во-первых, убедитесь, что у вас установлен и активирован mysqlnd. Посмотри на php --info. В разделе pdo_mysql он должен выглядеть так:

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321

если вместо mysqlnd в версии API клиента, вы видите строку, как...

Client API version => 5.5.29

...тогда у вас нет mysqlnd установлен и собирается. Позаботься об этом первый.

во-вторых, PDO использует эмулированные подготовленные операторы по умолчанию для всех MySQL подключения. Смешно, но это так. И вы получите собственные типы данных только в том случае, если вы используете реальные подготовленные операторы (называемые "подготовленные операторы на стороне сервера" в связанном блоге, который теперь здесь). Поэтому вы должны установить PDO:: ATTR_EMULATE_PREPARES в false, например:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

наконец, убедитесь, что вы не установили PDO::ATTR_STRINGIFY_FETCHES в истинный.

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

и mysqlnd установлено, но это не значит, что он готов к использованию обычной PDO расширение (pdo_mysql), это чаще всего происходит на общем хостинге, поэтому не забудьте включить

Comments

    Ничего не найдено.