【问题标题】:PDO prepared statements : How to execute, check affected rows, then fetch a fieldPDO 准备好的语句:如何执行,检查受影响的行,然后获取一个字段
【发布时间】:2012-01-28 06:45:00
【问题描述】:

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

【问题讨论】:

标签: php mysql pdo prepared-statement


【解决方案1】:

我猜你要找的是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 ),你可以使用。

【讨论】:

  • 很好的答案!但我收到错误PDOStatement::execute() expects parameter 1 to be array, string given$stmt->execute($email); 行。为什么它期望$email 是一个数组?
  • 如果您使用命名参数,execute 需要一个关联名称 => 值数组。再看一下我的代码,我正在使用compact 来创建该数组。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2012-05-18
    • 2011-04-09
    • 1970-01-01
    • 2020-03-15
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多