MySQL INSERT вставляя бит в 1 вместо 0 - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть следующий запрос, который должен вставить 0, но вместо этого вставить 1. Он выполняется с подготовленными инструкциями в PHP:

$insertsql= 
    "INSERT INTO table1 (column1, column2, column3, column4, column5, column6) 
    VALUES (?, ?, ?, ?, ?, ?)";
$insertstmt = $pdo->prepare($insertsql);
$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, 0));

Все вставки выполняются нормально, за исключением того, что 1 вставляется в столбец 6 вместо0. Столбец 6 имеет тип данных BIT.

Однако запрос работает нормально при выполнении

INSERT INTO table1 (column6) VALUE (0);

непосредственно во вкладке phpmyadmin 'MySQL'.

Чего мне не хватает?

РЕДАКТИРОВАТЬ: Использование

$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));

работает, как ожидалось.Почему 0 работает непосредственно в запросе SQL, а не при использовании pdo для его выполнения?

1 Ответ

0 голосов
/ 06 февраля 2019

Вам необходимо явно объявить этот параметр как Boolean при передаче его в PDO.

Из PDO execute документация :

input_parameters

Массив значений с таким количеством элементов, сколько связанных параметров в выполняемой инструкции SQL.Все значения обрабатываются как PDO::PARAM_STR.

Это не то, что вам нужно.

Поэтому вам нужно будет изменить логику, чтобы избежать использования конструкции execute(array()) и связывать каждуюпараметр по отдельности, используя bindValue().Для логического значения:

$insertstmt->bindValue(':col6', false, PDO::PARAM_BOOL);

Поскольку логические значения в MySQL равны TINYINT(1), PDO::PARAM_INT также должно нормально работать:

$insertstmt->bindValue(':col6', 0, PDO::PARAM_INT);

Наконец: если это логическое значение будетвсегда быть ложным, тогда вы можете передать его непосредственно в запрос, например:

$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));

Как мудро прокомментировано spencer7593 , другой вариант - выполнить приведение типа изнутриSQL.Например, можно преобразовать строку в битовое значение с помощью:

INSERT INTO table1 (column1, column2, column3, column4, column5, column6) 
VALUES (?, ?, ?, ?, ?, IF( ? ='0', b'0', b'1') )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...