2013-04-22 29 views
0

所以我寫了一個腳本來在表中插入一個電子郵件地址,但我想檢查該地址是否已經存在。於是,我開始用事先準備好的聲明:使用MySQLi準備語句檢查現有記錄

$statement = $db->prepare("SELECT * FROM `signups` WHERE `signups_email`= ? "); 
$statement->bind_param('s',$email); 
$statement->execute(); 

if($statement->num_rows < 1){ 
    $statement->close(); //Free up the SQL result 
    //do the inserting code 
} else { 
    echo "Email already exists"; 
} 

麻煩的是,($statement->num_rows < 1)似乎總是返回true,即使我知道有一個數據庫中的電子郵件。即它不知道該地址已經在數據庫中。

我的連接等是優良的//do the inserting code位工作正常。

+0

或者,如果你只需要檢查的是一列,你可以在該列使用'UNIQUE'指數,並避免不必要的'SELECT'查詢。 – pilsetnieks 2013-04-22 19:05:28

+0

但是,當我嘗試插入一個已經存在的條目時,會不會引發錯誤?我的方法使得前端的錯誤處理非常簡單。 – harryg 2013-04-22 19:10:05

+0

你可以做'INSERT IGNORE',即使已經存在這樣的條目也不會引發錯誤,然後檢查插入的行數。 – pilsetnieks 2013-04-22 19:12:37

回答

0

如果電子郵件已存在於數據庫中,則您的聲明失敗。在if()應該

if ($statement->num_rows == 0) { 
    ... email does not exist, insert it 
} else { 
    ... at least one record with that email exists 
} 
+0

在這種情況下,我看不出「等於零」與「小於1」有什麼區別。 – pilsetnieks 2013-04-22 19:00:50

+0

@pilsetnieks我正要問完全相同的東西 – harryg 2013-04-22 19:02:10

1

看看爲mysqli_num_rows的文檔。

返回結果集的行數。採用 mysqli_stmt_num_rows()取決於你是否不使用 mysqli_stmt_store_result()來緩衝整個結果在 語句句柄設置。

如果使用mysqli_stmt_store_result(),mysqli_stmt_num_rows()可能立即調用 。

看起來你需要調用store_result()之前,你可以檢查的行數。

+0

完美的感謝,不存儲結果是問題。 – harryg 2013-04-22 19:03:26