2014-12-19 176 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); 
} 

這是保持腳本安全的良好實踐。執行會綁定參數,所以不需要轉義或引用它們。