Sprintf вставляет NULL в MySQL - PullRequest
0 голосов
/ 15 мая 2018

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

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

Появляется ошибка:

Невозможно выполнить инструкцию SQL: неверное значение даты: '' для столбца 'signatureupdate' в строке 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);

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

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

В SQL (как и в PHP) существует большая разница между значением NULL и обычной текстовой переменной, которая имеет буквы NULL.Это автоматически обрабатывается любой приличной библиотекой базы данных, если исходная переменная представляет собой фактический 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 (), как правило, имеют сомнительное качество.

0 голосов
/ 15 мая 2018

Попробуйте повторить строку запроса перед ее выполнением, скопируйте / вставьте этот повторный запрос в 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...