0

私の簿記アプリケーションには以下のPHPがあります。PDOを使用します。

if (isset($_POST['lesson'])AND isset($_POST['page']))
{
   try {
      $options_pdo[PDO::ATTR_ERRMODE]=PDO::ERRMODE_EXCEPTION ;
      $DB= new PDO('mysql:host=localhost;dbname=mydb','jamie','admin',$options_pdo);
      $statement=$DB->query("SELECT data FROM teach_books where lesson=".$_POST['lesson']."AND page=".$_POST['page'] );

      while($results = $statement->fetch()){
         $results['data'];
         echo "<br>";
      }

   } catch(Exception $e) {
    die ('ERROR: '.$e->getMessage());
    exit;
  }

}

ただし、コードを実行すると、次のエラーが表示されます。

ERROR: 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 'page=dsas' at line 1

誰か助けてもらえますか?

4

3 に答える 3

2

いくつかのこと:

1)RAWクエリ文字列を挿入しないでください:
このコードはSQLインジェクションの影響を非常に受けやすくなっています。PDOには、「プリペアドステートメント」と呼ばれる機能があります。これは、SQLクエリに使用する必要がある方法です。結果としてセキュリティホールになるため、POSTパラメータをクエリ文字列に挿入するだけではいけません。誤ってクエリに挿入した引用符は、悪意のあるユーザーがSQL攻撃を試みたものである可能性があります。

2)
スペースがありません:ANDの直前にスペースがありません。パーサーは2ANDという用語をどうすればよいかわからないため、エラーが発生します。iteslfによるSQLは次のように拡張されます。

SELECT data FROM teach_books where lesson=2AND page=24;

3)引用符がありません:
上記のようなものを使用する場合は、クエリの最後にいくつかの終了引用符を追加する必要があります。また、select内で指定する文字列パラメータを引用符で囲む必要があります。

4)エコーデータ:
ループ内で実際に何も出力していません。PHP内にステートメントを配置するだけでは、それは出力されません。エコーコマンドが必要です。

echo $results['data'];

5)オブジェクト
の反復: fetch()を呼び出し続ける必要はありません。fetchAll()を使用して、その結果セットを反復することができます。実際には、配列内の行が必要な場合を除いて、「フェッチ」メソッドを呼び出さないでください。結果セットオブジェクトは反復可能であり、ループすることができます。

$statement->execute(); 
foreach ($statement as $row) { 
    ... 
}  

6)TRY-CATCH:
おそらく、「try-catch」コードを削除できます。これは、そこで行っていることは、とにかく例外が行うことであるためです。

さらに、「admin」が実際のパスワードではないことを願っています。

私の答えに追加し続けてすみません。6つのポイントを自分で投稿してから拡張したかっただけです。

お役に立てば幸い

于 2013-02-18T12:06:56.957 に答える
0

SQLが間違っているので、試してみてください。

$statement=$DB->query("SELECT data FROM teach_books where lesson='".$_POST['lesson']."'AND page='".$_POST['page']."'" );

文字列値を比較しているので、SQLクエリで''を使用する必要があります。

于 2013-02-18T12:06:35.343 に答える
0
ERROR: 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 'page=dsas' at line 1

問題はおそらく、値に引用符を追加しなかったことが原因です。

".... page='".$_POST['page']."'"

文字列は常に引用符で囲む必要があります。

于 2013-02-18T12:06:51.323 に答える