php - PDO 准备语句 : How to execute, 检查受影响的行,然后获取一个字段

标签 php mysql pdo prepared-statement

我是 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/

相关文章:

mysql - SQLSTATE[HY000] [2002] 使用 whereHas 时 Laravel 中的连接被拒绝错误

php - 管理员下 magento 中的菜单突出显示

php - 从 nodejs 向 php 发送请求时输入意外结束

javascript - 模块 MySQL Nodejs

php - 从数据库中选择数据并更新它 PHP/PDO

php - PDO:使用 mysql INSERT ON DUPLICATE KEY UPDATE 检查更新或插入的记录

php - 如何使用 jQuery 刷新数据库查询

PHP做一个冒号: in an array key have any special significance?

php - 类似 mysql 的查询无法在浏览器上运行

java - 我有 hibernate 错误