我开始编写一个简单的脚本,从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会注意到这一点并且不会更新它。”
答案 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文档:
答案 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);
}
保持脚本安全是一个很好的实践。执行将绑定参数,因此无需转义或引用它们。