MySQLへの特殊文字の挿入について

このQ&Aのポイント
  • MySQLへのデータ挿入時に特殊文字を挿入する方法やエラーの解決方法についてご教授ください。
  • MySQLへのデータ挿入時に特殊文字を使う際に発生するエラー「?が1に変換される問題」への解決策をお知らせください。
  • MySQLへのデータ挿入時に特殊文字を利用する際に生じるエラーについての解決方法を教えてください。
回答を見る
  • ベストアンサー

MySQLへの特殊文字の挿入について

こんばんは。今MySQLへのデータの挿入時に特殊文字を挿入することが出来ないエラーに悩まされています。初心者で大変申し訳ございませんが、色々と調べてみたのですがどうしても解決できなかった為、質問させて頂きました。お手数をおかけしますがご教授いただければ幸いです。 問題というのは、MySQLへのデータの挿入時の文字列に特殊文字が含まれていた場合、この場合文字列中に「?」が含まれていた場合にこの文字列をinsertすると「?」が「1」に変換されてしまうのです。環境としてはPHPのPEARからの利用で、文字列はDBクラスのquoteメソッドでエスケープしてから挿入しております。文字列の文字コードはEUC-JPです。バックアップ用ファイル(CSV形式のテキストファイル)には正しく記録されておりますのでMySQLの仕様に関しての問題ではないかとは考えておりますが、どうしても解決できず困っております。お手数をおかけしますがよろしくお願いいたします。

  • asat
  • お礼率66% (4/6)
  • MySQL
  • 回答数3
  • ありがとう数7

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

  • ベストアンサー
  • YanYas
  • ベストアンサー率34% (26/75)
回答No.3

ここが怪しいです. $result_s = $db -> query($query,DB_FETCHMODE_ORDERED); 下記のURLにあるとおり、$queryのSQL中の ? はプレイスホルダーとなり、DB_FETCHMODE_ORDERED に置換されます。 置換されないようにするには、?の前にバックスラッシュを入れると良いようです。 ?以外にも & や ! もプレイスホルダーになるようです。 つまり$URL の文字を1つづつチェックして該当する文字(?&!)があったら、その前に¥を挿入するような処理が必要ですね。 もしくは、逆にプレイスフォルダを利用して、こんな感じで実行できるのではないでしょうか? $query = 'INSERT INTO s_data (name,url) VALUES( ? , ? )'; $data=arrey( $db -> quote($name) , $db -> quote($url) ); $result_s = $db -> query($query,$data); ※ 上記のコードは、実際にテストはしていないのでそのままでは動かないかもしれません。ごめんなさい。

参考URL:
http://www.1x1.jp/php/manual_pear/package.database.db.intro-execute.html
asat
質問者

お礼

ありがとうございます。なるほど。。?や&や!はプレイスホルダーとなるのですか。しかも教えて頂いた貴重なPEARのサイトを読んでみるとDBクラスのquoteメソッドがエスケープしてくれるのはシングルクォーテーションだけだという事をはじめて知りました。という事はやはりstr_replace等を利用して事前に変換するしかないということですね。プレイスホルダーを利用した考えも大変参考になりました。とても助かりました。ありがとうございました。

その他の回答 (2)

  • YanYas
  • ベストアンサー率34% (26/75)
回答No.2

SQLに問題があるのではないかと思います。 $query で組み立てられたSQLはどうなってますか?

asat
質問者

補足

ご回答ありがとうございます。 クエリー文字列はデータベースへ送ると同時にテキストファイルにログとして残しておりまして、 INSERT INTO s_data(name,url) VALUES('名前','http://***.co.jp?id=35') という風になっているのですが、データベース側のデータはURLの部分がhttp://***.co.jp1id=35という風に?が1に置き換えられて挿入されてしまいます。ちなみに\nなどの改行コードや'などの特殊文字(エスケープ済み)を送ろうとするとエラーが発生し、insertすることはできませんでした。

  • YanYas
  • ベストアンサー率34% (26/75)
回答No.1

PHPからMySQLへ挿入されているとのことですが 具体的なコードをみせていただけないでしょうか?

asat
質問者

補足

