mysqli到pdo简单的select语句

时间:2013-11-17 08:39:59

标签: mysql pdo

我刚刚将一些MySQL转换为mysqli,但意识到我无法通过我的服务器设置访问mysqlnd驱动程序。所以,我现在需要转换为我可用的PDO。

我正在尝试将以下内容转换为PDO,但PDO中没有可用的bind_result。我需要使用准备好的语句,因为有用户输入。

    $stmt = $mysqli->prepare("SELECT user,pass FROM test_users WHERE user = ?");
    // bind params
    $stmt->bind_param('s', $_POST['username']);
    // execute prepared statement
    $stmt->execute();
    // Bind result variables
    $stmt->bind_result($ruser, $rpass); 
    // fetch values
    $stmt->fetch();     
    // close statement
    $stmt->close();

任何人都可以帮忙吗?这是我所拥有的,但不确定如何将结果值检索为可用变量......

    $stmt = $db->prepare("SELECT user,pass FROM test_users WHERE user = ?");
    // bind params
    $value = $_POST['username'];
    // execute prepared statement
    $stmt->execute($value);
    // stmt now holds results, but how can I retrieve them into useable values?
    // ?    
    // close statement
    $stmt->closeCursor();

2 个答案:

答案 0 :(得分:1)

您可以使用PDOStatement::fetch方法从PDO查询返回值。有各种方法可以获取数据,例如数组,对象和延迟加载对象。这些中最简单的,也是最适合您的情况的阵列。在这种情况下,您需要使用PDO::FETCH_ASSOC常量。

 $results = $stmt->fetch(PDO::FETCH_ASSOC);

然后,您可以访问$results['user']$results['pass']

一种很好的改进方法是获取$user$pass变量而不是数组。这可以使用list构造完成:

list($user, $pass) = $stmt->fetch(PDO::FETCH_NUM);

你的代码的另一个问题(正如你的常识可能会或可能不会在评论中指出:这有点难以辨别)是你的代码绑定变量是不对的。 PDOStatement::execute需要一个数组:

$stmt->execute(array($value));
$stmt->execute([$value]); // from PHP 5.4

在我看来,更好的方法是使用命名参数:

$stmt = $db->prepare('SELECT user, pass FROM test_users WHERE user = :user');
$stmt->bindParam(':user', $_POST['username']);
$stmt->execute();

list($user, $pass) = $stmt->fetch(PDO::FETCH_NUM);

答案 1 :(得分:1)

你需要熟悉数组。它们与常规变量一样“可用” 有时阵列甚至更有用,特别是在你的情况下。

$stmt = $db->prepare("SELECT user, pass FROM test_users WHERE user = ?");
$stmt->execute([$_POST['username']]);
$row = $stmt->fetch();

现在$ row包含查询返回的行。现在,您可以测试是否返回任何数据,然后使用它。

对于密码检查,您可以这样使用

if ($row && $row['pass'] === whatever_hash_used($_POST['password']]))
{
    unset($row['pass']);
    $_SESSION['user'] = $row;
    // etc
}