Я использую PDO и MySQL, по какой-то причине, получая значения из базы данных, которые являются типами int, PDOStatement возвращает строковое представление числа, а не значение числового типа. Как я могу предотвратить это?
Я заметил, что есть атрибут класса PDO: PDO::ATTR_STRINGIFY_FETCHES
который должен позаботиться об этом, но при попытке изменить его он выдает сообщение об ошибке, PDO::ATTR_STRINGIFY_FETCHES
что атрибут недействителен для драйвера MySQL.
Нормально ли получать строки вместо цифр при консультации с базой данных?
Я не думаю, что «числа» можно сделать в PHP 5.2 🙁
В PHP 5.3 становится возможным, если я правильно помню, когда вы используете новый (новый как в PHP> = 5.3) драйвер mysql nd (MySQL Native Driver) .
Ну, после того, как я больше поработал PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3
своими закладками, я нашел эту статью о 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 – см. Доктрину , как пример ORM: я не знаю, выполняет ли она то, что вы просите) для преобразования результатов начиная с базы данных DB до 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
в версии Client 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 значение true.
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
У вас может быть установлен mysqlnd
, но это не значит, что он готов к использованию обычным расширением PDO
(pdo_mysql)
, это чаще встречается на общем хостинге, поэтому обязательно включите расширение nd_pdo_mysql
, а также отключите другие extension pdo_mysql
поскольку это может создать конфликт.
@Скриншот
Я нашел этот (дублированный) вопрос , решил разместить здесь свои мысли, надеюсь, что он прекрасен;)