Доброе утро, отчаянно пытаюсь решить проблему с вставкой пустых значений даты в 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);
Может ли кто-нибудь увидеть, где я могу ошибаться?
Что на выходе var_dump($lastInsertId, $rowData['signedupdate'], $rowData['plan_type'])?
Проверьте каждый из передаваемых вами параметров,% s будет ожидать строковый тип, попробуйте добавить тесты перед sprintf, используя is_string, чтобы убедиться, что они имеют правильный тип.
если вы не хотите вставлять значение для поля, и оно имеет значение по умолчанию (даже NULL), просто пропустите его в операторе вставки. Не передавать '', это значение (пустое, но все же значение), и оно будет оцениваться по типу данных для этого поля: если это дата, оно завершится ошибкой






Попробуйте эхо строку запроса перед ее выполнением и скопируйте / вставьте этот откликнувшийся запрос в 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}'
В 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 (), как правило, сомнительного качества.
Я рекомендую вам вместо этого использовать подготовленные операторы, чтобы предотвратить внедрение sql.