• ベストアンサー

O'connellさんなどの名前の処理

見よう見まねでphp&Mysqlで簡単なウェブDBアプリを作りました。 当方プログラミングは初心者です。 しばらく運用してみてエラーが発生しました。 $sql = "insert into customer(mailid, name, status) values('".$_POST["mailid"]."','".$_POST["namae"]."','pending')"; というクエリ文に対して $_POST["namae"] のところに O'connell さんのようなアポストロフィーが付いた名前が 入ってしまうとエラーがおきます。 おそらくシングルコーテーション(アポストロフィー)が原因なんですが この場合、名前のテキストの事前処理はどのようにやればいいんでしょうか? よろしくお願いします。

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

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

最近では一般的にプリペアードステートメントを 使うのが吉とされています

taro0714
質問者

お礼

ご回答有難うございます。 プリペアードステートメント、初めて聞きましたがこれはいいですね。 こんな便利なものがあったとは、、、。 使わせて頂きます。 今回は有難うございました。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

string mysql_real_escape_string ( string unescaped_string [, resource link_identifier] ) 現在の接続の文字セットで unescaped_string の 特殊文字をエスケープし、 mysql_query() で安全に 利用できる形式に変換します。バイナリデータを挿入しようとしている場合、 必ずこの関数を利用しなければなりません。 mysql_real_escape_string() は、MySQL のライブラリ関数 mysql_real_escape_string をコールしています。これは以下の文字について 先頭にバックスラッシュを付加します。 \x00, \n, \r, \, ', " そして \x1a. データの安全性を確保するため、MySQL へクエリを送信する場合には (わずかな例外を除いて)常にこの関数を用いなければなりません。

taro0714
質問者

お礼

ご回答ありがとうございました。 この文章そのままマニュアルにあったようですね。 マニュアルを自分でしっかり見ないと駄目ですね。 もうちょっと事前に調べてから質問します。 今回は有難うございました。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

 ’の前にバックスラッシュ(投稿不能文字)をいれます。 専用の関数 addslashes() があります。 ※magic_quotes_gpcというオプションも関係してきます。 詳細はマニュアルで確認してください。 http://manual.xwd.jp/function.addslashes.html

taro0714
質問者

お礼

ご回答有難うございます。 バックスラッシュでエスケープするのは問題ありませんが 変数テキストの任意の場所のものをエスケープしなければいけなかったので 素敵なやり方がないかなと思い質問してみました。 今回は有難うございました。

