• ベストアンサー

PHPで「\」をDBにインサートすると「\\」になる件

宜しくお願いします。PHP初心者です。 今PHP(smartyも利用しています。)とMYSQLで新着情報のプログラムを作成しています。「タイトル」と、「本文」のフォームがあり、それをDBにインサートして表示させるというシンプル?なものです。 ページ遷移は、「フォーム記入ペ-ジ」→「確認ページ」→「登録完了ページ」というふうになっています。 フォーム記入ページで「\」と記入して確認ページに移動すると、「\\」となってしまします。 この原因が分かる方いらっしゃいましたらご教授いただけないでしょうか。

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

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

>このやり方は間違っていますでしょうか? そのやり方が普通です。あとMySQLに投げる前にはmysql_real_escape_stringでescapeするのも普通です。   http://www.php.net/manual/ja/function.mysql-real-escape-string.php

icon_fanta
質問者

お礼

shimix様 ご教授・ご指摘本当に有難うございます! SQLインジェクションに対しての対策、他にも対策をしっかりしてから公開します!

その他の回答 (2)

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

php.iniの magic_quotes_gpc = On となっているところを magic_quotes_gpc = Off にしてください。 Onにしていると特殊文字すべてをクオートしてくれます <form>から送られてくるものすべてを強制的にエスケープしてくれてかなり厄介な機能です まことに勝手で余計な機能ですのでOffにしておきます。 DBなどへ保存する際のSQL文などを生成するときにだけエスケープ処理すれば良いだけです。 DBへINSERTする際には、手動でクオートする必要があります。 php6で、この機能そのものが削除される予定です いまのうちに、magic_quotes_gpc = Off で慣れておけばパニックにならずにすみます。

icon_fanta
質問者

お礼

ご教授ありがとうございます! magic_quotes_gpcについては調べてみました。 php6でなくなるというのは初めて聞きました。有難うございます(^^) 初心者として、セキュリティに関して、基本からしっかり勉強しなくてはいけないと実感しました。 有難うございました!

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

特殊な記号だからエスケープされているんだね。 この辺が関連する関数。 ここを基にしらべてみて。 「escapeshellcmd」 http://jp.php.net/manual/ja/function.escapeshellcmd.php

icon_fanta
質問者

お礼

早速のアドバイス有難うございます!! 恥ずかしい限りですが、「escapeshellcmd」という関数を初めて知りました。。ご教授いただき、重ねて本当に有難うございます。 今SAYKAさんからアドバイスを頂く前に、調べていたのですが、 「get_magic_quotes_gpc()」に関して何も記述していなかったので、 if ( get_magic_quotes_gpc() ) { $title = stripslashes( $title ); $comment = stripslashes( $comment ); } と書いてからsmarty側にassignしてみたら、「\」が「\\」になる不具合が直ってしまいました。 このやり方は間違っていますでしょうか?