ありがとうございます。 今回のデータ挿入部分の具体的なPHP側のコードとしましては、以下のようになっております。 ユーザーから入力された名前とWEBサイトURLを登録するだけのものです。 テーブル(s_data) フィールド id int(5) auto increment name text not null url text not null ↓PHP側↓ . . . require_once("DB.php"); $name = $_POST['name']; $url = $_POST['url']; $name = mb_convert_encoding($name,'EUC-JP','auto'); $url = mb_convert_encoding($url,'EUC-JP','auto'); $db = DB::connect("接続文字列",FALSE); if(DB::isError($db)){die($db -> getMessage());} $query = 'INSERT INTO ' . s_data . '(name,url) VALUES(' . $db -> quote($name) . ',' . $db -> quote($url) . ')'; $result_s = $db -> query($query,DB_FETCHMODE_ORDERED); $db -> disconnect(); if(DB::isError($result_s)){die($result_s -> getMessage());} . . . といった感じになっております。 色々と試してみると、どうやら「?」だけではなく特殊文字全てが挿入不可能のようでした。?は1へと変換され、エラーこそ発生しませんが、「'」などを挿入してみるとinsufficient data suppliedといったエラーが発生してしまいました。DB::quoteメソッドでエスケープされている、、と自分では思い込んでいるのですがコードがおかしいでしょうか?大変お手数をおかけします。よろしくお願いいたします。

