2011-06-22 58 views
1

構文の問題に関して、異常なエラーが発生しています。見てみましょう。PHP PDOステートメントで致命的なエラーが発生する

public static function authenticate($_user, $_pass) 
    { 
     $sql = 'SELECT password, key 
       FROM users 
       WHERE username = ' . $_user; 

     $stm = Db::init()->prepare($sql); 
     if ($stm->execute()) 
      return $stm->fetch(PDO::FETCH_ASSOC);  
    } 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key FROM users WHERE username = testuser1' at line 1' in /class.php:111

Stack trace:
#0 /class.php(111): PDOStatement->execute()
#1 /class.php(118): Password::authenticate('testuser1', 'test')
#2 {main} thrown in /class.php on line 111

これが何を意味するのかについての任意のアイデア?

答えて

3

keyは、sqlの予約語です。あなたの質問の中でそれを囲む。このように:

public static function authenticate($_user, $_pass) 
    { 
     $sql = 'SELECT password, `key` 
       FROM users 
       WHERE username = ' . $_user; 

     $stm = Db::init()->prepare($sql); 
     if ($stm->execute()) 
      return $stm->fetch(PDO::FETCH_ASSOC);  
    } 

BTW:コードにSQLインジェクションの脆弱性があります。パラメータ化クエリを使用して、$_userの値をバインドします。

+0

Ah、ofcorse。私は明らかに新しい学校です。 '致命的なエラー:未知の例外' PDOException 'メッセージ付き' SQLSTATE [42S22]:列が見つかりません:1054未知の列 'where句'の 'testuser1' in /class.php:111スタックトレース:#0パスワード:: authenticate( 'testuser1'、 'test')#2 {main}は/class.phpをオンラインでスローします。 111 ' – grep

+0

これは、' $ _user'には引用符が付いていないからです。 – Asaph

+0

@Asaph:それはどうして重要なのでしょうか? – grep

関連する問題