从mysql_切换到PDO

时间:2013-07-03 17:00:42

标签: pdo

经过其他人的推荐后,我决定从mysql_切换到PDO。我开始在大约15分钟前开始查看PDO,并且我一直试图将这行代码转换为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;

我可能已经走了很远,但我感谢你给我的帮助:)我会做更多的搜索。

1 个答案:

答案 0 :(得分:-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(),因为您只需将数组参数中的值传递给execute()即可。并且不需要指定参数类型(实际上忽略了,至少在MySQL PDO驱动程序中)。

还要小心进行错误检查。 prepare()execute()函数在出错时返回false。很多事情都可能导致错误。您可以拼错列名称。您的数据库连接可能缺少正确的数据库权限。有人可能不知所措。

FWIW,在使用 mysql _ *和 mysqli _ * API时,正确的错误检查很重要,但似乎很少有人这样做。

在上面的代码中,我没有显示检查返回值,因为我已经假设我们在创建PDO连接时启用了异常。

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

这使我们不必每次都编写代码来检查返回值,但这意味着错误将导致我们的应用程序进入白屏"。处理调用者函数中的异常是最佳做法,并显示一些友好的错误屏幕。