2017-07-09 14 views
1

私はprepare文に渡す変数を次のようにします:$ subject。 PDOを使用して実行されます。残念ながら、それは一重引用符で渡されています。例として、私は数学を渡し、代わりに「数学」を使用しています。 bindParam、bindValueなどの他の答えを試してみましたが、それを文字列属性として指定していますが、動作させることはできません。誰もが間違っていることを知っている場合は、事前に感謝私のコードは以下のとおりです。PHPとMYSQLを使用して単一引用符で渡される変数

$query = "SELECT * FROM :subject;"; 
     $sql = $connection->prepare($query); 
     $sql->bindParam(':subject', $subject); 
     try{     
      $sql->execute(); 
     }catch(Exception $e){ 
      echo $e; 
     } 

、私は次のエラーを取得する:

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 ''maths'' at line 1' in D:\xampp\htdocs\acards\functions.php:18 
Stack trace: 
#0 D:\xampp\htdocs\acards\functions.php(18): PDOStatement->execute() 
#1 D:\xampp\htdocs\acards\getMathsQuestions.php(13): Functions->getFeed('maths') 
#2 {main}[] 
+0

クエリからセミコロンを削除します。 'SELECT * FROM:subject' – Zooly

+0

私はまだ同じエラーを取得しようとしました –

答えて

1

問題はここにある:

"SELECT * FROM :subject;"; 

bindParamwhere句で使用されたパラメータではなく、テーブルで使用されています名。

正しい構文は次のとおりであるように:

$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < :calories AND colour = :colour'); 
$sth->bindParam(':calories', $calories, PDO::PARAM_INT); 
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); 
$sth->execute(); 

Reference

+0

私はそれを行う方法はありませんステートメントでWHEREを使用したいのですか? –

+0

その場合は 'bindParam'を使わないで' 'SELECT * FROM table";のようなクエリで 'execute()'を使うだけです; –

+0

テーブル名をパラメータとして渡して指定することはできませんか? –

1

あなたには、いくつかのPHPロジックを提供することにより、入力するユーザーは、テーブル名は、あなたがそうすることができることができ、「柔軟な」クエリを作成したい場合あなたは

$query="SELECT * FROM $subject"; 

しかし、もちろん、これはSQLインジェクションの任意の種類のクエリを開くのと同じようprepareステートメントに到達する前に。しかし、あなたはこの文でそれを使用する前に$ subjectに対してあなた自身の "入力墨塗り"を作成することを許可されていないと言っていますか?これは非常に慎重に行う必要があることにご注意ください!

関連する問題