関連するQ&A

  • "と'の使い方を教えていただけないでしょうか

    お世話になります。 "と'の使い方で悩んでおります。 POSTでname="a"のINPUTBOXからデータを送信し、それをPHPで受けて、MySQLのテーブルのカラムに挿入するスクリプトで悩んでいます。 次のようにすると、うまく動作します。 mysql_query("INSERT INTO tb VALUES ('$_POST[a]')"); あるいは $b=$_POST[a];や$b=$_POST['a'];や$b=$_POST["a"];で mysql_query("INSERT INTO tb VALUES ('$b')"); 次のようにすると、失敗します。 mysql_query('INSERT INTO tb VALUES ("$_POST[a]")'); あるいは $b=$_POST["a"];などで mysql_query('INSERT INTO tb VALUES ("$b")'); これは私の環境だけで起こることなのでしょうか。 むしろ' 'で囲うと、文字そのものが展開されるので"$_POST[a]"としなければいけないと思うのですが。いかがでしょうか。 また、そもそも$_POST[a]で受け取るときに添字にクォーテーションはつけなくてもよいのでしょうか。 どなたか、お教えいただけないでしょうか。あるいはヒントだけでも助かります。 どうか、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mysql の insert文のクォーテーションについて

    インサート文を作るとき、 INSERT INTO shitumon (  title_question,  komari_level )VALUES(  'mysql の insert文のクォーテーションについて',  '2' ) のように、int系のデータに''とクォーテーションつけても 問題ないのでしょうか? int系のデータのクォーテーションは外しておくのが望ましいのでしょうか?

    • ベストアンサー
    • MySQL
  • DOSプロンプトから一度に登録させる方法

    WindowsXPに Oracle10gの無料版が入っています。 テーブルは既に作成しているのですが、データをインポートさせたく SQLを列記してDOSプロンプトから一度に登録させたいのですが、どのようにコマンドすればよいのでしょうか? sqlplusでログイン create table yaoya ( namae varchar2 (100) shohin varchar2 (100) num number (8,2) ); でテーブル作成している。 test.sqlを以下のように作成しました。 insert into yaoya (namae, shohin, num) values ('田中', 'りんご', 10); insert into yaoya (namae, shohin, num) values ('田中', 'みかん', 8); insert into yaoya (namae, shohin, num) values ('田中', 'バナナ', 15); insert into yaoya (namae, shohin, num) values ('伊藤', '梨', 12); insert into yaoya (namae, shohin, num) values ('伊藤', 'イチゴ', 20); insert into yaoya (namae, shohin, num) values ('伊藤', 'メロン', 1); insert into yaoya (namae, shohin, num) values ('松田', 'スイカ', 3);

  • トランザクションが効かない

    PHPでMySQLをやっています。 異なる2つのテーブルに同時にinsertをしようと思い、transactionを使って 片方がエラーならどちらにもinsertしないこと期待したのですが、 どうも効いてないみたいなんです・・・ mysql_query("begin transaction;") or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; $sqlstr = "INSERT INTO table1 (id, name) VALUES ("aaaa", "山田");"; mysql_query($sqlstr) or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; $sqlstr = "INSERT INTO table2 (id, name) VALUES ("bbbb", "佐藤");"; mysql_query($sqlstr) or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; mysql_query("commit transaction;") or $errStr= mysql_errno() . ": " . mysql_error(). "\n"; ※table1には既に「id:aaaa name:鈴木」が入っています を実行して重複エラー 「1062: Duplicate entry 'aaaa' for key 1 」 が出たのですが、table2には「id:bbbb name:佐藤」が入ってしまいます。 もちろんtable1には「id:aaaa name:山田」は入りません。 どうすればトランザクションが効くようになるのでしょうか?

    • ベストアンサー
    • MySQL
  • 例外処理について Ruby

    Mysql + ruby + mysql-ruby でデータベースを扱ってます。 begin  object.query("insert into hoge values ('#{date}','#{room}';") rescue ☆  print"データ重複" end データ格納の際、プライマリキーに重複データが入るとエラーで処理が止まるので、 「データ重複」と表示したいのですが、☆には何を入れればよいのでしょうか?。 ?を指定しなくても動作するのですが、それ以外のエラー時にも、「データ重複」と表示されるのは、不安です。

    • 締切済み
    • CGI
  • insert文等で「`」の有無で失敗するテーブルとしないテーブルがある。

    XAMPP(winXP、PHP4)を使っています。 Aのテーブルでは $query= "insert into table (a,b,c,d) values('1','2','3','4')"; $result = mysql_query($query); でデータが追加されるのに、Bのテーブルでは失敗しました。 今日ずっと何が間違っているのかわからなかったのdですが、 $query= "insert into table (`a`,`b`,`c`,`d`) values('1','2','3','4')"; $result = mysql_query($query); とすると成功しました。 なぜAのテーブルでは「`」が無くても成功したのに、Bのテーブルでは必要なのでしょうか。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • データベースが更新されない

    MySQLを使ってフィールドにid、name、age、genderを持つデータベースを作りました。idは、主キーでauto_incrementです。中身は空です。 ここにPHPで <?php $conn = mysql_connect("localhost", "user", "pass") or die("MySQLに接続できません"); mysql_query("SET NAMES 'sjis'", $conn); mysql_select_db("sample4", $conn); mysql_query("INSERT INTO sample4 (id,name,age,gender) VALUES ('田中',18,1)", $conn); mysql_query("INSERT INTO sample4 (id,name,age,gender) VALUES ('鈴木',24,1)", $conn); mysql_query("INSERT INTO sample4 (id,name,age,gender) VALUES ('加藤',20,0)", $conn); mysql_close($conn); echo "初期化終了<BR>"; ?> をブラウザ上で実行したんですが、MySQLには接続でき、エラーもなく初期化完了とは出るんですが、MySQLで中身を確認してみると、 mysql> select * from samplet4; Empty set (0.00 sec) と出て空の状態です。何故でしょうか・・・。 よろしくお願いします。

  • MySQLでnameとcommentが追加できない

    PHPからMySQLへ追加登録させようとしています。 insert ...で入れているのですが、 $nameと$commentの2つだけが入りません 他はこれらと並べているのにきちんと入ります。 なぜなのでしょうか。 $nameを$_POST[name]とか$in[name]、$commentを$_POST[comment]とか$in[comment]みたいに、その前で名前を付け替えても入りません。 $nameのところはvarchar255、$commentのところはtextなので、 insert into main values ('$name','$comment') と'でくくっています。 `(バッククォート)でくくっても見ましたが、エラーが出るだけです。

    • 締切済み
    • PHP
  • トランザクションについて教えてください

    PHPとMysqlを利用しています。MySQL4.1.18です。 同じテーブルに2つ以上の値をINSERTする場合、 1つでもエラーがあればロールバックさせるということはできますでしょうか。 あらかじめ「id=1」の値を登録しておき、この場合1つめがエラーになるので 2つめも実行されないでほしいのですが、実行されてしまいます。 テーブルのタイプはInnoDBにしています。 どうぞよろしくお願いします。 以下を参考に作成しました。 http://oshiete.nikkeibp.co.jp/qa3065237.html $sql = "begin"; $rst = mysql_query($sql, $con); //1つめ $sql= "INSERT INTO T_test(id,name)values('1','山田')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} //2つめ $sql= "INSERT INTO T_test(id,name)values('2','鈴木')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} $sql = "commit"; $rst = mysql_query($sql, $con); if($err){ $sql = "rollback"; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • MySQL
  • 何が起きてたのか教えてもらえますか?

    こんにちは。プログラマ初心者です。 今回phpとMySQLを用いて登録フォームから 情報をデータベースに格納するコントローラーを作ったのですが、その際のエラーで何が起きていたかが良く分からない事があったので理由を教えていただければと思います。 まず、登録フォームからはPOSTで情報を飛ばす事になっていて、 飛んできたデータを $data = mysql_real_escape_string($_POST['data']); のようにしてエスーケプ処理を行い変数に入れ、 $sql = "INSERT INTO $table (data) VALUES ($data)" $result = mysql_query($sql, $link); として値を格納しようとしたところ Unkown column~for listというエラーが出てしまいました。 最終的に VALUES('$data'); と書けば正常に格納される事が分かったのですが、 今回のエラーではどのような解釈をされていたのでしょうか? 何故「不明のコラム」というエラーになったのか また、VALUESにおける$data と '$data'の違いは何なのでしょうか? 初歩的でバカバカしい質問かもしれませんが、ご教授よろしくお願い致します。

    • ベストアンサー
    • PHP