関連するQ&A

  • PHP/mySQLでインサートができません。

    PHPとmySQLを勉強中の初心者ですが、よろしくお願いします。 PHPで簡単なインサート文を作ってそれをmySQLに保存しようとしているのですが、以下のエラーが出てしまいます。 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource プログラムは以下の通りです。HOSTNAME,USERNAME,DBPWDは別のところで定義していますが、mysql_connect, mysql_select_dbではエラーにならないので、データベースの選択まではうまく行っていると思うのですが。 $conn = mysql_connect(HOSTNAME, USERNAME, DBPWD); if(!$conn){ die("Logon Failure to mysql Server."); } $db = mysql_select_db(DBNAME, $conn); if(!$db){ die("Cannot access to the DB"); } foreach($csv_ary as $a => $b) { $query = "INSERT INTO TEST field_a VALUES $a"; if (!mysql_query($query, $db)){ echo "更新失敗: SQL=$query<br>"; } } mysql_close($conn); field_aはvarchar(10)でPrimary_key, NOT NULLの設定です。 Foreachで展開した配列の値はちゃんと長さ10の文字列が入っています。 PHP 4.3.11は mySQL 4.0.27です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPとMySQL、INSERTの動作についての少し疑問点。

    PHPとMySQL、INSERTの動作についての少し疑問点。 現在、PHPとMySQLを使ってHPを作成しています。 会員登録のページが存在し、会員情報をDBに書き込む時にINSERT文を使用しているのですが この動作を複数の人が同時に行った場合、どうなるのでしょうか? DB・PHP・MySQL的にエラーが出るのであれば 『書き込み処理中は時間差で実行する』等の 何か回避策をしなければならないのですが・・・。 その辺りが少し疑問に思ったのでお伺いしたく思います。 初歩的な質問になりますがお教え頂ければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • phpからinsertできない

    またお世話になります。 PHPからMySQLへデータをインサートしたいのですが、各サイトを参考にしながら試しているのですがどうにも上手くいきません。 ソースを見ていただけますでしょうか? $con = mysql_connect("localhost","user","password") or die("MySQLに接続できません。"); mysql_select_db('test'); $sql = "SET CHARACTER SET UTF8"; $result = mysql_query($sql); $data1 = $HTTP_POST_VARS["inpdata1"]; $data2 = $HTTP_POST_VARS["inpdata2"]; $data3 = $HTTP_POST_VARS["inpdata3"]; $sql = 'INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES (`$data1`,`$data2`,`$data3`);'; $result = mysql_query($sql); print $data1; //ここでは通常にデータが表示されるので print $data2; //データの受け渡しは問題ないはずですが。 print $data3; mysql_free_result($result); mysql_close($con);

    • ベストアンサー
    • MySQL
  • phpからMySQLへ日本語insert

    phpプログラムからMySQLへ日本語の入力を行おうとしているのですが、 selectで閲覧してみても、文字化けどころか挿入すらされていませんでした。 コードは以下のような実にシンプルなものです <?php require_once'DB.php'; $username = "****"; $password = "*****"; $host = "localhost"; $database = "udb"; $db = DB::connect("mysql://$username:$password@$host/$database"); //DB接続 if (DB::isError( $db )) { die($db->getMessage()); } $sql = "INSERT INTO comments (lec_code, comment) VALUES (0000, 'ああああ')"; $result = mysql_query($sql); ?> 日本語でなく、英語でinsertした場合は問題なく挿入できました。 また、MySQLから直接SQL文での入力であれば日本語をinsertできたので、設定ミスが問題なのであればMySQLではなくphp側だと思われます。 ちなみに、MySQLの文字設定はsjis、phpの設定は以下のとおりです。 output_buffering Off default_charset "Shift_JIS" extension php_mbstring.dll mbstring.language Japanese mbstring.internal_encoding SJIS mbstring.http_input auto mbstring.http_output SJIS mbstring.encoding_translation On mbstring.detect_order auto mbstring.substitute_character none

    • ベストアンサー
    • PHP
  • PHPからMySQL・異なるDBにコピー

    PHPからMySQL・異なるDBに接続し同じ構造のテーブルのデータをコピーすることは可能ですか? 以下を実行するとクエリが実行されず「コピーできません」が表示されてしまいます。 どのようにすればコピーできるか教えてください。 $connect1 = mysql_connect("localhost", "user1", "pass1") ; mysql_select_db("db1", $connect1); //db1内にtable1 $connect2 = mysql_connect("localhost", "user2", "pass2") ; mysql_select_db("db2", $connect2); //db2.内にtable2 $sql = "INSERT INTO `db1` . `table1` SELECT * FROM `db2` .`table2`;"; $result = mysql_query($sql, $connect1)or die("コピーできません"); //$result内「$connect1」でも「$connect2」結果は同じです。 //table1とtable2の構造は同じです。

    • ベストアンサー
    • PHP
  • PHP フォームからのデータが文字化け

    PHPにて簡単な以下のようなアプリを勉強がてら作っています。 1.登録フォームを表示 2.確認画面表示 3.DB(MySQL)にデータ登録 そこで質問なのですが、フォームから入力し確認画面を表示するときに、フォームから入力した文字が文字化けしてしまいます(正確には文字化けする時としない時があります)。 出力ページはSmartyを使っています。 テンプレートはUTF-8を使っており、テンプレート内の文字は文字化けしません。PHPソースもUTF-8で書いてあります。 各PHPソースには mb_language("uni"); mb_internal_encoding("UTF-8"); mb_http_output("UTF-8"); と記述しています。 DB(MySQL)のテーブルはUTF-8にしてあります。 1点気になるのは、某ホスティングサービス上で作っているのですが、PHPinfoで見てみるとmb_internal_encodingはEUC-JPになっています。 今回UTF-8で作りたいのですがどうしたら良いのでしょうか? 環境は、 Apache 1.3.34 / PHP 4.3.7 / MySQL 4.1.21 です。 アドバイスお願いいたします。

    • ベストアンサー
    • PHP
  • PHP+MySQLでのINSERTについての質問です。

    insert.html(入力フォーム)で <input type="text" name="company_nm" size="80"> を <form name="form1" method="post" action="insert_kakunin.php"> <input type="submit" value=" 次 へ "> で送って insert_kakunin.php(確認画面)で <input type="hidden" name="company_nm" value="<?= $company_nm ?>"> <?php print $_POST["company_nm"]; ?> で表示させます。 それを <form name="form1" method="post" action="insert.php"> <input type="submit" value=" 決 定 "> で insert.php(DB処理)で DB接続した後に $sql='INSERT INTO Sample (company_nm) VALUES("'.$_POST['company_nm'].'"); というふうにINSERTしたいんですが、VALUESに入力した値が入りません。 print $sql; print ($_POST['company_nm']); で見ても「""」となっています。 値の渡し方を教えてください。

    • ベストアンサー
    • PHP
  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • PHP+MySQLでの排他処理とDBクローズ

    <環境> Apache1.3.37 PHP4.4.6 MySQL4.0.27 PHPで、掲示板などのスクリプト作成を勉強しています。 これまで、ログをログファイルとして保存するように作成しておりましたが、データベースに保存するように変更している途中です。 そこで、教えていただきたいのは下記の2点です。 ・ロック処理の必要性 →ログファイルを作成するタイプの場合、同時アクセスによるファイル破損を防ぐため、ロック処理が必要でした。DBに変更した場合も同様に必要なのでしょうか? ・DBのクローズ処理 →最小限のソースを以下に記します。9行目のクローズ処理は必ず必要でしょうか?また、エラーが発生した場合、7行目で処理が終わるのですが、この直前にもクローズ処理を記入する必要があるのでしょうか? 1)<?php 2)$db = mysql_connect(host,user,pass); 3)mysql_select_db(db-name,$db); 4)$query = "INSERT INTO table(id,name) VALUES('1','なまえ')"; 5)if (!(mysql_query($query))) { 6) print = "書き込みに失敗しました。"; 7) exit(); 8)} 9)mysql_close($db); 10)?> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • DBをPHPでaccessしているページについて

    MysqlをPHPでアクセスしているページがあるのですが、セキュリティの観点からSSL通信をしようと考えています。WWWサーバはAPACHEを使っております。認証局からデータをいただいてAPACHEに組みこもうと考えております。https通信になったとき、PHPはそのままでMysqlと通信は出来るのでしょうか。 https://www.hogehoge.hogehoge/でアクセスするようになった場合ページ内のPHPモジュールはそのままでDBと通信は出来るのでしょうか。 よろしく、お願いいたします。