2009-07-28 4 views
53

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

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

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

ответ

37

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

В PHP 5.3, это становится возможным, если я правильно помню, когда вы используете новый (новый как в PHP> = 5.3) MySQL й (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 - см. Doctrine; как пример ORM: я не знаю, что вы просите) для преобразования результатов, полученных из баз данных DB в PHP ...

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

+7

В Ubuntu попробовать 'Sudo APT-получить установку php5-mysqlnd ' – Alex

+0

Мне тоже нужно было сделать то, что @Alex сказал здесь, чтобы использовать php mysqlnd под капотом. +1 за его комментарий. – Zugwalt

+0

Ускоренный переход к 2016 году, чтобы иметь правильные типы данных, возвращаемые из MySQL, для PHP 7 на CentOS/RHEL: 'yum install php70w-mysqlnd' –

55

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

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

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

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

+2

это победный ответ ^.^ – naomik

+0

Согласен. Это единственный ответ, который сработал для меня. Благодарю. –

+0

явно выигрышный ответ – eightyfive

24

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

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

pdo_mysql 

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

Если вместо того, чтобы видеть mysqlnd в версии Client API, вы увидите строку, как ...

Client API version => 5.5.29 

... тогда вы не» У меня есть mysqlnd. Позаботьтесь об этом в первую очередь.

Во-вторых, PDO использует эмулированные подготовленные заявления by default for all MySQL соединений. Смешно, но вот оно. И вы получите собственные типы данных только в том случае, если вы используете реальные подготовленные операторы (называемые «подготовленные на стороне сервера заявления» в связанном сообщении блога, который теперь here). Таким образом, вы должны установить PDO :: ATTR_EMULATE_PREPARES ложь, например, так:

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

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

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

Обратите внимание, что тип 'DECIMAL' по-прежнему будет отправлен как строка даже с этой конфигурацией. Здесь используется mysqlnd версия 5.0.10. – Pere

+1

@Перед, что сделано для предотвращения того, чтобы десятичное число стало ненадежным поплавка в PHP. –

1

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

@screenshot

enter image description here

Я нашел (дубликат) question, решил разместить мои мысли здесь, надеюсь, его штраф;)

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