- ベストアンサー
stringaddslashes 半角¥が消える
- 変数をSQL文のinsertを用いてDBに格納する際、アポストロフィの入った変数ではinsertが正常に行われず、レコードが作成されない問題が発生しました。
- mysql_real_escape_stringaddslashes 関数を使用することで、アポストロフィも正常に格納されるようになりましたが、半角バックスラッシュを含む文字列は消えてしまいます。
- エスケープのためにバックスラッシュを置き換える方法を試しましたが、うまくいきませんでした。最悪の場合はaddslashesを使用する必要がありますが、セキュリティ上の懸念もあります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- shimix
- ベストアンサー率54% (865/1590)
- honoka-cha
- ベストアンサー率54% (40/73)
- bm_hiro
- ベストアンサー率51% (200/388)
- pQ2MZc53
- ベストアンサー率12% (1/8)
関連するQ&A
- mysql_real_escape_string
mysql_real_escape_stringについて調べていると、私と同じことを疑問に思い質問している人がいました。 こちらのページです。 http://okwave.jp/qa/q4423735.html mysql_real_escape_stringを通してDBに入れるとします。 すると、「テスト\」というデータをINSERTをするとDBには「テスト\」で入るのでしょうか? では、mysql_real_escape_stringを通さずにdbに入れても 「テスト\」というデータをINSERTをするとDBには「テスト\」で入ると思います。 上記のとおりとした場合、PHPはどうやってmysql_real_escape_stringを通したかどうか判定しているのでしょうか? 現在、mysql_real_escape_stringを通してDBに入れると、 「テスト\\」というデータがDBに入っています。 それをどうやって戻すのか調べていて、上記の質問を見つけました。 どうぞよろしくお願いします。
- ベストアンサー
- PHP
- PHPのPDOについて
例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。
- ベストアンサー
- PHP
- 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 ); ?> ここまで↑ どなたかご指摘をお願いします。
- 締切済み
- MySQL
- 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません
以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B ( date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5
- ベストアンサー
- MySQL
- mysqlのinsert文について、ご指導をお願いいたします。
はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>
- ベストアンサー
- 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
- キーワード検索について
DB(mysql)内をキーワード検索する場合、 Like '%key%' などのようにLike検索をすると思うのですが、 一つ疑問なのが、「%」をキーワードとして検索したい場合は Like '%%%' となってしまい、すべてを表示してしまいます。 「%」をキーワードにした場合はどのような処理を行えば良いのでしょうか? あと、もう一つ分からないのが、mysql_real_escape_stringなどの関数でエスケープをしてDBに登録した場合、例えば、「&」は「&」に変換されてDBに登録されると思うのですが、検索のキーワードを「amp」として検索すると、この「&」までもがヒットしてしまいます。 これはどのようにして対処すれば良いでしょうか? DBに登録されるときに、エスケープされた文字が元に戻るようなことは期待できないでしょうか。 アドバイスをよろしくお願いします。
- ベストアンサー
- PHP
- mysql_real_escape_stringについて
素朴な疑問です。。 SQLインジェクション?の対策でSQLにINSERT時にmysql_real_escape_stringを使っています。 「テスト\」というデータをINSERTをすると DBには「テスト\\」で入ります。 そのまま取り出してしまうと「テスト\\」で出力されるのですが。 このときの出力時の処理はstripslashes()を使っているのでしょうか? 他にもっと簡単な方法等があれば教えてくださいm(__)m
- ベストアンサー
- PHP
- sqlite_escape_stringのアンエスケープ方法
sqliteのエスケープ方法としてPHPマニュアルでは sqlite_escape_string() を利用することが望ましいと 記述されています。 実際にsqlite_escape_string() を使用してDBに格納するのは 問題ないのですが、データを取り出したときに エスケープされたままで出てきます。 アンエスケープする方法はどのようなものでしょうか? str_replace("'","''",取り出した文字列); とかではないですよね・・・。
- ベストアンサー
- PHP
- SQLインジェクション対策(クオーテーション関連
PHP Version 5.4.7の環境にて。 SQLite3::escapeStringを使って、 SQLインジェクション対策をしようと考えています。 HTMLの<form>からPOSTで値を受け取り、 その値をSQL文に入れ込み、 そのクエリ(※ちなみに、INSERTのみです。)をSQLite3のDBに対して行う、 なんてことをする際の、 SQLインジェクション対策として、お考え下さい。 POSTで受け取る値に入っていたら危険なものとして、 「シングルクオーテーション」が、まず、挙げられるかと思います。 「'」 ←これです。 さて、「"」 ←こちらはダブルクオーテーションですが、 こちらのダブルの方はエスケープする必要は無いのでしょうか? (例)※wikipediaより SELECT * FROM users WHERE name = '(入力値)'; SELECT * FROM users WHERE name = 't' OR 't' = 't'; → このSQL文では条件が常に真となるため、 nameカラムの値にかかわらず、全レコードが選択される。 → ということで、入力値に、 エスケープされていない「シングルクオーテーション」をそのまま使うのはNG。 ここまではOKです。 では、次に、ダブルクオーテーション版で、 SELECT * FROM users WHERE name = "(入力値)"; SELECT * FROM users WHERE name = "t" OR "t" = "t"; こちらはどうなのでしょうか? (シングルをダブルに変えただけですが。) ---------- ちなみに、 SQLite3::escapeString にて、 (1) $var = "Let's"; //←シングルクオーテーション $db = new SQLite3(':memory:'); $escaped_var = $db->escapeString($var); echo $escaped_var; //Let''s と表示される (「 ' 」が1つ追加される。) (2) $var = 'Let"s'; //←ダブルクオーテーション $db = new SQLite3(':memory:'); $escaped_var = $db->escapeString($var); echo $escaped_var; //Let"s と表示される (何も追加されず。) というように、 シングルクオーテーションはエスケープされるが、 ダブルクオーテーションの方ではエスケープされませんでした。 これは、つまり、 ダブルクオーテーションの方は危険視されていない、 ということだと思いますが、 でも、本当にダブルクオーテーションをエスケープせずに、 そのまま、SQL文につっこんでも大丈夫なのでしょうか?
- ベストアンサー
- PHP
- MG5130をWindows10で使っていましたが、PCが壊れたためWindows11に買い換えましたが、ドライバーをインストール出来ません。
- MG5130を新しく買ったPCで使うことは出来ないのでしょうか?
- キヤノン製品についての質問です。
お礼
ごめんなさい。 なぜかできました。 質問にあげたソースより前のほうに、 別の作業で(メール送信用) if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} とかいてあったたところを if (get_magic_quotes_gpc()){$var = stripslashes($var);} に直したところ、Mysqlのほうも直りました。原因はわかりません・・・。
補足
>mysql_real_escape_stringとaddslashesを両方通しているわけではありませんよね。mysql_real_escape_stringのみということでよろしいでしょうか。 ごめんなさいコピペミスです。 mysql_real_escape_stringのみです。 こんなソースです。 ※magic_quotes_gpc=off ※文字コードはUTF-8 ※サーバーはさくらインターネット ------------- if(get_magic_quotes_gpc()) { function mres($str){ return mysql_real_escape_string(stripslashes($str)); } }else{ function mres($str){ return mysql_real_escape_string($str); } } $Pt_data = mres($_POST['変数']); $Pt_data = mb_convert_kana($Pt_data, "K", "UTF-8"); $Pt_data = preg_replace('/&/','&',$Pt_data); $sql = "INSERT INTO `tb` ('$Pt_data') VALUES ('$Pt_data')"; $ret = mysql_query($sql); if($ret){ print "<p">入力できました</p>";} else { print "<p"></p>";} --------------- formの変数に 「\100\\100」といれると、「100\100」と表示されます。