MySQL UPDATE返回值

时间:2014-12-19 11:12:21

标签: php mysql pdo

我开始编写一个简单的脚本,从CSV读取ID,然后为CSV中的所有用户设置相同的电子邮件地址(在DB中)。足够简单......(使用PDO) 从CSV读取数据是可以的。这是令我头疼的更新部分。

 $sSQL = "UPDATE users SET email = 'something@something.com' WHERE CUSTOMER_ID = '%s'";
 foreach ($aUsers as $sCustomerId) {
    $sQuery = sprintf($sSQL, $sCustomerId);

    if (!$db->exec($sQuery)) {
        printf("There was an error updating user %s in database.<br>", $sCustomerId);
        $aFailed[] = $sCustomerId;
    } else {
        printf("User %s successfully updated.<br>", $sCustomerId);
        $success++;
    }
}

脚本非常简单。问题是,如果mysql已经拥有该电子邮件地址,则mysql不会更新DB中的用户,因此它将返回0(0行受影响,这是正常的)。如果在更新期间发生错误,mysql返回的内容也是一样的。这就是让我疯狂的原因。如何区分“没有受影响的行”和“发生错误”。我尝试使用不同的PDO :: ATTR_ERRMODE并且期望至少在出现错误的情况下它会抛出一个异常(哪种PDO :: ERRMODE_EXCEPTION应该这样做),我可以抓住它但不会。然后我trid使用

if ($db->exec($sQuery) === FALSE) 

也行不通。该脚本现在可以工作,但问题是我无法区分“错误”和“没有受影响的行”。

mysql中的这种行为是新的还是?因为在编写这样简单的脚本以供更新时,我不记得曾经有过这个问题...

手动说:“如果您将列设置为当前的值,MySQL会注意到这一点并且不会更新它。”

2 个答案:

答案 0 :(得分:3)

您可能可以使用errorCode()errorInfo()来识别错误。

如果查询没有问题,

errorCode()函数返回NULL。

示例:

$db->exec($sQuery);
if ($db->errorCode() !== NULL) {
    // Additional error info from: $db->errorInfo()
    printf("There was an error updating user %s in database.<br>", $sCustomerId);
    $aFailed[] = $sCustomerId;
} else {
    printf("User %s successfully updated.<br>", $sCustomerId);
    $success++;
}

PHP文档:

http://php.net/manual/en/pdo.errorcode.php

http://php.net/manual/en/pdo.errorinfo.php

答案 1 :(得分:0)

如果您使用的是PDO,请尝试执行prepare,然后execute,成功时返回true,错误时返回false

$sSQL = "UPDATE users SET email = 'something@something.com' WHERE CUSTOMER_ID = :customer_id";
$sth = $db->prepare($sSQL);
if(!$sth->execute(array(':customer_id' => $sCustomerId)))
{
    printf("There was an error updating user %s in database.<br>", $sCustomerId);
} else {
    printf("User %s successfully updated.<br>", $sCustomerId);   
}

保持脚本安全是一个很好的实践。执行将绑定参数,因此无需转义或引用它们。