2016-07-10 6 views
0

コマンドラインからは動作しますが、PHPでは動作しないMySQLクエリがあります。PDOクエリはPHPからではなくCLIから動作します

私が間違っていることを誰も見ることができますか?

$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と言うことができますか?あなたが忘れてしまった

答えて

2

あなたは忘れた​​です。

実際に$password` is `4192dee2f886e99ececbb2eee0d2f37f11257974の場合、sha1()を2回実行する必要があります。バインド行からsha1()を削除するか、$ passwordをクリアにしておいてください。

私は、データベースの列 "passwordHash"の名前を付け、変数が平文の場合は$ passwordか、すでにsha1()を実行している場合は$ passwordHashを指定することをお勧めします。そのようにして、あなたは書いたでしょう。

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

そしてすぐに余分なsha1()呼び出しを見つけたでしょう。

+0

D'oh!さて、完了です。私はあなたに私のキャップをdoff – Mawg

4

execute私が思う:

$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); 
+1

** D'oh!**:DDDDDDDD – Chay22

+3

私はそれがまだ動作するとは思わない。 'bindParam'は変数参照を必要とします。 'sha1($ password)'の結果を 'bindParam'で使われた変数に保存するか、' bindValue'を代わりに使う – Phil

+0

本当にありがとう、修正済み。 – michaJlS

1

あなたは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); 
1

でクエリを実行するために$query->execute();を呼び出す必要がありprepareメソッドだけあなたが渡されたSQL文を準備し、 preparedstatementオブジェクトを返します。

前述のように、結果セットを戻すには、paramsを設定して実行する必要があります。

セキュリティの他に準備されたステートメントの利点は、同じSQLクエリ文字列を繰り返しコンパイルするよりも高速であると考えられるpreparedstatementを繰り返し実行してパラメータを割り当てることができることです。

関連する問題