Php PDO准备的语句:如何执行、检查受影响的行,然后获取字段
我对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) ==
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
创建该数组。