2014-12-19 171 views
1

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

$sSQL = "UPDATE users SET email = '[email protected]' 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不会更新数据库中的用户,因此它将返回0(0行受影响,这没关系)。如果在更新过程中发生错误,那么mysql也会返回同样的结果。这就是让我疯狂的原因。我如何区分“不受影响的行”和“发生错误”。我尝试使用不同的PDO :: ATTR_ERRMODE,并期待至少在错误的情况下,它会抛出一个异常(哪种PDO :: ERRMODE_EXCEPTION应该这样做),我可以比捕获,但它不会。然后我要使用

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

也不起作用。该脚本现在可行,但问题是我无法将“错误”与“无受影响的行”区分开来。

这是mysql中的新行为吗?因为我不记得写更新这样简单的脚本当具有过去那样的问题......

手册说:“如果你设置为它当前的值的列时,MySQL注意到这一点,并没有更新“。

+0

您是否尝试过PDOStatement :: rowCount?它通过查询返回受影响的行。因此请检查它是否为0或更多:) – Refilon 2014-12-19 11:20:03

+0

更新后应检查“$ db-> errorCode()”以查看是否发生错误 – 2014-12-19 11:21:31

回答

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

0

如果您使用的PDO,尝试做prepare然后execute,它返回true上的成功, false,错误号为

$sSQL = "UPDATE users SET email = '[email protected]' 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); 
} 

这是保持脚本安全的良好实践。执行会绑定参数,所以不需要转义或引用它们。