我对 PDO 非常陌生 - 今天早上才被告知朝那个方向前进。那么,听我说完。我正在尝试将登录验证函数从标准
mysql_query()
重写为 PDO 准备好的语句,但我遇到了一些问题。
函数loginCheck()传递提供的电子邮件和密码,然后从匹配的电子邮件中获取salt,如果该查询受影响的行数为1,则将变量
$salt
应用于该查询的结果。
对于函数的后半部分,我之前只是使用:
// standard mysql query goes here
if (mysql_num_rows($query) == 1) {
$salt = mysql_result($query, 0);
}
现在我的整个函数如下所示:
// new mysql query below
global $dbh;
$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`=? LIMIT 1");
$stmt->execute($email);
// not sure what to write here?
但我无法理解如何将代码的最上面部分转换为 PDO 中的类似内容。我也可能在这里做错了其他事情(一如既往),所以也请向我指出。
我浏览了 PHP 手册,但我根本无法理解其中的大部分内容。有什么想法吗?
PDOStatement::rowCount
:
$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`=? LIMIT 1");
$stmt->execute($email);
if ($stmt->rowCount() == 1) {
$salt = $stmt->fetchColumn(0);
}
我宁愿这样写:
$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`= :email LIMIT 1");
$stmt->execute(compact('email'));
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
// work with $user['salt']
}
显式命名比依赖列数更稳健。
要理解本手册,您需要了解面向对象的符号/概念。 PDO 类的文档如下所示:
PDO {
...
PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
...
}
这意味着一个 PDO 对象(在您的示例中为
$dbh
)有一个方法 prepare
,它返回一个 PDOStatement
对象。你这样使用它:
$stmt = $dbh->prepare(...);
所以
$stmt
是一个 PDOStatement
对象。知道这一点后,您可以查看 PDOStatement
的 文档,并看到它有一个可以使用的方法 int PDOStatement::rowCount ( void )
。
这是我最喜欢的 PDO 教程。它回答了您所有的问题: