• ベストアンサー

POSTの値をSQL内で使う場合

某サンプルで次のようなサンプルがありました。 where (isbn like '%$isbn%') たぶん、resister_globals = on の時代に動いていた サンプルだと思います。 Offの場合、これを $_POST[isbn]とやっても動くのですが ''もしくは""でisbnを囲うとしたら、どのようにすると いいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

普通に考えるのであれば $where = " WHERE isbn LIKE '%".$_POST["isbn"]."%'"; こうなります SQLインジェクションできる書き方 使い方ですので、実際にこのコードを使ったらセキュリティ的には穴だらけだと思ってください。 本来ならば、プリペアドステートメントとか使うので実際にはこんな書き方しませんけどね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

文字列内の変数展開ですね。 "where (isbn like '%{$_POST[isbn]}%')" のように、{ }で変数の範囲を明確にしてあげれば、PHPで、どこまでが変数か理解できます。 文字列の連結でもできますが、可読性はこちらの方がいいかも? ただ、SQLインジェクションの危険があるとのinu2さんの指摘はもっともです。 DBのアクセスに何をお使いかによって、変わってきますが、prepare、executeを使って、2段階実行をするか、PEAR::DBでしたら、3引数のqueryを使ってください。

tss_jp
質問者

お礼

ご回答いただいた方々、どうもありがとうございました。 文字列の処理方法はわかりました。 SQLインジェクションの件は、また勉強したいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 他ホストからのPOSTを防ぐ方法

    php.iniのregister_globalsをOffにすることで不要な GETパラメータを受け付けないようにすることができますが、他ホストから、<form metho=POST acrion=http://***.com/xx.php> などとした場合、他ホストからPOSTできるわけで、 結局、他ホストからPOSTできないようにしないとrgister_globalsをOnにした時と、セキュリティーはあまり変わらないようか気がするのですが、 他ホストからPOSTできなくする方法はありますでしょうか? 現在、思いつくのはPHPに限らず以下の方法ですが、 いずれも完璧ではないような気がします。 1.refererチェック(100%で有効ではないらしい) 2.Sessionによる認証チェック(認証済みユーザなら結局、同一ブラウザを使い他ホストのページからPOSTできる)

    • 締切済み
    • PHP
  • 検索フォームからPHPに変数が渡せない際のSQL文の記述方法

    フォームから検索して結果リストを出力する、のような仕組みで、 ■フォーム <form method="post" action="result.php" name="query"> <input size="25" type="text" name="booktitle"> を含む</td> ■PHP内のSQL $sql = "SELECT * FROM MYDB WHERE BOOK LIKE '%$booktitle%') "; としても、変数「booktitle」が渡せません。 調べてみると「register_globals」の設定でFAQ化していることは なんとなく理解できました。register_globalsをONにすることは できないのですが、この場合SQL側の「'%$booktitle%'」の部分には なんと記述したらよいでしょうか?

    • ベストアンサー
    • PHP
  • regsiter_globalsがoffの場合の処理

    regsiter_globalsがoffの場合の 引数の渡し方と受け取り方を教えていただきたいです。 regsiter_globalsがonの場合は、 「http://****/test.php?test=1」 こんな感じでできたのですが、 offの場合はどのようにすれば良いのでしょうか? 参考になるページでも良いので、教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLでWHERE条件が効かない

    環境: PHP 5.0.3 MySQL 4.0.14b(Win)(←古いこと承知) IIS 5.1 『いますぐ導入!PHP+MySQLで作る最速Webシステム』という入門本のサンプル プログラムを使って勉強していますが、SQLのWHERE文が効かず全レコードが 出てきてしまいます(同書は PHP 4.3.1 を前提に書かれます) 単純に、書籍のISBN、タイトル、価格などが収められたサンプルデータベースで、 こういう↓ search_form.htm から sample.php にPOSTしてます。 書籍タイトル<INPUT size="44" type="text" name="title" maxlength="100"> を含む sample.php は、上記などに入力された検索文字列でWHERE条件で絞込みます。 一部抜粋しますと: | //SQL文を組み立てます(フォームの値をWhereに指定) | $sql = "select * from bookinfo | where (isbn like '$isbn%') and | (title like '%$title%')"; | //priceは指定されているときだけSQL文に追加 | if (strlen($price) > 0) { | $sql .= " and (price <= $price)"; | } | $sql .= " order by isbn"; | | //SQL文の確認用(デバッグ時のみ使用します) | print $sql; どの検索条件を入力しても全レコードが出力してしまうので、上記抜粋の 最後の行のコメントを有効にしたところ、こういうSQL文を吐き出しており、 入力した文字列が有効になっていません。 select * from bookinfo where (isbn like '%') and (title like '%%') order by isbn 対応方法につき、ちょっと見当がつかないのですが、何かお心当たりが ありましたらご教示いただけますと幸いです。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • MYSQLで複数の値を検索して取得するには?

    お世話になります。 MYSQLとPHPを見よう見まねでやっている超初心者です。 $_POST['sample']はチェックボックスから取得してきたので複数の値があります。 その複数の値をwhere data = $where";にしてdataから複数の検索結果を取得したいと思っているのですが、下記のように書くと複数ある$_POST['sample']の一つしか検索取得できません。 $_POST['sample']の複数の値の検索結果を取得するにはどうすればよろしいのでしょうか? 基本的な事がわかっていない超初心者ですので できれば具体的な式を教えて頂ければ大変助かります。 ご教授よろしくお願い致します。 if (isset($_POST['sample'])) { for ($i = 0; $i < count($_POST['sample']); $i++) { $where ='' . h($_POST['sample'][$i]) . ''; } } function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ///// $sql = "select * from test where data = $where"; $result = mysql_query( $sql );

    • ベストアンサー
    • PHP
  • この場合のSQLを教えてください

    たとえばTESTという列(フィールド?)の中に以下のようなデータがあった場合、 AAAAA AABBB CCCAA ABCAA BCAAA AACAA CCACC ABCAA この中から、'AA'があって'B'が入っていないデータを取り出すには どうすればよいか教えてください。 AAが入ったデータを取りだす WHERE TEST LIKE '%AA%'までしか思いつきません・・・ わかりにくかったら補足しますので、よろしくお願いします。

  • クラスについて

    今作っているプログラムのソースが以下のようです <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <input type="hidden" name="ie" value="UTF-8"> <title>7-4 MySQLクラスでのデータの表示</title> </head> <body> <b>入力された条件&nbsp;&nbsp;&nbsp;&nbsp;</b> <?php // 検索条件の表示 print "直接入力:"; print $_POST['chokusetsu']; print "&nbsp;&nbsp;&nbsp;&nbsp;読み:"; print $_POST['yomi']; print "&nbsp;&nbsp;&nbsp;&nbsp;画数:"; print $_POST['kakusuu']; print "&nbsp;&nbsp;&nbsp;&nbsp;部首:"; print $_POST['busyu']; print "&nbsp;&nbsp;&nbsp;&nbsp;の検索結果"; $search_key1 = addslashes($_POST['chokusetsu']); $search_key2 = addslashes($_POST['yomi']); $search_key3 = addslashes($_POST['kakusuu']); $search_key4 = addslashes($_POST['busyu']); //print $search_key1; //$search1にはきちんと値が入っている require_once("mysql.php");// MySQLへのID・パスワードの取得をするファイルへのアクセス //require_once("kanjiteigi.php"); //ユーザ定義関数ファイルへのアクセス function kensaku($str1,$str2,$str3,$str4){ $GLOBALS["mysql"] = new MySQL; $GLOBALS["sql"] = "SELECT * FROM tankanji WHERE kanji like '%$str1%' AND (onyomi like '%$str2%' OR kunyomi like '%$str2%') AND kakusuu like '%$str3%' AND busyu like '%$str4%'"; $GLOBALS["mysql"]->query($GLOBALS["sql"]); } // 検索条件を変数に代入してDB内を検索 kensaku($search_key1,$search_key2,$search_key3,$search_key4); //print $sql; //$mysql->query($sql); ?> //require_once("kanjiteigi.php");このような形でコメントアウトしてますが、本当はkanjiteigi.phpの中に function kensaku($str1,$str2,$str3,$str4){ $GLOBALS["mysql"] = new MySQL; $GLOBALS["sql"] = "SELECT * FROM tankanji WHERE kanji like '%$str1%' AND (onyomi like '%$str2%' OR kunyomi like '%$str2%') AND kakusuu like '%$str3%' AND busyu like '%$str4%'"; $GLOBALS["mysql"]->query($GLOBALS["sql"]); } と記述している関数をいれて参照してきたいのですが、kanjiteigi.phpにどのような記述をしていいかで悩んでいます。グローバル変数とかもややこしくて… どなたかクラスに詳しい方おられますでしょうか?? ちなみにkanjiteigi.phpの中に <?php class kanjiteigi{ // ●:ユーザ定義関数 // ○ demo1.htmlで入力する検索条件を入力し、その条件で検索するSQL文の発行し、DB内を検索 // ($str0=検索するDBのテーブル名、$str1=漢字、$str2=読み、$str3=画数、$str4=部首) // DB内を検索 var $mysql; var $sql; function kensaku($str1,$str2,$str3,$str4){ $GLOBALS["mysql"] = new MySQL; $GLOBALS["sql"] = "SELECT * FROM tankanji WHERE kanji like '%$str1%' AND (onyomi like '%$str2%' OR kunyomi like '%$str2%') AND kakusuu like '%$str3%' AND busyu like '%$str4%'"; $GLOBALS["mysql"]->query($GLOBALS["sql"]); } } ?> としてもダメでした

    • 締切済み
    • PHP
  • like で検索をすると出る場合と出ない場合がある理由は?

    MySQLに郵便番号データ(UTF-8)を入れて、phpmyadmin内で以下のように検索をかけました。 SELECT * FROM `post` WHERE `city` LIKE '%吾川郡いの町%' これは無事抽出されました。 ところが、以下を実行すると何も抽出されません。 SELECT * FROM `post` WHERE `city` LIKE '%いの町%' 範囲を広げたのに何故・・・という感じなのですが、考えられる要素は何かお分かりでしょうか。

    • ベストアンサー
    • MySQL
  • SQLの高速化

    http://okwave.jp/qa/q8328454.html にて解決済みとしてしまいましたが、問題がありました。 クロス結合になってしまい、重複した結果が出力されてしまいます。 1個の結果だと1個の出力ですが、2個の結果だと4個の出力となってしまい、2乗できいてきてしまいます。 ご教示のほど、よろしくお願いいたします。 ---------------------------------------------------------------- 下記SQL文と同一の結果を出力しつつ、高速化は可能ですか? ARCHIVE_SAMPLEとARCHIVE_ORDERが大きくなると著しくパフォーマンスが下がります。 ARCHIVE_ORDERにて検索をかけた結果のArchiveIDとOrder_SampleIDが一致するARCHIVE_SAMPLEを出力したいです。 データサイズとしては、ARCHIVE_ORDER<<ARCHIVE_SAMPLEなので、ORDER側で検索しています。 SELECT * FROM ARCHIVE_SAMPLE M WHERE M.ArchiveID IN (SELECT ArchiveID FROM ARCHIVE_ORDER WHERE UPPER(Order_PatientID) LIKE UPPER('%234%')) AND M.Order_SampleID IN (SELECT Order_SampleID FROM ARCHIVE_ORDER WHERE UPPER(Order_PatientID) LIKE UPPER('%234%')) ----------------------------------------------------------------

  • SQLのBetween句

    SQL初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(SQLは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このSQLについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・OracleDatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■SQL SELECT * FROM sample1 s1, sample2 s2 WHERE TO_CHAR(SYSDATE -2, 'YYYYMMDD') BETWEEN s1.STAYMD(+) AND s2.(+)