• ベストアンサー

括弧内の処理の順序

プログラムを見ていて気になった点があります。 htmlspecialchars(mysql_real_escape_string(stripslashes($_POST["inp01"])),ENT_QUOTES) 上記の書き方の場合、処理される順番は 内から「stripslashes」→「mysql_real_escape_string」→「htmlspecialchars」になるんでしょうか? 逆に 外から「htmlspecialchars」→「mysql_real_escape_string」→「stripslashes」 でしょうか。 また処理の順番ですが、 「htmlspecialchars」→「stripslashes」→「mysql_real_escape_string」が正しい形でしょうか。

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

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

  • ベストアンサー
回答No.3

一つ目の質問については、皆さんが回答しているので省略します。 二つ目の質問の、正しい処理の順番について。 まず、stripslashesは、magic_quotes_gpc=Onの設定になっていない場合は不要です。Onになっている場合は、まずstripslashesします。 $inp01 = stripslashes($_POST["inp01"]); DBに入れる際には、mysql_real_escape_stringします。 $sql = "select * from foo where inp01='". mysql_real_escape_string($inp01). "'"; HTMLに出力するときには、htmlspecialcharsします。 echo "<p>inp01は". htmlspecialchars($inp01, ENT_QUOTES). "です</p>\n";

その他の回答 (2)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

処理される順番は 「stripslashes」→「mysql_real_escape_string」→「htmlspecialchars」 で、 たぶん正しい処理の順序は 「stripslashes」→「htmlspecialchars」→「mysql_real_escape_string」 ですかね・・?

回答No.1

前者です。

