我是 PDO 的新手 - 今天早上才被告知要朝那个方向前进。所以,听我说完。我正在尝试将我的登录验证函数从标准 mysql_query()
重写为 PDO 准备语句,但我遇到了一些问题。
函数 loginCheck() 传递提供的电子邮件和密码,然后从匹配的电子邮件中获取盐,如果该查询的受影响行数为 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 class 的文档看起来像:
PDO {
...
PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
...
}
这意味着一个 PDO 对象(在你的例子中是 $dbh
),有一个方法 prepare
返回一个 PDOStatement
对象。您正在这样使用它:
$stmt = $dbh->prepare(...);
所以$stmt
是一个PDOStatement
对象。知道这一点你可以看看 documentation for PDOStatement
, 并看到它有一个方法 int PDOStatement::rowCount ( void )
,您可以使用它。
关于php - PDO 准备语句 : How to execute, 检查受影响的行,然后获取一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8640920/