我刚刚将一些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();
答案 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
}