![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
PHPでHTMLからPOSTされたデータが文字化けします。
超初心者ですので表現に誤りがあるかもわかりませんがお許しください。
現在、Win2003・MySQL5.1・PHP5.2と言う環境で簡単なデータベースを作成して、HTMLから検索して
一致したデータを表示させると言うものを作成しています。
検索欄に入力した一部の文字がどうしても文字化けしてしまい解決できません。
詳しくはまだ理解できていないのですが、おそらく検索窓に入力した文字がPOSTされて、それを受けたPHPが文字化けした文字でMySQLのデータベースを検索しようとしているのではないかなっと思ってます。
文字コードはすべてShift-JISで行っているつもりです。
たとえば、
全角の"。"や"?"などの2バイトコードが81**(違ってましたらすみません。。)入力すると
"。"は"B"に文字化けされ、"?"は"H"に文字化けします。
また、"院"や"法"などの**40を入力すると"・> <input type="と表示されて検索ボタンも消えておかしくなってしまいます。
これだけの情報ではお答えして頂けないかもわかりませんが、他にどのような情報があればいいのかもよくわかりません。
わかる範囲で結構ですのでご教授頂けないでしょうか。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
・cp932
これは、Microsoftが拡張した文字も含めたShift_JISのコードのことなので、sjisとは違います。
※詳しくは参考URLを読んでみて下さい。
・データベースの文字コード
LOAD DATA INFILEはデータベースではなくて、「テーブル」に対して行う処理ですので、
「CREATE DATABASE データベース名 CHARACTER SET cp932;」
などと、データベースを作成するときにデータベースの文字コードを指定する必要があります。
・「法」は、「・> <input type=」となってしまう
すみません勘違いしてました。「法」が文字化けするのであればSJISの「5C問題」とは別の現象ですね。
それでは下記を確認してみてください。
1.HTML部分をSJIS以外で記述していないか(EUC-JPかUTF-8)
2.または<meta http-equiv="Content-Type" content="text/html; charset=sjis">を書いていない
3.もしくは上記を、titleタグの後に書いている
4.POSTされた値に「mb_convert_encoding($_POST['example'], "SJIS")」などと指定している(SJISまたは、sjis-win、Shift_JIS)
いかがでしょうか。
hogehoge78さま
何度も申し訳ありません。
確認してみました。
> 1.HTML部分をSJIS以外で記述していないか(EUC-JPかUTF-8)
Shift-JISです。
> 2.または<meta http-equiv="Content-Type" content="text/html; charset=sjis">を書いていない
<head>に書いてます。
> 3.もしくは上記を、titleタグの後に書いている
<title>の1行上に書いてます。
> 4.POSTされた値に「mb_convert_encoding($_POST['example'], "SJIS")」などと指定している(SJISまたは、sjis-win、Shift_JIS)
特に指定しておりません。
これは指定していなくて正解と言うことですね。
以上のような感じです。宜しくお願い致します。
No.1
- 回答日時:
Shift_JISは、「表」や、「法」などの文字にバイトコード「5c」が含まれます。
「5c」というのは、「¥」です。
mysqlは、「¥」をエスケープ文字と認識します。
なので、mysql_real_escape_stringや、プリペアドステートメントなどで、二重でエスケープされてしまい、
「表\」、「法\」などとなる場合があります。
逆に、mysqlのデータベースを作成時に文字コードをきちんと「cp932」にしておらず、エスケープ処理を適切にしないでShift_JISの文字をINSERTし、SELECT文で表示しようとした場合、「表」の文字の最後の「5c」が消えて表示されてしまい、文字化けが発生したりします。
とりあえず質問者さんは、
・データベースの文字コードが「cp932」になっているか
・mysql_real_escape_stringなど、文字のエスケープ処理を行っているか
確認してください。
また、「my.cnf(mysqlのコンフィグファイル)」内の、
「default-character-set」が「cp932」になっているか
逆に上記は設定されていないが「skip-character-set-client-handshake」が設定されているか。
なっていなければ、どちらかを設定してください。
【参考URL1】http://dev.mysql.com/doc/refman/5.1/ja/charset-c …
【参考URL2】http://www.klab.jp/media/mysql/index6.html
この回答への補足
hogehoge78さま
ご回答ありがとうございます。
アドバイス頂きました内容について的確にお答え出来ていないかもわかりませんが、
> ・データベースの文字コードが「cp932」になっているか
データベースはCSVファイル(Shift-JIS)からLOAD DATA INFILE・・で取り込んでいるのですが、これでデータベースがShift-JISになっていると考えていいのでしょうか。
> ・mysql_real_escape_stringなど、文字のエスケープ処理を行っているか
勉強不足で申し訳ありません。調べてみます。
> 「default-character-set」が「cp932」になっているか
「cp932」と「sjis」は同じと考えてよろしいでしょうか。
「my.ini」で、default-character-set=sjisとなってます。
文字化けはコマンドプロンプト上でMysqlを操作した場合は何も起こらないのです。
また、IEを使ってブラウザ上にデータベースを表示するだけなら問題なくきれいに表示されるのですが、検索したキーワードに「法」や「院」や「。」などが含まれているとおかしくなります。
> 「表\」、「法\」などとなる場合があります。
この環境では、「表」は正常に表示されます。
「法」は、「・> <input type=」となりおかしくなります。
いろいろとアドバイス頂きましてありがとうございました。
少し原因が特定できまして、POSTされた文字列の処理過程で、
$keyword = $_POST['keyword'];
$keyword = ereg_replace("[ ]+", " ", $keyword);
と言うものを参考にしていたサイトに書かれていたものをそのまま使っていたのですが、この処理を行う際に文字化けを起こすことがわかりました。
何故なのかはわからないのですが、少しずつ調べてみたいと思ってます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP 文字列を段落で分ける方法を教えて下さい。 2 2023/03/09 10:03
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Access(アクセス) capeofdragonと申します。 Access2016を使っております。 あるフォームがあり、テ 2 2022/09/09 13:18
- その他(ソフトウェア) ソースネクストアプリをインストールし、製品登録で半角英数字が入力できない 5 2022/07/03 22:44
- オープンソース csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい 3 2022/09/02 15:17
- Android(アンドロイド) スマホでパソコン操作の文字入力 2 2022/05/12 21:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP8を使うと、大量のWarningが...
-
phpでcookieがうまく保存されない
-
PHPでMysqlにデータがあるかど...
-
PHPの記述で値が取れません。
-
PHPSpreadsheetを使って関数を...
-
入力した部分を表示させたまま...
-
php に関して質問です。 各ユー...
-
phpのクラスメソッドの定義が長...
-
phpにおいて$xを計算式の文字列...
-
PHP MySQLに画像を直接保存
-
index.phpって何ですか? 具体...
-
メールフォームのタイトルが文...
-
PHPのセッション有効期限について
-
php 完了画面の送信メールのコ...
-
in_arrayについて教えて下さい。
-
共通の処理をまとめる方法がわ...
-
PHP & MySQL: Server-side Web ...
-
最後の段階で詰まっています。R...
-
ゆゆにゃ。
-
【初心者】XAMPPのapacheの(恐...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPはバックエンドそれともフロ...
-
PHPでHTMLからPOSTされたデータ...
-
文字のスグ下に水平線
-
PCでSteamのサイト内で検索する...
-
postgresql のupper関数について
-
Word2003でドキュメント内の赤...
-
仕入先への回答督促で【ご教示...
-
ステッピングモーターの停止
-
HDDが突然高速回転します。
-
「ご教示になる」は「教える」...
-
正しいことや事実を教示する人...
-
在庫日数について
-
1000mlのプロテインシェイカー
-
古いノートパソコンなんですが...
-
AWSでWindows10のhome edition...
-
音節とモーラの違い
-
「ご教示」と「ご教授」
-
全日空でA380が使用されている...
-
モノラル入力された音声をステ...
-
”教示する”の使い方について
おすすめ情報