2013-03-20 60 views
0

在我的PHP INSERT/UPDATE代碼中,我一直在用一個相當基本的概念掙扎。我應該在每次INSERT/UPDATE後總是檢查受影響的行數,因爲在絕大多數情況下,我只執行一次INSERT/UPDATE,並且通過檢查只有一行受到影響,似乎會導致更多問題。PHP mysql_affected_rows()我應該關心嗎?

下面是執行INSERT/UPDATE的標準代碼,如果用戶更新記錄而不更改任何內容,因爲受影響的行將爲0,則此代碼失敗。我可以編寫代碼來檢查是否至少有一個字段已更改但在大型表格上,這看起來非常笨重,並且想知道它是否真的值得,因爲我從來沒有真正通過檢查這個號碼來發現任何錯誤。

<?php 
     $whereSql = ''; 
     $groupSql = 'INSERT INTO'; 

     if(isset($_POST['id']) && is_numeric($_POST['id'])){ 
      $groupSql = 'UPDATE'; 
      $whereSql = 'WHERE id = ' . $_POST['id']; 
     } 

     $groupSql .= ' sometable SET name="' . $name . '" ' . $whereSql; 

     $groupDb = mysqli_query($groupSql, $dbObject) or die("Login DB error:".mysql_error()); 

     if(mysqli_affected_rows($dbObject) == 1){ 
      //redirect 
     }else{ 
      die('System Error'); 
     } 
+1

-0.49在2013年使用'mysql_query'。 – cHao 2013-03-20 14:30:10

+0

爲什麼不打印錯誤if mysql_affected_rows($ dbObject)== -1。從手動 - >返回成功時受影響的行數,如果最後一次查詢失敗,則返回-1。 – 2013-03-20 14:30:24

+0

@cHao這是傳統代碼 – 2013-03-20 14:30:35

回答

4

您應該檢查查詢的返回值。影響/不返回行的選擇/更新查詢是不是一個錯誤條件,它只是一個空的結果集,或者是一個碰巧沒有影響的更新。

$result = mysql_query($sql) or die(mysql_error()); 
          ^^^^^^^^^^^^^^^^^^^^^ 

考慮一個用戶註冊系統,檢查匹配用戶名的存在:

SELECT id FROM users WHERE username='foo'; 

如果用戶foo不存在,系統將BARF和要求發生了錯誤。但是一個空的結果集是不是出錯。它只是表示用戶名可用。

同爲一個處理等級系統:

UPDATE students SET failed=true WHERE score < 50; 

得到0受影響的行還不是一個失敗者。這只是意味着所有的學生都通過了。

1

我會建議檢查查詢是否失敗,如果不是,那麼如果有多個行受到影響。

$groupDb = mysql_query($groupSql, $dbObject); 
if (false === $groupDb) { 
    die("Login DB error:".mysql_error()) 
if (mysql_affected_rows($dbObject) > 1) { 
    die('System Error: failed to ' . $action . ' a document Group'); 
} else { 
    //redirect 
} 

這樣你就成功查詢的情況下,僅重定向,如果有受影響小於2行(如果這對你很重要)。

相關問題