簡體   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