Подтвердить что ты не робот

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

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

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

Является ли нормальным получение строк вместо чисел при обращении к базе данных?

4b9b3361

Ответ 1

Я не думаю, что "числа" можно сделать в 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 - см. Doctrine; как пример ORM: я не знаю, выполняет ли он то, что вы просите) для преобразования результатов, поступающих из баз данных DB в PHP...

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

Ответ 2

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

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

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

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

Ответ 3

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

Сначала убедитесь, что у вас установлен и активирован 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);

Ответ 4

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

@screenshot

введите описание изображения здесь

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