PDO 准备好的语句:如何执行、检查受影响的行,然后获取字段

问题描述 投票:0回答:3

我对 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 手册,但我根本无法理解其中的大部分内容。有什么想法吗?

php mysql pdo prepared-statement
3个回答
14
投票

我猜你要找的是

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 )


2
投票

这是我最喜欢的 PDO 教程。它回答了您所有的问题:


0
投票

$statement = $dbh->prepare("从电子邮件 = 的用户中选择 *"); $语句->执行(数组(电子邮件)); 1. $email = "[电子邮件受保护]";

$sql =“从用户中选择*,其中电子邮件='”+电子邮件+“'”;


[电子邮件受保护]

  1. 列出项目

***$statement = $dbh->prepare("从电子邮件 = 的用户中选择 *"); $语句->执行(数组(电子邮件)); 斯德明卡

© www.soinside.com 2019 - 2024. All rights reserved.