• 締切済み

trim()のタイミング

Web-DBといえば、PHPが一番と思っているのでこのジャンルで質問させていただきます。 DBのChar型データと入出力を行う時、trim()を用いますが、どのタイミングで使うと良いのでしょうか? プログラムとSQL上で以下4個所が考えらます。 ・フォーム送信された変数 ・SQLのINSERTする項目 ・SQLのSELECTした項目 ・SQLのWHERE条件

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

みんなの回答

noname#3574
noname#3574
回答No.2

osamuy さんのおっしゃられている原則に賛成です。 参考URLにIPAのセキュアプログラミング講座を案内します。セキュリティに関わらずデータに必要な加工をかけるのはいつかが適切かを解説とともに示してくれます。 で、Char型からのtrimとおっしゃっているのでおそらくDBにストアされた際にchar型の長さに従って補充された空白を削るタイミングですよね、、? なので今回の原則に従えば 「利用する時に削る」 のが適当なのではないかと思います。 例えばパスワードをフェッチして照合するならその照合を行う際に例えば if ($_POST['passwd'] = trim($db->password)) とやればいいのではないかと、、 もしくは処理が散らばってメンテナンス性を欠くことが問題になるなら PEAR::DB_QueryTool のようなクラスを利用して処理を統一し加工も集約してしまうという手もあります。 蛇足ながら > 同じtrim()を何度も記述しているプログラマって結構いまよね 昔某大手コミュニティサイトが多重サニタイジングでセキュリティホール作っていましたw trim ならかわいいものですが余計な処理はバグやセキュリティホールの元になりかねないので他山の石としたいものです =P

参考URL:
http://www.ipa.go.jp/security/awareness/vendor/programming/index.html
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

一般的に言えば、「必要になるまでは無駄な事をしない」ですが、そもそもtrimする必要があるなら、その空白自体がムダと考えられますので、フォームから送られてきた時点で、trimしといた方が良いと思います。 同じtrim()を何度も記述しているプログラマって結構いまよね。

matchori
質問者

お礼

十分、参考になりました。感謝します。

関連するQ&A

  • where句中のtrim関数について

    いつもお世話になっております。 今回は標題の件について、ご教授下さい。 カラム「XXX_CODE」はCHAR(3)の項目です。 この項目が半角スペース(△)のものを条件としてレコードを引き当てたいときに、以下のSQLではうまくデータが取得できません。 trim関数の使い方に誤りがあるのでしょうか。 ◆データ XXX_NO    XXX_CODE -------------------------------- 111     100 222     △△△ 333     200 ◆SQL select XXX_NO from hoge where trim(XXX_CODE) = '' ◆結果 該当レコードなし (本来なら「XXX_NO = 222」のデータを取得したい) 初歩的なことかも知れませんが、ご回答頂ければ幸いです。 よろしくお願いいたします。

  • 条件式にtrimを入れたい

    Mysqlでselectする時に、条件で指定した値とDB内のデータをtrim(空白除去)した値が一致したレコードを抽出されるようにしたいのですが・・・ 例えば、 あるテーブルの項目aaaの値が'あ いうえお'だとします。 条件式を where aaa='あいうえお' とした場合でもヒットさせたいのですが、どうすれば良いのでしょうか? aaaの値の空白を除去したものと一致すればいい、という事で select aaa from テーブル where trim(aaa)='あいうえお' ↑このようなイメージなのですが・・・ どなたか簡単なやり方を知っていれば教えて頂けませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • MYSQLでストアドプロシージャの引数を二つ

    MYSQL初心者で参考書にかじりついてプログラミングしています。 主にDBの内容をPHPで吐き出させるといった使い方をしています。 SQL文があまりにも長ったらしくなってきたのでストアドプロシージャを使いたいのですが、使っているSQL文が (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.') UNION (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.'); となっており、引数を複数使えないとスッキリさせられない状況です。 ストアドプロシージャで複数の引数を設定することはできないのでしょうか?

    • ベストアンサー
    • MySQL
  • Zend_DBを使ったselectで文字が途切れてしまいます

    Zend_DBとSQL Server2005で文字列項目をselectすると、半角255文字で途切れてしまいます。なお、PHPのバージョンは5.2.5です。 項目には255文字以上insertされているので、どうもselectの時に起こるようなのですが、どのようにすれば途切れずに値が取得できるかご存知の方がいらっしゃいましたら、どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • DB(MySQL)、PHP、jQueryの連結

    現在DB(MySQL)、PHP、jQueryの連結でつまづいております。 具体的には 1.フォームからポストした値をDBへ保存 フォーム項目はタイトル、カテゴリ、内容の3つです。 ↓ 2.DBから上記で保存された値(カテゴリ)をセレクトメニューへ出力 ↓ 3.セレクトメニュー内のカテゴリが選択されたタイミングでDBへセレクトされたワード(カテゴリ)で検索をかけ同ページセレクトメニュー下にカテゴリと一致したタイトルと内容を出力 という言う様な形にしたいのですが、上記3で困っております。 現状はjQueryのchangeで項目が選択されたと同時にセレクト項目(上記2でDBから出力したカテゴリが代入されているphp変数)$item['web_category']をjs変数に代入し、loadでDB検索リクエスト用のphpファイルにポストできないものかと考えていたのですが、jQの部分でエラーがでてしまいどうにもうまくいきません。如何せん初心者なものでこのやり方自体はき違えているのかもしれません。説明下手な上、支離滅裂な個所もあるかとは存じますが、それも含めご教授いただけるとありがたいです。問題と思われる個所のコードは以下の通りです。 セクトメニュー部 <form> <select id="category"> <?php while ($item = mysql_fetch_array($rs)) { echo "<option id='".$item['web_category']."'>" .$item['web_category']. "</option>"; } ?> </select><br> </form> jQ部 $("#category").change( function() { var value = $(this).val(); $("#display").load('search.php', {search: value}); });

  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • ????

    以下のクエリを実行しました。 insert into test_tbl(aaa,bbb,ccc) values('xx','yy','△△'); ※====『△』は半角スペース==== それで以下のsqlを実行すると select count(*) from test_tbl where ccc = '△△'; --- 1 --- と出ます。それで今度は以下のSQLを記述すると select count(*) from test_tbl where ccc = '△'; --- 1 --- とでます。 因みにテーブル構成は -------------- aaa char(2) bbb char(2) ccc char(2) -------------- です。 どうしてインサートしたデータが"△△"なのに "△"でひっかかるのでしょうか? しつこいようですが、記述中の'△'は半角スペースです。

  • SQLが通りません

    $sql2 = "UPDATE num SET ; $sql2 = "no= ".trim(db_encode($no_u))." "; $sql2.= "where no=".trim(db_encode($no)); $result = mysql_query($sql2,$db) or die("失敗しました3".mysql_error ()); と記述しましたが通りません。 どこがおかしいのかわかりません。 教えてください。

    • ベストアンサー
    • PHP
  • FROM SQL文 がしたい

    いつもお世話になってます。 SQL分の 「SQL1」 「SQL2」 を予めstring変数に入れておいて、 SELECT SQL1.項目x, SQL2.項目y FROM SQL1,SQL2 WHERE SQL1.項目z = SQL2.項目z ということがしたいのですが、そんなことできますか? アクセスのクエリではできたのですが。

  • 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

専門家に質問してみよう