В проекте у меня есть следующий запрос mySql:
INSERT INTO my_table (status) VALUES ('')
где 'status' имеет тип tinyint (1). Проект развернут на нескольких разных серверах с разными версиями PHP и версиями mySql. Теперь - впервые - у нас возникла проблема, заключающаяся в том, что на новом сервере указанный выше запрос приведет к ошибке.
Incorrect integer value: '' for column 'status' at row 1
Изменение запроса на
INSERT INTO my_table (status) VALUES ('0')
решает проблему. Однако было бы сложно пройти через весь проект и повсюду менять этот тип запроса. Запрос строится PDO с
$stmt = $db->prepare("INSERT INTO my_table (status) VALUES (:status)");
$stmt->execute( array( ':status' => false ) );
или новый стиль
$stmt->execute( array( ':status' => '0' ) );
Есть ли способ указать PDO вести себя по-другому, когда передается false, или мы можем установить какие-либо параметры для БД, чтобы по-разному обрабатывать пустые строки при получении их для int-вводов? Любые идеи очень приветствуются :-)
Кроме того, было бы очень интересно узнать, какая версия MySQL (или PDO?) Является первой, которая может вызвать эту проблему?
@stickybit вы правы. Это не должна быть строка ...
Отключение строгого режима MySQL май позволяет вам сохранять пустое значение в поле tinyint, но именно поэтому лучше всего разрабатывать с включенным строгим режимом.
@Devon хм ... как я уже сказал: у нас пока не было проблем с этим типом запросов (до сих пор). Таким образом, некоторые настройки по умолчанию (или последствия устаревшей версии), похоже, позволяют это регулярно ...
@ user3440145 а вы смотрели в строгий режим, как я сказал?
@Devon Я не могу в этом случае. Мне пришлось бы изменить настройку на сервере клиентов - здесь это не вариант. Также было бы неприемлемо в будущем отключить строгий режим в качестве требования.
@ user3440145 Тогда не знаю, чего вы хотите. Вы сказали, что вам нужно решение, позволяющее избежать обновления кода, которое, вероятно, отключило бы строгий режим. Если вы не хотите отключать строгий режим, вам необходимо обновить код для обработки строгого режима. Не думаю, что на этот вопрос есть ответ.
@Devon, спасибо - это мог быть ответ, который я искал :-) Странно, что эта проблема не возникала до сих пор. И не могу себе представить, что ВСЕ БД отключили строгий режим, кто использовал приложение (я не могу это проверить, но это кажется почти невозможным). Так что если изменить код - единственный вариант - мне придется это сделать.
Возможно, стоит проверить, может ли это вызвать PDO::ATTR_EMULATE_PREPARES.






'0'по-прежнему остается строкой. Почему бы вам не изменить его на0(«истинное» число), если вы уже меняете его?