関連するQ&A

  • DBから出力の際preg_replace等が効かぬ

    データベースを使ったウェブサイト。 POSTを使ったformタグより、textareaにてテキストをsql文にて、 MySqlにinsertし、(このときにmysql_real_escape_string) 読み出すときにhtmlspecialcharsしてprint。 これが一般的な流れなのですが、 上記のまま行うと、改行(\r\n)がウェブ上に見えてしまいます。 ですので、 1:print preg_replace("/\r\n/","<br />", htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8')); 2:print nl2br(htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8')); などをやって消そうとしているのですが消えません。 ためしに、 $aaa ="適当な文字"; 1:print preg_replace("/\r\n/","<br />", htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8')); 2:print nl2br(htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8')); のように、MySqlを介さずに直接出力した場合、 ちゃんと改行コードは<br />に変更してくれましたので ソースの記述ミスではないと思うのです。 原因はなににあるでしょうか。 なお、現状phpmyadminで覗くと、 「フィールドA」(mysql_real_escape_stringを通してinsert) ----- あいうえお\r\nかきくけこ ----- 「フィールドB」(mysql_real_escape_stringを通さずにinsert) ----- さしすせそ たちつてと ----- となっているフィールドがありますが、 それらがhtmlで出力されたもののソースを見ると、 ----- A:あいうえお\r\nかきくけこ B:さしすせそ<br />たちつてと となぜかBのほうが希望通りの動きをします。 cを通さずにDBに入れてしまったほうが希望通りに動きます。 さっぱり困りました。

    • ベストアンサー
    • MySQL
  • Shift-JISの文字と改行コードについて

    TEXTAREAで入力した値をDBに対して、 .htmlspecialchars(mysql_real_escape_string(stripslashes($_POST["in3"])),ENT_QUOTES) の記述で保存した時、 文字化けコード(「ソ」「表」)が入っている場合に改行を行うと、 改行部に「\r」が文字として保存されてしまいます。 また、文字化けコードがない場合には「\r」は表示されず、 文字化けコードと改行までの間に半角英数字が入っていると「\r」は表示されません。 このような状態になる理由や回避方法についてコメントいただきたく思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • html用とmysql用のエスケープ処理の両立方法

    一度htmlspecialcharsしたものをmysql_real_escape_stringしてはいけない、そうです。 下記のように$pageをブラウザに表示もして、mysqlでも使う場合はどうするのでしょうか。 先にmysql_real_escape_stringを使い終わった後に、 htmlspecialcharsを使うような構造になるように工夫するのでしょうか。 htmlspecialcharsは出力する直前に使用しなければならないですが、 mysql_real_escape_stringは直前でなくても構わないとのことなので そこも意識して・・・ $mysql = mysql_connect($HostName,$UserName,$Password); $page = mysql_real_escape_string($_GET['page']); $mysql_c = "SELECT * FROM tttttt WHERE page='$page'"; $mysql_q = mysql_query($mysql_c,$mysql); $page = htmlspecialchars($_GET['page']); $html = '<a href="?page='.$page.'">'.$page.'</a>'; <html> <body> <div><?php echo $page; ?></div> 他には方法がないのでしょうか。

    • ベストアンサー
    • PHP
  • エラーの意味と対策

    PHP-MySQL間でデータを更新するプログラムを作成、PHPファイルを 読み出し更新を行おうとしたところ、以下のメッセージが表示されました。 データの更新はできているのですが、このメッセージがよくわかりません。 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in E:\(ディレクトリ)\delete.php on line 106 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in E:\(ディレクトリ)\delete.php on line 106 ここに書かれているコードはSQLで $sql_update = "UPDATE ITEM SET DELETE_FLAG=1,LASTUPDATE_USER='".htmlspecialchars(mysql_real_escape_string($_COOKIE["loginuser"]),ENT_QUOTES)."',LASTUPDATE_DTTM=NOW() WHERE ITEM_ID=".$key; となっています。 今のところ「mysql_real_escape_string」をはずすとエラーが出ないのですが、 エラーの意味、原因、対策についてコメントいただければと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 【php】改行にエスケープ文字が入る

    phpで  $_GET['a'] = stripslashes($_GET['a']); $_GET['a'] = mysql_real_escape_string($_GET['a']); $_GET['a'] → インサート と途中に stripslashes mysql_real_escape_string をはさんでから GETやPOSTを取得してるんですが改行が改行コードに変わってしまいます。 例えば質問フォームとかで  ---------------------------------------- 質問内容 ---------------------------------------- なんたら かんたら  ↓ サブミット ---------------------------------------- 投稿確認 ---------------------------------------- なんたら\n\rかんたら みたいなかんじです。 一旦文字コードをEUCにかえてから mysql_real_escape_stringを挟んだりしたりもしてみてますが 改行が改行コードになってしまいます。

    • ベストアンサー
    • PHP
  • array_mapを使ったエスケープ処理

    MYSQLとPHPでアプリケーション作成している初心者です。 今まで一つ一つの項目をmysql_real_escape_stringに通していたのですが今日、array_mapという関数がある事を知りました。 今まで自分がやっていたように項目毎に data1 = mysql_real_escape_string($_POST['data1']); data2 = mysql_real_escape_string($_POST['data2']); ...(省略) とするのは項目が増えれば増えただけ作業量も増えてしまうので $postdata = array_map("エスケープ関数",$_POST); としてPOSTされたデータは一括してエスケープ用関数を通そうかと思っています。 参考書などでこのような方法でエスケープ処理をしているのを見た事が無いの不安なのですが(googleで調べると結構やっている人がいました)、このやり方で何かデメリットはあるでしょうか?

    • ベストアンサー
    • PHP
  • バックスラッシュの対策について

    formでデータを送信するとバックスラッシュが入ってしまうので、stripslashes()で処理しています。 POSTでデータを送信しているのですが、 $prmarray_post = $_POST; $data1 = stripslashes($prmarray_post["data1"]); というような処理だと大丈夫なのですが、受け取るデータがいくつもあるので function cnv_formstr($array) { foreach($array as $k => $v){ if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v, ENT_QUOTES); $$k = $v; } return $array; } $prmarray_post = cnv_formstr($_POST); $data1 = $prmarray_post["data1"]; という感じでやりたいのですが、これだとうまくいきません。 どのようにすればよいのでしょうか。 よろしくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • PHPからMySQLにデータを渡すと文字化け

    PHPからフォームにデータを入れてMySQLに渡すとどうしても文字化けをしてしまいます。 MySQLはEUCらしいのです。 コレが解決すればほぼ完成するのに、最後の最後につまずいてます。 <?php require_once("../mydb_ini.php"); $con_mydb = mysql_connect($MYDBSERVER, $MYDBUSER, $MYDBPASSWARD); $selectmydb = mysql_select_db($MYDBNAME, $con_mydb) or die("失敗です");; $num=0; $mydbsql = "select * from newsline"; $rst = mysql_query($mydbsql, $con_mydb); $num = mysql_affected_rows(); $error = ""; $new_no = ""; $new_category = ""; $new_date = ""; $new_content = ""; $new_url_db = ""; $new_target = ""; $new_disabled = ""; if($_SERVER['REQUEST_METHOD']=="POST"){ if(isset($_POST["submit_add"])){ $new_no = htmlspecialchars($_POST["new_no"], ENT_QUOTES); $new_category = htmlspecialchars($_POST["new_category"], ENT_QUOTES); $new_date = htmlspecialchars($_POST["new_date"], ENT_QUOTES); $new_content = htmlspecialchars($_POST["new_content"], ENT_QUOTES); $new_url_db = htmlspecialchars($_POST["new_url_db"], ENT_QUOTES); $new_target = htmlspecialchars($_POST["new_target"], ENT_QUOTES); $new_disabled = htmlspecialchars($_POST["new_disabled"], ENT_QUOTES); if($error==""){ mb_convert_encoding($content, "EUC-JP"); $mydbsql = "INSERT INTO newsline VALUES('" . $new_no . "','" . $new_category . "', '" . $new_date . "', '" . $new_content . "', '" . $new_url_db . "', '" . $new_target . "', '" . $new_disabled . "')"; $rst = mysql_query($mydbsql, $con_mydb); } } if(isset($_POST["submit_upd"])){ $no = key($_POST[submit_upd]); $category = htmlspecialchars($_POST["category"][$no], ENT_QUOTES); $date = htmlspecialchars($_POST["date"][$no], ENT_QUOTES); $content = htmlspecialchars($_POST["content"][$no], ENT_QUOTES); $url_db = htmlspecialchars($_POST["url_db"][$no], ENT_QUOTES); $target = htmlspecialchars($_POST["target"][$no], ENT_QUOTES); $disabled = htmlspecialchars($_POST["disabled"][$no], ENT_QUOTES); if($error==""){ mb_convert_encoding($content, "EUC-JP"); $mydbsql = "UPDATE newsline SET category='$category', date='$date', content='$content', url_db='$url_db', target='$target', disabled='$disabled' WHERE no=". $no; $rst = mysql_query($mydbsql, $con_mydb); } } if(isset($_POST["submit_del"])){ $no = key($_POST[submit_del]); $mydbsql = "DELETE FROM newsline WHERE no=". $no; $rst = mysql_query($mydbsql, $con_mydb); } if($error==""){ $mydbsql; $new_no = ""; $new_category = ""; $new_date = ""; $new_content = ""; $new_url_db = ""; $new_target = ""; $new_disabled = ""; } } ?>

    • 締切済み
    • PHP
  • フォームのエラーチェックを教えてください

    ドリームウェーバー8で、MySQLとPHPでサイトを作っています。 フォームを使ったデーターベースへの書き込みの時に、フォーム上で「送信」をクリックした時にPHPによるエラーチェックをしたいと思います。なかなかできずに、困ってます・・・ 構文が長いので、質問内容にはいらない・・・どうしよ <?php if (!function_exists("GetSQLValueString")) { //文字列をSQLコマンド用に「'」を付加する function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { //magic_quotes_qpcの設定に応じて値を変換する $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); まだ、続きがあります・・・

    • 締切済み
    • PHP
  • php 送信されたフォームについて

    送信されたフォームの受け取る側のソースを書いたのですが、 <?php $i = 0; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; print('正解数'.$i./4'です'); ?> を付け加えるとエラーが表示されます。エラーの対象になっているのは print('正解数'.$i./4'です');らしいのですが、なぜエラーになるのかわかりません 回答お願いします。 以下ソースです。 <html> <head> <title>解答</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style type=""text/css""> #container{ width:1000 } #main{ width:500px; float:right; } #sidebar{ width:500px; float:left; } </style> </head> <body> <div id="container"> <div id="main"> <p>問題の解答</p> <p>問1</p> <p>(1)(2)(3)(4)</p> <p>問2</p> <p>(1)(2)(3)(4)</p> <p>問2</p> <p>(1)(2)(3)(4)</p> </div> <div id="sidebar"> <p><>あなたの解答<></p> <p>問1</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran11'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran12'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran13'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran14'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問2</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran24'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問3</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran32'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran33'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran34'], ENT_QUOTES, 'UTF-8')); ?> </p> </div> </div> <?php $i = 0; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; print('正解数'.$i./4'です'); ?> </body> </html>

    • 締切済み
    • PHP

専門家に質問してみよう