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 ),你可以使用.