PDO Insert не принимает true или false, а только 0 и 1

После введения phinx в качестве инструмента миграции базы данных я больше не могу использовать true и false в операторе execute PDO. Всякий раз, когда я это делаю, я получаю следующую ошибку:

Предупреждение PHP: PDOStatement::execute(): SQLSTATE[22007]: недопустимый формат даты и времени: 1366 Неверное целочисленное значение: '' для столбца 'my_db'.'my_table'.'my_column' в строке 1...

Моя таблица имеет следующую схему (сокращенно):

| Field                         | Type         | Null | Key | Default | Extra          |
+-------------------------------+--------------+------+-----+---------+----------------+
| my_column                     | tinyint(1)   | NO   |     | NULL    |                |
+-------------------------------+--------------+------+-----+---------+----------------+

Я использую следующий код (сокращенный):

$stmt = $this->pdo->prepare("INSERT INTO `$table` (`my_column`) VALUES (:mycolumn)");
$stmt->execute([
   'my_column' => false
]);

Столбец создается сценарием миграции с помощью:

->addColumn('my_column', 'boolean', [
  'null' => false,
  'after' => 'another_column',
])

Странно то, что у меня нет проблем с использованием true и false в операторах sql вручную через phpMyAdmin.


person allinonemovie    schedule 11.06.2019    source источник
comment
Кстати, убедитесь, что $table правильно экранирован.   -  person emix    schedule 11.06.2019
comment
Кстати, определите значение по умолчанию при создании столбца   -  person Michael Krutikov    schedule 11.06.2019


Ответы (3)


вы можете использовать PDO::PARAM_BOOL в PDO

$stmt->bindValue(':myColumn', false, PDO::PARAM_BOOL);
person Ali Ghaini    schedule 11.06.2019
comment
Да, скорее всего, я должен это сделать. Однако это не совсем то исправление, которое мне нужно. У меня есть эта проблема во многих местах моего приложения, а это значит, что, насколько я понимаю, мне придется изменить ее везде. Однако ответ Red Bottle исправил это для меня. Однако я тоже не хочу этого принимать, потому что считаю, что за него не проголосовали без причины. Я не знаю, почему это будет практикой, если я включу команду в свой файл миграции. Если бы вы могли адаптировать свое решение для работы во всем моем приложении, не внося изменений повсюду, я мог бы принять ваш ответ. - person allinonemovie; 12.06.2019

Решением этой проблемы является глобальная установка sql_mode = ''.

Запустите этот запрос в своей БД и проверьте, устраняет ли он проблему:

set GLOBAL sql_mode = "";

Вы можете прочитать режимы SQL сервера здесь.

P.S. вы должны запускать этот запрос каждый раз, когда перезагружаете сервер mysql. Чтобы преодолеть это, вы должны установить его в конфигурации mysql, которую вы можете найти при необходимости.

person Red Bottle    schedule 11.06.2019
comment
Это исправило это для меня! Можете ли вы рассказать немного больше о том, что именно он делает? Это как-то связано с тем, как MySQL анализирует команды? - person allinonemovie; 11.06.2019
comment
поделился ссылкой на документ для справки - person Red Bottle; 11.06.2019

Ваш тип поля — tinyint(1). поэтому он поддерживает только значения от 0 до 9 . Измените на varchar, text, char и т. д., чтобы принять строку true/false. Но я настоятельно рекомендую вам использовать тип данных bool. Затем используйте 0 или 1 как истину или ложь. Нет смысла писать строковые значения (true/false) для логических операций. Использование 0 или 1 избавит вас от многих проблем в будущем.

person Saroj Pandey    schedule 11.06.2019
comment
Что касается моего исследования, логическое значение внутренне представлено MySQL как tinyint(1). Я имею в виду этот вопрос. - person allinonemovie; 11.06.2019
comment
Это неправильно. tinyint всегда поддерживает [-128,127] или [0,255] без знака. Число в скобках — это ширина экрана, и оно верно только для ZEROFILL и больше ни для чего. Столбец tinyint(1) будет отображать 1 с ZEROFILL. крошечный интервал (2): 01, крошечный интервал (3): 001 ... - person aProgger; 22.11.2020