• ベストアンサー

PHP prepare フィールド名をエスケープ

PHPのPDOを用いて、mysqlにクエリを発行する際、 prepare() と bindParam() でエスケープをしています。 しかし、フィールド名やテーブル名をエスケープしようとした場合、 プリペアドステートメントを利用することができません。 例えば 「SELECT * FROM table WHERE {$sample} = :test」 のような状態です。 このような場合、どうやって変数部分を安全にエスケープすべきなのでしょうか?

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

フィールド名やテーブル名が動的に変わると言うことですよね。そういう必要が無いように設計を根本から見直すというのが正しい対処法だと思います。 あらかじめテーブル名一覧、フィールド名一覧を用意して、それらと完全一致するかどうかを判断するのでしょうかね。

その他の回答 (1)

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.2

まずフィールド名をエスケープする意味とは? このフィールド名の変数の何からセットされるのですか? 通常ではフィールド名をエスケープさせる意味が無いと思いますが... また、PreparedでSQLを実行してるのに、わざわざエスケープさせるのですか? ちょっと、何をされようとしているのか意図が見えません。

django13
質問者

補足

実際には連想配列のキーをフィールドとしてセットする予定ですが、 セッションから渡すので万一書き換えられた場合のことを考慮しなくていいのか不安だったのです。

