0

经过其他人的大量推荐,我决定从 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;

我可能在几英里之外,但我很感激你给我的帮助:) 我会再做几次搜索。

4

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

还要小心进行错误检查。和prepare()函数execute()返回false错误。许多事情都可能导致错误。您可能拼错列名。您的数据库连接可能缺少正确的数据库权限。有人可能会摔桌子。

FWIW,在使用mysql_ * 和mysqli_ * API 时,正确的错误检查也很重要,但似乎很少有人做对。

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

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

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

于 2013-07-03T17:31:04.300 回答