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

Php PDO准备的语句:如何执行、检查受影响的行,然后获取字段,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,我对PDO很陌生——只是今天早上才被告知朝那个方向前进。所以,听我说完。我试图将我的登录验证函数从标准的mysql\u query()重写为PDO准备的语句,但我遇到了一些问题 函数loginCheck()传递提供的电子邮件和密码,然后从匹配的电子邮件中获取salt,如果该查询受影响的行数为1,则将变量$salt应用于该查询的结果 对于函数的后一部分,我以前只是使用: // standard mysql query goes here if (mysql_num_rows($query) ==

我对PDO很陌生——只是今天早上才被告知朝那个方向前进。所以,听我说完。我试图将我的登录验证函数从标准的
mysql\u 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 {
   ...
   PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
   ...
}
但是我很难理解如何将代码的最上面部分翻译成PDO中类似的东西。我也可能在这里做错了什么(一如既往),所以也要向我指出


我浏览了PHP手册,但我无法理解其中的大部分内容。有什么想法吗?

我想你想要的是:

我宁愿这样写:

$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']
}
显式命名比依赖列计数更健壮


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

// 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 {
   ...
   PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
   ...
}
这意味着PDO对象(
$dbh
在您的示例中)有一个方法
prepare
,该方法返回一个
PDOStatement
对象。您是这样使用它的:

$stmt = $dbh->prepare(...);

因此,
$stmt
是一个
PDOStatement
对象。了解了这一点,您可以查看,并看到它有一个方法,您可以使用。

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


已经看到了,该页面没有具体回答我的问题。回答得很好!但是我得到的错误是
PDOStatement::execute()期望参数1是数组,字符串是
$stmt->execute($email)行给出的
。为什么它希望
$email
是一个数组?如果使用命名参数,
execute
需要一个关联名称=>value数组。再次查看我的代码,我正在使用
compact
创建该数组。