2015-09-18 14 views
17

これは私のPHPのSQL文で、PDO文がFALSEを返す場合varがマイPDO文は

$password_md5 = md5($_GET['password']); 
$sql = $dbh->prepare('INSERT INTO users(full_name, e_mail, username, password, password_plain) VALUES (:fullname, :email, :username, :password, :password_plain)'); 
$result = $sql->execute(array(
        ':fullname' => $_GET['fullname'], 
        ':email' => $_GET['email'], 
        ':username' => $_GET['username'], 
        ':password' => $password_md5, 
        ':password_plain' => $_GET['password'])); 
+1

自分のパスワードハッシュを__rollしないでください。 PHPは['password_hash()'](http://php.net/manual/en/function.password-hash.php) と['password_verify()'](http://php.net/manual/ en/function.password-verify.php)それらを使用してください。 ここにいくつかの[パスワードに関する良いアイデア]があります(https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) 5.5より前のバージョンのPHPを使用している場合は、[互換パックがあります](https :// github。com/ircmaxell/password_compat) – RiggsFolly

答えて

22

をダンプしながら、それはfalseを返します、それはクエリが失敗したことを意味動作しません。エラーを認識するために、適切なエラー報告モードでPDOを設定する必要があります。

エラーメッセージを取得した後

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

を接続し、あなたはそれを読み、理解する必要があり、右後のコード内でこの行を入れてください。あまりにも明白なように聞こえますが、学習者はエラーメッセージの極端な有用性を見落としていることがよくあります。しかし、ほとんどの場合、問題はかなり簡単に説明されます。たとえば、特定のテーブルが存在しないと言われた場合、スペル、タイプミス、大文字小文字、資格などを確認する必要があります。または、SQL構文にエラーがあると表示された場合は、SQLを調べる必要があります。そして問題点はの前にの前にエラーメッセージに引用された質問部分です。

また、trustエラーメッセージが必要です。トークンの数がバインドされた変数の数と一致しないと言う場合、です。欠席しているテーブルや列についても同じです。選択肢があれば、自分の間違いかエラーメッセージが間違っているかにかかわらず、常に前者に固執する。再びそれは謙虚に思えますが、この非常に多くのサイトでは、このアドバイスは非常に便利です。


PDOエラーを確認するには、一般的にPHPエラーを確認する必要があります。そのためには、PHPを設定する必要があり、サイトの環境によって異なります。開発サーバー上の

  • 表示され、エラーがオンにされなければならないため、右画面にエラーを持っていることは非常に便利です。

    error_reporting(E_ALL); 
    ini_set('display_errors',1); 
    
  • ライブサイト上で、すべてのエラーがでなければならない一方でログインしますが、クライアントにを示すことはありません。 error_reportingE_ALLにすべての時間を設定する必要があることを

    error_reporting(E_ALL); 
    ini_set('display_errors', 0); 
    ini_set('log_errors', 1); 
    

注:このため、PHPをこのように設定します。

一般的な妄想にもかかわらず、no try-catch have to be used for the error reportingにも注意してください。 PHPはあなたにPDOエラーを既に報告し、より良い形で報告します。キャッチされない例外は開発には非常に優れていますが、カスタマイズしたエラーページを表示したい場合でもtryキャッチを使用せず、ただset custom error handlerです。簡単に言えば、PDOエラーを特別なものとして扱う必要はなく、コード内の他のエラーとみなすことができます。

+3

OPの質問にどのように答えますか? – NaijaProgrammer

+1

ありがとうございます。カタログエラーが見つかり、デバッグ中です。 – Rifthy

+3

@NaijaProgrammer idはありませんが、 "Your Common Sense"で提案されているエラー報告に基づいて回答を見つけることができます。 – DTH