繁体   English   中英

PDO查询可通过CLI而不是PHP进行

[英]PDO query works from CLI, not from PHP

我有一个MySQL查询,可以从命令行运行,但不能从PHP运行。

谁能看到我在做什么错?

$sqlText = 'SELECT FROM customers WHERE login_name=:name 
                                  AND password=:password';
$query = $pdo->prepare($sqlText);
$query->bindParam(':name', $userName);
$query->bindParam(':password', sha1($password));
$result = $query->fetch(PDO::FETCH_ASSOC);

并且$resultfalse

但是,从命令行,

SELECT * FROM customers WHERE login_name="a" 
                        AND password="4192dee2f886e99ececbb2eee0d2f37f11257974"

作品。

当我调试userNamea并且$password4192dee2f886e99ececbb2eee0d2f37f11257974

有人可以让我说D'oh吗?

我想您已经忘记了执行

$sqlText = 'SELECT FROM customers WHERE login_name=:name AND password=:password';
$query = $pdo->prepare($sqlText);
$hash = sha1($password);
$query->bindParam(':name', $userName);
$query->bindParam(':password', $hash);
$query->execute();
$result = $query->fetch(PDO::FETCH_ASSOC);

您忘记了execute()

而且,如果$password` is `4192dee2f886e99ececbb2eee0d2f37f11257974实际上$password` is `4192dee2f886e99ececbb2eee0d2f37f11257974 ,那么您必须两次运行sha1()。 从绑定行中删除sha1(),或将$ password保留为空白。

我建议命名数据库列“ passwordHash”,如果变量是明文,则命名为$ password;如果已经在其上运行sha1(),则命名为$ passwordHash。 这样,你会写

$query->bindParam(':passwordHash', sha1($passwordHash));

并立即发现了额外的sha1()调用。

您必须调用$query->execute(); 在PDO中执行查询

$sqlText = 'SELECT FROM customers WHERE login_name=:name AND password=:password';
$query = $pdo->prepare($sqlText);
$query->bindParam(':name', $userName);
$query->bindParam(':password', sha1($password));

$query->execute();

$result = $query->fetch(PDO::FETCH_ASSOC);

prepare方法仅准备您传入的sql语句,并返回preparestatement对象。

如上所述,您需要设置参数并执行它以返回结果集。

除安全性外,prepared语句的优点在于,您可以重复分配参数并执行PreparedStatement,这比一次又一次地编译相同的sql查询字符串快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM