Sprintf将NULL插入mysql

时间:2018-05-15 09:00:32

标签: php mysql printf

早上好,拼命尝试解决我在将空白日期值插入MySQL 5.7.19时遇到的问题,并在3天后转到此处寻求帮助。

将DB设置为允许NULL - 默认为NULL,前端字段有时会被填充,更常见的不是空值。

弹出错误:

  

无法执行SQL语句:日期值不正确:''对于专栏' signedupdate'在第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 :(得分:0)

在执行查询字符串之前尝试回显,并在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);

答案 1 :(得分: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);

如果图书馆甚至没有提供转义功能,你应该在这里停下来切换到例如PDO。无论如何切换都可能是一个好主意 - 根据我的经验,StrangelyCasedLibraries()往往具有可疑的质量。