我正在保存API中的数据,并运行ON DUPLICATE KEY UPDATE
。问题是它在第一次运行时保存没有错误,但在连续运行时它返回false,并带有以下errorInfo()
Array ( [0] => 00000 [1] => [2] => )
我在phpMyAdmin中手动运行SQL,它可以工作(插入0行),如果没有进行任何更改,它会返回false吗?
我在这里为可怕的代码道歉,PDO实例保存为$this->db
(我在这个函数中保存了一些JSON,所以通常的准备转义是:
上的错误,因此“make-due”解决方案在下面)
public function update($table, $valuePairs)
{
$columns = '';
$values = '';
$updates = '';
foreach ($valuePairs as $column => $value)
{
if($value !== null and $value !== '') {
$columns .= '`'.$column.'`, ';
$values .= $this->db->quote($value).', ';
$updates .= '`'.$column.'` = VALUES(`'.$column.'`), ';
}
}
$columns = rtrim($columns, ', ');
$values = rtrim($values, ', ');
$updates = rtrim($updates, ', ');
$sql = 'INSERT INTO '.$table.' ('.$columns.')
VALUES ('.$values.')
ON DUPLICATE KEY UPDATE '.$updates;
$result = $this->db->exec($sql);
if(!$result)
{
print_r($this->db->errorInfo());
echo '<br><br>';
}
return $result;
}
答案 0 :(得分:2)
让我们仔细看看PDO::exec()
manual page:
返回值
PDO :: exec()返回已修改或删除的行数 通过您发出的SQL语句。如果没有行受影响,PDO :: exec() 返回0。
警告强>
此函数可能返回布尔值FALSE ,但也可能返回a 非布尔值,其值为FALSE。请阅读有关的部分 布尔值获取更多信息。使用===运算符进行测试 返回此函数的值。
但是你的代码没有区分零和假:
if(!$result)
{
print_r($this->db->errorInfo());
echo '<br><br>';
}
你可能想要这个:
if ($result===false)
{
print_r($this->db->errorInfo());
echo '<br><br>';
}
在运行语句两次时更新零行是预期的行为,因为如果值没有更改,MySQL将不会更新行。
我特别喜欢忘记错误处理并将PDO配置为只抛出异常。
答案 1 :(得分:1)
PDO::query和PDO::exec才会返回false 不插入行并执行成功更新并非失败。
&#39; 00000&#39;的SQL状态意味着没有错误。