MySQL PDO - ON DUPLICATE KEY UPDATE在没有更改的情况下返回false吗?

时间:2016-07-28 07:28:06

标签: php mysql pdo

我正在保存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;
}

2 个答案:

答案 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::queryPDO::exec才会返回false 不插入行并执行成功更新并非失败。

&#39; 00000&#39;的SQL状态意味着没有错误。