PDO Insert не принимает "true" или "false", но только 0 и 1 - PullRequest
0 голосов
/ 11 июня 2019

После введения phinx в качестве инструмента миграции базы данных я больше не могу использовать true и false через оператор выполнения 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.

Ответы [ 3 ]

1 голос
/ 11 июня 2019

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

$stmt->bindValue(':myColumn', false, PDO::PARAM_BOOL);
0 голосов
/ 11 июня 2019

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

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

set GLOBAL sql_mode = "";

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

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

0 голосов
/ 11 июня 2019

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

...