Sprintf вставляет NULL в mysql

Доброе утро, отчаянно пытаюсь решить проблему с вставкой пустых значений даты в MySQL 5.7.19 и через 3 дня обратился сюда за помощью.

База данных настроена на разрешение NULL - значение NULL по умолчанию, при этом поле внешнего интерфейса иногда заполняется, чаще всего не нулевое значение.

Выскакивает ошибка:

Cannot execute SQL statement: Incorrect date value: '' for column 'signedupdate' at row 1

Вставлять

$lastInsertId = $this->GetConnection()->GetLastInsertId();
$sql = sprintf("INSERT INTO tbl_lead (client_id, signedupdate, plan_type) VALUES(%d, '%s', '%s');", $lastInsertId, $rowData['signedupdate'], $rowData['plan_type']);
$this->GetConnection()->ExecSQL($sql);

Обновлять

$sql = sprintf("UPDATE tbl_lead SET signedupdate = '%s', plan_type = '%s'WHERE client_id = %d;", $rowData['signedupdate'], $rowData['plan_type']);
$this->GetConnection()->ExecSQL($sql);

Может ли кто-нибудь увидеть, где я могу ошибаться?

Я рекомендую вам вместо этого использовать подготовленные операторы, чтобы предотвратить внедрение sql.

jeprubio 15.05.2018 11:04

Что на выходе var_dump($lastInsertId, $rowData['signedupdate'], $rowData['plan_type'])?

meysam 15.05.2018 11:29

Проверьте каждый из передаваемых вами параметров,% s будет ожидать строковый тип, попробуйте добавить тесты перед sprintf, используя is_string, чтобы убедиться, что они имеют правильный тип.

SPlatten 15.05.2018 11:37

если вы не хотите вставлять значение для поля, и оно имеет значение по умолчанию (даже NULL), просто пропустите его в операторе вставки. Не передавать '', это значение (пустое, но все же значение), и оно будет оцениваться по типу данных для этого поля: если это дата, оно завершится ошибкой

Lelio Faieta 15.05.2018 13:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
662
2

Ответы 2

Попробуйте эхо строку запроса перед ее выполнением и скопируйте / вставьте этот откликнувшийся запрос в phymyadmin и проверьте наличие ошибок в запросе.

$lastInsertId = $this->GetConnection()->GetLastInsertId();
$sql = sprintf("INSERT INTO tbl_lead (client_id, signedupdate, plan_type) VALUES(%d, '%s', '%s');", $lastInsertId, $rowData['signedupdate'], $rowData['plan_type']);
echo $sql;

$this->GetConnection()->ExecSQL($sql);

Я запустил это в phpmyadmin и получил ошибку ниже. Таким образом, похоже, что '' не принято, но NULL есть, а 0000-01-01 принимается. </br> Мне действительно нужно это как NULL, чтобы избежать проблем с отчетом на более позднем этапе, но не могу понять, почему php вставляется как строка ? <br/> 'INSERT INTO tbl_lead (client_id, signedupdate, plan_type) VALUES (20943, '', ''); {"success": false, "message": "Невозможно выполнить инструкцию SQL: Неверное значение даты: '' для столбца 'signedupdate' в строка 1 "," messageDisplayTime ": 0}'

Gary Brett 15.05.2018 11:44

В SQL (как и в PHP) существует большая разница между значением NULL и обычной текстовой переменной, которая имеет буквы N-U-L-L. Это обрабатывается автоматически любой подходящей библиотекой базы данных, если исходной переменной является фактический null (а не текст 'null '), и вы используете библиотеку по назначению.

Вы используете настраиваемую библиотеку базы данных, поэтому трудно сказать, в каком именно случае. Если библиотека не так уж плоха, она должна иметь такой синтаксис:

$sql = 'INSERT INTO tbl_lead (client_id, signedupdate, plan_type) VALUES (?, ?, ?)';
$this->GetConnection()->ExecSQL($sql, [
    $lastInsertId,
    $rowData['signedupdate'],
    $rowData['plan_type']
]);

Конечно, не обязательно синтаксис это. Пожалуйста, обратитесь к документации библиотеки, чтобы проверить ее исходный код.

Если это плохая библиотека, она предоставит только функции экранирования. Если эти функции автоматически добавляют кавычки, вам может повезти с чем-то вроде:

$sql = sprintf('INSERT INTO tbl_lead (client_id, signedupdate, plan_type) VALUES(%s, %s, %s)',
    $this->GetConnection()->EscapeValue($lastInsertId),
    $this->GetConnection()->EscapeValue($rowData['signedupdate']),
    $this->GetConnection()->EscapeValue($rowData['plan_type'])
);
$this->GetConnection()->ExecSQL($sql);

Опять же, Я только что придумал синтаксис.

В противном случае придется разбираться со всем самостоятельно:

$sql = sprintf('INSERT INTO tbl_lead (client_id, signedupdate, plan_type) VALUES(%s, %s, %s)',
    $lastInsertId===null ? 'NULL' : "'" . $this->GetConnection()->EscapeValue($lastInsertId) . "'",
    $rowData['signedupdate']===null ? 'NULL' : "'" . $this->GetConnection()->EscapeValue($rowData['signedupdate']) . "'",
    rowData['plan_type']===null ? 'NULL' : "'" . $this->GetConnection()->EscapeValue($rowData['plan_type']) . "'"
);
$this->GetConnection()->ExecSQL($sql);

Если библиотека даже не предоставляет escape-функций, вам действительно стоит остановиться на этом и переключиться, например, на PDO. В любом случае было бы неплохо переключиться - по моему опыту, StrangelyCasedLibraries (), как правило, сомнительного качества.

Другие вопросы по теме