[英]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);
并且$result
是false
。
但是,从命令行,
SELECT * FROM customers WHERE login_name="a"
AND password="4192dee2f886e99ececbb2eee0d2f37f11257974"
作品。
当我调试userName
是a
并且$password
是4192dee2f886e99ececbb2eee0d2f37f11257974
。
有人可以让我说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.