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

Rea*_*ues 4 php mysql pdo prepared-statement

我对PDO很新 - 只是被告知今天早上朝这个方向前进.所以,听我说.我正在尝试将我的登录验证功能从标准重写mysql_query()为PDO准备语句,但我遇到了一些问题.

函数loginCheck()传递提供的电子邮件和密码,然后从匹配的电子邮件中获取salt,如果该查询的受影响行数为1,则将该变量$salt应用于该查询的结果.

对于函数的后半部分,我之前只是使用:

// standard mysql query goes here

if (mysql_num_rows($query) == 1) {
    $salt = mysql_result($query, 0);
}
Run Code Online (Sandbox Code Playgroud)

现在我的整个函数看起来像:

// 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?
Run Code Online (Sandbox Code Playgroud)

但我无法理解如何将最顶层的代码转换为PDO中的类似代码.我也可能在这里做了别的错事(一如既往),所以也请指出我.

我查看了PHP手册,我根本无法理解其中的大部分内容.有任何想法吗?

dec*_*eze 13

我猜你要找的是PDOStatement::rowCount:

$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`=? LIMIT 1");
$stmt->execute($email);
if ($stmt->rowCount() == 1) {
    $salt = $stmt->fetchColumn(0);
}
Run Code Online (Sandbox Code Playgroud)

我宁愿这样写这个:

$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']
}
Run Code Online (Sandbox Code Playgroud)

显式命名比依赖列数更强大.


要理解本手册,您需要了解面向对象的符号/概念.PDO类的文档如下所示:

PDO {
   ...
   PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
   ...
}
Run Code Online (Sandbox Code Playgroud)

这意味着PDO对象($dbh在您的示例中)具有prepare返回PDOStatement对象的方法.你这样使用它:

$stmt = $dbh->prepare(...);
Run Code Online (Sandbox Code Playgroud)

所以$stmt是一个PDOStatement对象.了解这一点,你可以查看文档PDOStatement,看看它有一个方法int PDOStatement::rowCount ( void ),你可以使用.