[英]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.