関連するQ&A

  • mySQLの文字コード

    mySQLで、 --with--charset=ujis や、 --default-character-set=ujis など、 文字コードを指定するものがありますが、 これらは実際どのような事なのでしょうか? dumpファイルからmySQLにデータを流し込むとき、 上記の場合だとdumpファイルの文字コードはEUCに しないといけないのでしょうか? 仮に上記の場合でdumpファイルをSHIFT_JISで流し込んだとき、 そのデータをブラウザで表示する場合の 文字コードもSHIFT_JISにすれば 文字化けせずに表示したのですが。 mySQLのデフォルト文字コード(?)とinsertするデータの 文字コードは一致させなければいけないのでしょうか? よろしくお願いします。

  • エスケープ文字の変換

    お世話になります。 今、php+mysqlでシステム作成中なのですが、 エスケープ文字の扱いで悩んでいます。 DBへinsertするデータに、 "c:\sato\仕事\見積もり" という文字列があったとすると、そのままinsertすると、エスケープ文字が無くなり、 "c:sato仕事見積もり" となります。 そこで、str_replace関数で、"\"マークを"/"で置き換え、insertしました。 しかし、違うデータで、 "c:\suzuki\仕事\開発予定表" という文字列をinsertしなければならなくなりました。 ほかの質問でも確認しましたが、最後の"表"という文字は、shift-jisでは文字化けしてします。("・"になってしまいました) 置き換えするなど小細工で何とか回避する方法はないでしょうか?? 現状、php、mysqlともにshift-jisで統一しています。 また、この元データは、shift-jisのCSVファイルから取り込んでいます。 このあたりでの問題は無いのでしょうか? よろしくご教授願います。

    • ベストアンサー
    • PHP
  • MySQL5.1の文字化け

    多くの方が同様の質問をされていたのですが、一致する問題が見つけれなかったので、ご存じの方がおられたら教えて下さいm(_ _)m (環境)  PHP 5.2.8 ZendFramework 1.5.1 から Pdo Mysqlを使用  文字コード:SJIS  Mysql 5.1  文字コード:EUC-JP (質問内容) 携帯の絵文字データをSJISのバイナリでスクリプト中に埋め込むため、スクリプトの文字コードをSJISに統一したところ、文字化けが発生しました。 SET NAMES SJIS のSQLを発行することで表示は正しくできるようなったのですが、新たにレコードを追加しようとすると文字化けが発生します。 例)情報 → 情表 insertを行う前の文字コードをSJIS,SJIS-win,EUCと変えてみましたが、SJISもしくはSJIS-winの場合は上記の例のとおりとなり、EUCにすると完全な文字化けとなりました... おそらく登録時にMYSQLがSJIS→UTF8→EUCに変換される時に正しく変換されていないものと思われるのですが、どなたか対処方法をご存じないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLへの吐き出し日本語が文字化けする

    自分なりに調べてみたのですが,わからないのでお尋ねいたします。 phpmyadminからmysqlに直接日本語を打ち込むと,ちゃんと日本語が表示されます(phpmyadmin内でデータを再度呼び出した時)。が,phpのプログラムからmysqlにデータをinsertし,phpmyadminでデータを参照すると日本語部分のみ文字化けします。 同じプログラムをアイルサーバで動かしていて,そこではうまくいっているのですが,ファーストサーバでうまくいきません。 ファーストサーバの文字コードはEUC-JPですが,phpもプログラムもEUCで書いています。メール送信部分のプログラムは,ちゃんと日本語が出ています。 日本語文字化けの場合に,チェックするべきところは,どういうところがありますでしょうか?。多分,phpというよりはMYSQL側の問題のような気がしないでもないのですが・・・。

    • ベストアンサー
    • PHP
  • MySQL接続データ表示で文字化け

    Dreamweaverを使って、MySQL接続でデータ表示を試みているのですが、日本語が文字化けしてしまいます。 phpMyAdminでデータベース表示したときは問題なく表示されます。 文字コードは,phpMyAdmin、DWともeucで設定しています。 解決するには、どのような手段が考えられますか?よろしくお願いします。 バージョン:MySQL 4.0.27

  • 『予約』という文字を挿入すると文字化けしてしまいます。

    データベースはmySQLで、 コマンドプロンプトからinsert into ~ コマンドを 用いて、予約という文字を挿入すると、その予約という文字自体と、それ以降の 文字列が全て文字化けしてしまいます。 対処法はないのでしょうか? default-character-set=sjis で文字コードの指定は行っています。

  • MYSQL 4.1 の余計なエスケープ処理

    おはようございます。PERL 5.8.5 からMYSQL4.1 サーバーへのデータINSERT 時の文字変換処理について教えてください。 MYSQL 4.1 の文字コードは次の通りです。 SHOW VARIABLES LIKE 'character?_set?_%'; の結果 character_set_client :binary character_set_connection:binary character_set_database:utf8 character_set_results:binary character_set_server:utf8 character_set_system:utf8 MYSQL 4.1 サーバーが上記のような状態で、PERL で次の処理をします。なお、PERL ソース自体はEUC で書かれています。 #!/usr/bin/perl use Jcode; use DBI; $string = "あああ"; Jcode::convert( ?$string, 'utf8', 'euc' ); $dbh = DBI->connect( 'DBI:mysql:DB名:ホスト名:3306', 'ユーザー名', 'パスワード' ,{AutoCommit => 0} ); $sth = $dbh->prepare( "set names utf8" ); $sth->execute; $sth->finish; $sth = $dbh->prepare( "insert into test values( ? )" ); $sth->bind_param( 1, $string ); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; 上記のソースを実行すると、MYSQL 4.1 サーバーには [あ?あ?あ] のような、余計なエスケープが掛かった状態で文字がINSERT されているのです。 私としては、set names utf8 で、MYSQL 4.1 サーバーとクライアントで同様の文字コードを使うようにしているので、MYSQL 4.1 における余計な文字コード変換はないものと思っています。余計な文字コード変換がないにもかかわらずエスケープ文字が入る理由が分かりません。 この現象についてお分かりの方がいらっしゃいましたら教えて頂きたく思います。なお、ネットでも調べたのですが、どの方も未解決でしたので質問さえて頂きました。 お願いします。

  • mysqlで長さ無制限の文字列を格納することはできますか?

    mysqlを用いて掲示板を作りたいです。その際に、簡素化のため、掲示板の全てのデータをmysqlに格納したいと思っています。 また、掲示板における本文の部分は、文字列の長さを無制限にするのが妥当だと思います。 しかし、mysqlのマニュアル(http://dev.mysql.com/doc/mysql/ja/BLOB.html)によると、一番大きい型であるLONGBLOB型の記憶容量は 2^32バイトとなっており、それを超える文字列は切り捨てられるとなっています。 そこで、ご教授いただきたいです。 長さ無制限の文字列をmysqlに格納する方法はありますか?そしてその場合はどうすればよいですか? それとも、長さ無制限の文字列をmysqlに格納する方法ははなく、その場合は別ファイルを用意し、そちらに書き込むなどをする必要がありますか? どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • mysqlバッチモードでのエスケープ文字

    mysqlでエスケープ文字を含んだファイルをバッチモードでクエリーを実行させた時、エスケープ文字がそのまま出力ファイルに記述されます。(\tがTABにならずに、\tのまま出力される) バッチモードの場合、どのようにしたらエスケープ文字を正常に出力させる事が出来るのでしょうか。 ちなみに、同様のクエリーをmysql(コマンドラインツール)を起動して直接入力し動作させる、 およびMysql Control Centerで行うと、期待通りの表示(\tはTAB)になります。 よろしくお願いします。Mysqlは ver4.0.18-max-ntです。

  • phpとMysqlの文字化け

    何度もすみません。 phpからinsertするときとphpmyadminから直接挿入するときどちらも文字化けを起こします。 phpは4.4.9でmysqlは5です。 myadminのMySQL 接続の照合順序はsjisにしております。 照合順序と保存される文字コードは違うのでしょうか。 phpファイルはsjisで保存しています。 過去の質問を見たり、調べてset name sjisとset name ujisと mb_convert_encoding($str, "EUC-JP", "SJIS");を それぞれ試しましたが文字化けのままです。 mb_convert_encoding($str, "utf-8", "SJIS"); であいうえおと入力してみたところあい???となりました。 また、adminから直接挿入した時、同じくあいうえおと入力しましたが、 こちらもあい???となりました。 adminの設定はutf-8ということのでしょうか。 照会順序以外文字コードについて表示されているところがわからなかったのですが、 どこで確認できますでしょうか。 また、php、adminともどこの設定を確認すれば良いのでしょうか? 恐れ入りますが教えていただけますでしょうか。

    • ベストアンサー
    • PHP