我刚刚将一些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();
你需要熟悉数组。它们的"可用"程度不亚于常规变量。
有时数组甚至更可用,尤其是在您的情况下。
$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
}
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);