2010-05-27 81 views
9

我正在嘗試編寫一個有點智能的PHP-MySQL數據庫處理器。當這個處理器決定它需要更新時,我想報告它是否真的成功。我以爲我可以使用mysql_affected_rows ...PHP,MySQL - 你能區分行匹配和行受到影響嗎?

// Example: 
// After running query "UPDATE mytable SET name='Test' WHERE ID=1" 
$result = mysql_affected_rows(); 
if ($result >= 1) { /* Success */ } 

如果,例如,有一個與ID = 1沒有行,然後$result將。

然而,事實證明,PHP的mysql_affected_rows是實際受影響的行,並可能仍然是如果行存在,但name已經是「測試」。 (PHP docs甚至可以這麼說)。

如果我在命令行中運行這個,我得到有關查詢下列元信息:

Query OK, 0 rows affected (0.01 sec) 
Rows matched: 1 Changed: 0 Warnings: 0 

有什麼辦法,我讓在PHP的,而不是受影響的「行一致」的價值行?

[編輯]:我應該注意,我知道我可以運行一個單獨的查詢,但我不想那麼做,爲了性能。

回答

12

MySQL documentationmysql_affected_rows

對於UPDATE語句,如果指定 時 連接到mysqld的CLIENT_FOUND_ROWS標誌, mysql_affected_rows()函數返回 數是WHERE 子句匹配的行。否則,默認的 行爲是返回實際更改的行數 。

隨着的mysqli,則可以使用mysqli::real_connect指定CLIENT_FOUND_ROWS。

$db = mysqli_init(); 
$db->real_connect('host', 'username', 'password', 'dbname', '3306', null, MYSQLI_CLIENT_FOUND_ROWS); 

PDO,不斷的被命名爲PDO :: MYSQL_ATTR_FOUND_ROWS

$db = new PDO('mysql:dbname=mydatabase;host=myhost', 'username', 'password', array(
    PDO::MYSQL_ATTR_FOUND_ROWS => true 
)); 

隨着老棄用MySQL擴展,可以指定傳遞值2爲的mysql_connect的第五個參數的CLIENT_FOUND_ROWS (source)。

+0

這太好了。雖然它不能提供區分兩者的方法(所以我會在接受答案之前對其進行測試),但在我看來,這似乎是我的首選條件。謝謝! – Nicole 2010-05-28 00:46:32

+0

我比他更喜歡他的回答! :) – Sev 2010-05-28 00:56:36

+0

PHP lib是對MySQL C api庫的透明包裝,你真的可以閱讀MySQL文檔以更好地理解PHP/MySQL api – bobobobo 2013-05-12 10:01:07

6

您也可以使用該功能

$variable = mysql_info(); 

該函數獲取一個像這樣的字符串:

行匹配:1:0的警告:0

你可以工作用你的變量的字符串函數來提取子字符串的行數匹配,你應該擁有它!

+1

謝謝,這幫了我很多。 ''preg_match('/^\ D +(\ d +)\ D +(\ d +)\ D +(\ d +)$ /',$ variable,$ matches);' – Anonymous 2012-09-15 09:31:12

+0

使用'$ mysqliObject-當使用更新的'mysqli'擴展名時使用> info'。 – 2015-07-09 21:36:28