関連するQ&A

  • 【PHP】PDOでのMysqlから値を取り出す時に

    現在phpを勉強しております。 PDOオブジェクトを生成し、 prepareメソッドでMySQLで実行するクエリをセットして executeメソッドで実行する。 というのを以下のようにしております $pdo= new PDO($dsn, $user, $password); $query = "SELECT * FROM table_name"; $stmt = $pdo->prepare(); $stmt->execute; で、この場合でも正常に動くのですが MySQL内のテーブルに「?」が含まれる場合だと $query = "SELECT * FROM table_name?test"; $stmt = $pdo->prepare(); $stmt->execute; とすると$queryの「?」をバインド変数とみなしてしまい エラーで「?の数とバインド先の変数の数を合わせろ」と出てしまいます。 ですので、「?」をエスケープしようと思い $query = "SELECT * FROM table_name\?test"; としたのですが、結局エスケープされず 同じエラーが出てしまいました。 エスケープできるならエスケープの方法か ?をバインド変数としてみなさない方法か または他の解決方法かを よろしければご教授願います。

    • ベストアンサー
    • PHP
  • phpからsqliteにselect抽出

    phpからsqliteにselect抽出しています。 $sql = "select * from Table where C=?" $st = $db->prepare($sql); $st->bindParam(1, $key, PDO::PARAM_STR); $st->execute(); while ($row = $st->fetch(PDO::FETCH_ASSOC)) { *** *** } でエラーにはなりませんが、データがとれません。 updateやinsertで?(インジェクション)はうまくいくのですが、Selectでなぜ取得できないのでしょうか? bindParamをarrayにしたりprepare をqueryにしたりしましたが、 データが1件しか取れなかったりします。

    • ベストアンサー
    • PHP
  • PDOのprepareでLIKEの部分一致が使えません・・

    http://d.hatena.ne.jp/Sybian/20070521/p1 のサイトの例のように、LIKE '%文字列%' をprepareしようとしたのですが上手く結果が返りません。 PDOのプリペアステートメントは、 LIKEの部分一致や先頭一致に非対応なのでしょうか? $query="SELECT * FROM table WHERE id=:id OR like name='%:name%'"; $pdo=new PDO('mysql:host=localhost;dbname=database','user','password'); $stmt=$pdo->prepare($query); $stmt->bindValue(':id',$id,PDO::PARAM_INT); $stmt->bindValue(':name',$name,PDO::PARAM_STR); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC);

    • ベストアンサー
    • PHP
  • PDOクラスのprepareメソッドについて。

    いつもお世話になっております。 PHP5.2.5 1|$conn = new PDO($dsn,~略~);   //データベース接続 2|$sql = "略";             //SQL文 3|$stmt = $conn->prepare($sql);   // PDOStatementオブジェクトを返す 4|$stmt->bindParam(~略~);     //プレースホルダに変数をバインド 5|$stmt->execute();         //クエリ実行 という、よくある流れにおいて、 4行目のbindParamメソッドは、PDOクラスのメソッドではなく、 PDOStatementクラスのメソッドだと思うのですが、 これを、$stmt-> で呼び出せているのが、どうしてなのかがよく分からずにいます。 3行目で、PDOクラスのprepareメソッドを使うことで、 PDOStatementオブジェクトが返されるため、 その返り値を受け取った「$stmt」によって、 「$stmt->bindParam」できているという感じでしょうか? ★まず、この私の考え方について、合っているか間違っているか、 お聞きしたいと思います。(質問1) //=================================================== 恐らく、上記の考え方は「合っている」のだと思うのですが、 その上で、さらに質問をさせて頂くと、 ではなぜ、PDOStatementクラスを使う時に、 new PDOStatement; というようにしないのでしょうね? PDOクラスの1メソッドであるprepareメソッドを使うようにして、 PDOStatementクラスをインスタンス化しているのはなぜなのでしょう? (prepareメソッドはどういうコードになっているのでしょう?その中で、new PDOStatement という記述があるのでしょうね?) PDOのこのような仕様の背景には、どういう意図があるのか、 どなたか何か思い当たることなどありましたらご助言下さい。 (質問2)

    • ベストアンサー
    • PHP
  • フィールド名を変数で指定するには

    $device = 'a'; $Field = $device.'_type'; $sql = 'select "'.$Field.'" from table where member_id = "'.$id.'"'; $res = mysql_query($sql); $row = mysql_fetch_assoc($res); if ($row){ echo $row[$Field]; } $row[$Field]をechoで表示すると『a_type』と表示され、中身が表示されません。 フィールド名を変数ではなくa_typeと直接入力すると正常な結果が表示されます。 ちなみにtableにはa_type、b_type、c_typeテーブルが存在します。 ドコモからのアクセスはa_type、auからはb_typeと、ユーザーエージェントによって分けています。 フィールド名を変数で指定して値を取得するには、どのようにすればよいでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • PHP PDO prepare後のsql変更

    $sql = "select item from items"; $pdo->prepare($sql); とした後に $sql に where 句を後付でつけることなど出来ますか?

    • ベストアンサー
    • PHP
  • MySQLからフィールド名のリストを取り出し、一部のフィールド名を除外したい場合

    PHP + MySQLにて テーブルからフィールド名だけを取得し、さらに一部のフィールド名を除外したいです。 レコードじゃないのでis not構文は使えませんでした。 何かいい方法があれば教えてください。 $sql = "select * from table"; //tableテーブルからフィールド名を取り出し $rs = mysql_query($sql); $fields = mysql_num_fields($rs); $column = array(); for ( $i=0; $i<$fields; $i++ ) { $column[$i] = mysql_field_name($rs, $i); }

    • ベストアンサー
    • MySQL
  • PHP(prepareについて)

    html(fromタグ)→php(fromの受取)→db(データベース)→php(出力) ということをやりたいのです。htmlからの送信はできているのですが、 エラーがphp文の中にあるexecute();メゾッド部分に起こります。どうすれば直りますか? PHP <?php try{ $dbh=new PDO("mysql:dbname=blog;host=localhost","root",""); $sth=$dbh->prepare("select * from id where id=:id"); $sth=$sth->bindValue(":id",2,PDO::PARAM_STR); $sth=$sth->execute(); $result=$sth->fetchALL(); print_r($result); }catch(Exception $e){echo $e->getMessage();} ?>

    • ベストアンサー
    • PHP
  • PDOのデータ取得方法について

    お世話になります。 以前まで「mysql_query」でSQLを実行していたのをPDOで行うように変更しております。 prepareの「?」の部分までのSQLにした場合(1)、データ取得出来ますが (2)ですとエラーも返ってこなくデータ取得出来ません。 色々と試してはいますが、全く出来なくて大変困っています。どうかご教示くださいませ。 1)SELECT * FROM table WHERE data_code = ? and data_code2 = ? 2)SELECT * FROM table WHERE data_code = ? and data_code2 = ? and (data_code3 = "null" or data_code3 is null or data_code3 = "") ※PHP5.3、MySQL5.0です。

    • 締切済み
    • PHP
  • pdoでバインドしない場合のデメリット

    $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(); 上記ではなく $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->execute(array($calories,$colour)); のようにbindParamやbindValueを使わない場合は危険はあるのでしょうか? ご教示頂けますと幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう