2013-07-03 85 views
0

經過很多其他人的推薦,我決定從mysql_切換到PDO。我從15分鐘左右開始着眼於PDO,我試圖將這一行代碼轉換爲PDO格式。從mysql_切換到PDO

function verify_user($username, $recover_password) { 
     return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password_recovery` = '$recover_password'"), 0) == 1) ? true : false; 
} 

我已經看過幾個教程,並據我可以工作,我可以做實際的查詢與此代碼:

$verify_user = "SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password_recovery` = '$recover_password'"; 
    $result = $con->prepare($verify_user); 
    $result->execute(); 

我遇到的問題是第二部分代碼行 - mysql_result。現在查詢已經運行,我不知道如何使用PDO返回true或false。我會很感激任何幫助。謝謝!

更新時間:

$result = $con->prepare("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = :username AND `password_recovery` = :recover_password"); 
$result->bindParam(':username', $username, PDO::PARAM_STR); 
$result->bindParam(':password_recovery', $recover_password, PDO::PARAM_STR); 
$result->execute(); 

從讀取頁面,您只要將是:

$result = $con->prepare("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = :username AND `password_recovery` = :recover_password"); 
$result->bindParam(':username', $username, PDO::PARAM_STR); 
$result->bindParam(':password_recovery', $recover_password, PDO::PARAM_STR); 
$result->execute(); 
return ($con->fetch($result) == 1) ? true : false; 

我可能英里了,但我很感謝你給我的幫助:)我」我會再做幾次搜索。

+0

您正在使用PDO錯誤。 '$ username'和'$ recover_password'應該是佔位符,** NOT **直接插入到查詢字符串中。至於檢索結果,這裏有一個提示:http://php.net/manual/en/pdostatement.fetch.php –

+0

我認爲這應該是正確的? (編輯主帖) – user2547576

+0

更好的參數。取回錯誤。你正在選擇一個計數,所以你總是會回到1排。您需要獲取該行的數據,然後檢查計數結果。 –

回答

-1

我會寫的功能是這樣的:

function verify_user($username, $recover_password) { 
    $sql = "SELECT COUNT(`user_id`) AS count FROM `users` 
     WHERE `username` = ? AND `password_recovery` = ?"; 
    $stmt = $con->prepare($sql); 
    $stmt->execute(array($username, $recover_password)); 
    while ($row = $stmt->fetch()) { } /* should be exactly one row anyway */ 
    return $row["count"] == 1; 
} 

有沒有必要使用bind_param(),因爲你可以在一個陣列參數值傳遞給​​。而且不需要指定參數類型(至少在MySQL PDO驅動程序中實際上被忽略了)。

還要小心做錯誤檢查。 prepare()和​​函數錯誤返回false。許多事情可能會導致錯誤。您可能拼錯列名稱。您的數據庫連接可能缺乏正確的數據庫權限。有人可以放桌子。使用mysql_ *和mysqli_ * API太當

FWIW,適當的錯誤檢查是很重要的,但似乎很少有人這樣做的權利。

在上面的代碼中,我沒有顯示檢查返回值,因爲我假設我們在創建PDO連接時啓用了異常。

$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

這減輕了我們編寫代碼,每次檢查返回值,但它意味着一個錯誤將導致我們的應用程序走「白幕」。最好的做法是處理呼叫者功能中的例外情況,並顯示一些友好的錯誤屏幕。

+0

對匿名downvoter:你認爲我的答案中缺少什麼?也許我可以改進它。 –