チェックボックス(趣味のリスト)のチェック有無を配列で受けていますが、"パソコン"の文字が"パソ\コン"に文字化けしてしまいます。対処方法をお教えください。
<?php
mb_language('Japanese');
$hobby=@implode(" ",$_POST[hobby]);
echo $hobby;
?>
<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<INPUT type="checkbox" name="hobby[]" value="旅行" >旅行<BR>
<INPUT type="checkbox" name="hobby[]" value="温泉" >温泉<BR>
<INPUT type="checkbox" name="hobby[]" value="ゴルフ" >ゴルフ<BR>
<INPUT type="checkbox" name="hobby[]" value="パソコン" >パソコン<BR>
<INPUT type="checkbox" name="hobby[]" value="ドライブ" >ドライブ<BR>
<INPUT type="checkbox" name="hobby[]" value="写真" >写真<BR>
<INPUT type="submit" name="submit" value="送信"><BR>
<INPUT type="reset" name="reset" value="RESET">
</FORM>
No.4ベストアンサー
- 回答日時:
・・・。
明らかにmagic quoteだけの問題の気もしますが。
何も考えずUTF-8に変更したら別の不具合に衝突するかと思われます。
// そもそも文字コードを変えれば解決するという類の問題ではない
http://jp2.php.net/magic_quotes
ここの項目は読みましたでしょうか。
>always_populate_raw_post_data = On
php://input使いましょう。
Wp、さんAdvice有難うございます。
早速、以下のURLを読み、php.iniオリジナル(default)に以下の修正を加えTESTしてみました。結果はNGで”パソコン”が”パソ\コン”に文字化けしてしまいます。ケッコウ厄介な問題ですね!
色々情報収集しTESTして見たいと思います。
耳寄りな情報がありましたらお寄せください。
【php.iniの修正点】
(1)magic_quotes_gpc = Off (default On)
(2)magic_quotes_runtime = Off (default off)
(3)magic_quotes_sybase = On (default off)
【条件】
QNo.3678348のソースに・・・・・
(1)METAをいれSJIS出力とした。
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
(2)phpソースはSJISで保存
(3)PHP Version 5.2.5
http://jp2.php.net/magic_quotes
No.9
- 回答日時:
パスを鑑みるにxamppだと思いますけども
インストールした際に指定したpathがそのようになっているのでしょう。
phpinfo()で「Configuration File (php.ini) Path」の項目がそうなっているのではないかと思います。
実害が出るようであればhttp.confなどの設定を見直すと良いです。
Wpさん
本当に有難うございました。
小生の確認が不十分なため、お手数をおかけしました。
ご指摘の通りphpinfo()で確認しましたら以下の設定になっていました。
これならphp直下のphp.iniを修正しても文字化けは解消しないはずですね。
アドバイス&サポート感謝します。ありがとうございました。
Loaded Configuration File C:\xampp\apache\bin\php.ini
No.8
- 回答日時:
読み返して頓珍漢なことを言っていたので自己訂正
>どれも正常の場合はちょっと原因が分かりません
何かしらのエイリアスを使用して設定実体が別のところにある、といったパターンの可能性もありますね。
本当にそのphp.iniが読まれているかキチッと精査する必要があるかもしれません。
>print_r($_POST)
ではないですねorz
addslash()の戻し値を検査しなくては意味がありません。
先のコードもstrなのかarrなのか判んない変数命名だし
今日はダメだな俺
Wpさん Adviceありがとうございます。
先にXampp\php\php.iniをmagic_quotes_gpc = Offに設定後、実験し文字化けは解消しませんでしたと報告いたしましたが、とんでもない勘違いをしていたようです。
【php.iniの在りかと読んでいるFILEは?】
(1)php.iniファイルは以下の4箇所にありました。
c:\xampp\apache\bin\php.ini
c:\xampp\php\php.ini
c:\xampp\php4\php.ini
c:\xampp\perl\php.ini
(2)c:\xampp\apache\bin\php.iniをmagic_quotes_gpc = Offに設定したところ、"5C"に起因する文字化けは解消し、パソ\コン→パソコンに正常表示するようになりました。
(3)php実行時に読んでいるFILEは?
4つのphp.iniのmagic_quotes_gpc = On/Offを切り替えたり、又1つずつ削除したりしてphp実行時に読んでいるFILEを特定したところc:\xampp\apache\bin\php.iniでphp直下のc:\xampp\php\php.iniではありませんでした。
(4)従い、c:\xampp\php\php.iniをmagic_quotes_gpc = Offに設定しても"5C"起因の文字化けは解消しなかった訳です。
【何故、php直下のphp.iniが読まれないか?】
ここを突き止めたいと思います。現在進行形ですが調べる良い方法がありましたらAdviceください。
【実験に使用したphpソース】
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<?php
if (ini_get('magic_quotes_gpc') == "1")
{echo "magic:ON";}
else{echo "magic:OFF";}
mb_language('Japanese');
$hobby=@implode(" ",$_POST[hobby]);
echo $hobby;
?>
<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<INPUT type="checkbox" name="hobby[]" value="旅行" >旅行<BR>
<INPUT type="checkbox" name="hobby[]" value="温泉" >温泉<BR>
<INPUT type="checkbox" name="hobby[]" value="ゴルフ" >ゴルフ<BR>
<INPUT type="checkbox" name="hobby[]" value="パソコン" >パソコン<BR>
<INPUT type="checkbox" name="hobby[]" value="ドライブ" >ドライブ<BR>
<INPUT type="checkbox" name="hobby[]" value="写真" >写真<BR>
<INPUT type="submit" name="submit" value="送信"><BR>
<INPUT type="reset" name="reset" value="RESET">
</FORM>
No.7
- 回答日時:
設定は正しそうですね。
>(2)(snip)実際には幾つかのtextarea等も設け(snip)
ほかのパラメタで「パソコン」を入力した際も「パソ\コン」になるのでしょうか。
もしそうであればmagic_quoteの設定が正しくないorどこかで設定が上書きされている可能性が高いです。
get_magic_quote_gpc()が1を返すか0を返すか確認すると良いです。
有効になっている場合はphp.ini、http.conf、.ataccessを疑いましょう。
どれも正常の場合はちょっと原因が分かりませんね。^^;
get_magic_quote_gpc()が0なのにゴミが入るorほかのパラメタは正常である場合はそのチェックボックスだけaddslash()を噛ましているかもしれません。
ソースをgrepし、addslash()を使用しているところをリストアップしてみましょう。
その上でprint_r($_POST)を処理の合間に挟み、どこで汚染されているか検査すると良いです。
PEARやsmartyのフィルタで汚染されることもままありますのでその辺を留意しつつ検査すると見つかりやすいかもしれません。
No.6
- 回答日時:
>早速、以下のURLを読み、php.iniオリジナル(default)に以下の修正を加えTESTしてみました。
httpdの再起動を忘れたというオチだけは勘弁してくださいね^^;
>magic_quotes_sybase = On (default off)
sybaseだけonなのは呪いですか^^;
通常はsybaseなんて使わないでしょうから影響ないでしょうけど。
最終手段としてはコードの中にstripslashes()を組み込むしかないです。
レンタルサーバなどの場合は.htaccessで設定するか、以下のExample#2の方法しかありません。
http://jp2.php.net/manual/ja/security.magicquote …
関係ないところでの突っ込みですが、
<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<INPUT type="checkbox" name="hobby[]" value="旅行" >旅行<BR>
(snip)
上記フォームは安全ですか?
仮にparameterが改ざんされ、hobby[]に適当な値が入ってきても大丈夫でしょうか。
松井秀樹は喜んでアダルトビデオ鑑賞とか入れるかもしれません。
最悪の場合ですとhtmlを入れ込まれ、悪意あるサイトへの誘導もありえます。
DBやCSVを使っている場合は諸々のインジェクション対策も必要になります。
通常の設計では「checkboxの値は明示的である」の理念により、
予めキーをセットし実体はiniファイルなりDBでもったりするのが常です。
たとえば以下の感じ。
[check.ini]
[hobby]
1="旅行"
2="温泉"
[top.php]
<?php
$ini = parse_ini_file('check.ini',true);
echo '<form action="get.php">\n';
foreach($ini as $section => $values) {
foreach($values as $key => $value) {
echo "<input type='check' name='".$section."[]' value='".$key."' />".$value."<br />\n";
}
}
echo "<input type='submit' /></form>";
?>
[get.php]
<?php
$ini = parse_ini_file('check.ini',true);
$iniHobby = $ini['hobby'];
$input = $_POST['hobby'];
$checkedStr = array();
foreach($input as $param) {
$checkedStr[] = $iniHobby[$param];
}
echo 'あなたは'.implode(',',$checkedStr).'を選びました';
?>
やっつけで書いたのでsyntax errorとかあるかもしれませんが。
Wp、さん
お力添え有難うございます。
(1)php.iniの”magic_quotes_gpc = Off”設定で、文字化けは解消する事を期待していましたが期待に反してNGでした。PCを再起動して数回Tryしましたので、ご指摘の様な問題はない様に思います。
”off”設定で"5C”が付加される事はないように思いますので、小生の設定に問題有りの様に思います。ちなみに開発環境Xampp+php5.25でXampp\php\php.iniを修正しました。php.iniのコピペを以下に示します。何かとんでもない勘違いをしているかも知れません。お気づきの点がありましたらご指摘ください。
*****************************************
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
*********************************
(2)最終的にはstripslashes()を組み込むしかないと考えていますが余りこの関数は使用せず解決したく考えています。今回問題提起したphpのソースはあくまでも問題提起用で実際には幾つかのtextarea等も設け掲示板的にしたいと考えています。この$_POST[xxxx]全てについてstripslashes()を入れるのも手間ですし、是非stripslashes()関数を使用せずに解決したいと考えています。(・・・・・できれば、そうしたい)
(3)FORMの安全性ですが、実際の開発ではcheckbox値は明示するつもりです。ご指摘のDB、iniファイル迄は考えていませんでしたのでコードは参考になりました。ありがとうございました。
以上
No.5
- 回答日時:
>別の不具合に衝突するか
他のプログラムがShift_JISを前提にしている場合があるから,ですね。
>そもそも文字コードを変えれば解決するという類の問題ではない
調べてないけどUTF-8でもどこかのバイトストリームに5Cや22や27が存在する可能性があり,
ここが治っても別の場所で結局発症する可能性があるから,ですね。
>http://jp2.php.net/magic_quotes
>ここの項目は読みましたでしょうか。
まだです。
#ちょっと回答が軽率過ぎたかな?
>>always_populate_raw_post_data = On
>php://input使いましょう。
こんなのあるのね。勉強になりました。
#zipファイル拾ってきて設定ファイルを眺めているときに
#何でデフォルトでOffなんだろうと疑問だった。
No.3
- 回答日時:
>mbstring.http_input = UTF-8
>mbstring.http_output = UTF-8
多分不要。あるいは以下か。
mbstring.http_input = pass
mbstring.http_output = pass
mb_output_handler must be registered as output buffer to function
って設定しなくても正しく動いているから。
(mb_output_handlerを指定するとそこで自動変換されるかどうか悩みそうなので指定するのを止めた。)
一応Offにしておく(こちらの想定外のタイミングのレスポンスがブラウザに送られる可能性を排除)
output_buffering = Off
No.2
- 回答日時:
>そこでPHPにはこうした危険性を排除しよう
すまん,ここ俺間違っている。(各リンク先は正しい)
PHP側がこの設定で排除しようとしているのはこういった文字コード云々の文字化けではなく,SQL文を作るときのインジェクションを防ぐためでした。その影響を受けている。それ以外の記述は多分正しい。
>初心者なモノでphp.iniの設定等が正しいのか?
俺もPHPは最近はじめたばかりで自信がないんだ、実は。
手元にあるのはPHP 6で,PHP 5を持ってくるのが面倒なので確認していない。
多分二つの設定はあっていると思うけれど,俺自身は
「極力自動推測機能はOFFにする,あるいは明示的に指定する」
方針が好きで,手元では
[mbstring]
mbstring.http_input = UTF-8
mbstring.http_output = UTF-8
;(6)と(12)は同じ設定だね
mbstring.encoding_translation = Off
mbstring.detect_order = NULL
mbstring.func_overload = 7
;output_handlerは設定内容がよくわからんので
コメントアウトしてある(笑)
;毎回,always_populate_raw_post_data = Onして
;(RAW_POST_DATA自体はASCII文字だけで構成されているはずだから
;こうした異常は起こらないと思う)
;でデコードしている(笑)
;良く解らないが
;設定だけしているもの
[iconv]
iconv.input_encoding = UTF-8
iconv.internal_encoding = UTF-8
iconv.output_encoding = UTF-8
;多分PHP6~
;;;;;;;;;;;;;;;;;;;;
; Unicode settings ;
;;;;;;;;;;;;;;;;;;;;
unicode.semantics = on
unicode.runtime_encoding = UTF-8
unicode.script_encoding = UTF-8
unicode.output_encoding = UTF-8
unicode.from_error_mode = U_INVALID_STOP
unicode.from_error_subst_char = 3f
としている
No.1
- 回答日時:
質問内容とカテゴリ見る限り,ある程度技術的なことがわかりそうなので原理の説明。
PHPでは色々なメタキャラクタのエスケープに\を用いていることはご存知かと思います。
$str = "\"";
この\のバイトストリームを16進数で表現すると5Cになります
さて,
「ソ」の文字をShift_JISで表現したとき,
これは83 5Cというバイトストリームになります。
http://homepage3.nifty.com/jgrammar/ja/tools/cod …
$str = "ソ";
とか書くと後ろのダブルクオートがエスケープされ,文字列が終わってないと見なされてエラーが出ることがあるわけです。
http://goungoun.dip.jp/app/fswiki/wiki.cgi/devno …
今回の場合はエラーが出ますが,
場合によっては危ないかもしれません。
そこでPHPにはこうした危険性を排除しよう
http://d.hatena.ne.jp/lami/20061215/1166169234
という仕組みがあり,それが逆に影響して今回の現象が発生しています。
対策としては
●Shift_JISを止めてUTF-8に乗り換える。
●magic_quotes_gpc = false
あたりでしょうか?
特に後者はPHP 6で消えるようです。
http://d.hatena.ne.jp/gallu/20080107/p1
====================
パーセントエンコード
form要素のenctype属性,accept-charset属性
HTML 4.01 Strictではform要素の子要素はブロックレベル要素のみ
であるということもついでに調べておくことを薦めます
Advice有難うございます。
参考URL等を確認し"5C"のいたずらとの事、納得しました。
早速、himajin100000さんのAdvice+以下のURLを参考にphp.ini等の設定を変更し、結果的に"ソ"が正常に表示するようになりました。・・・・・が初心者なモノでphp.iniの設定等が正しいのか?
検証できません。設定した内容を以下に記載します。是非commentをお願いします。
【phpソース】
(1)ソースに<META>を追加
<META http-equiv="Content-Type" content="text/html: charset=UTF-8">
(2)ソースコードをsjis→UTF-8に変更し保存
【php.ini変更点】
(1)magic_quotes_gpc = Off
(2)mbstring.internal_encoding = UTF-8
(3)mbstring.http_output = UTF-8
(4)mbstring.language = Japanese
(5)default_charset = UTF-8
(6)mbstring.http_input = auto
(7)mbstring.encoding_translation = On
(8)mbstring.detect_order = auto
(9)mbstring.substitute_character = none
(10)output_handler =mb_output_handler
(11)output_buffering = On
(12)mbstring.http_input = auto
http://www.bnote.net/windows/windows/code.shtml
以上
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【HTML(PHP?)】複数のフォーム...
-
smartyでチェックボックスをチ...
-
syntax error, unexpected '}' ...
-
検索時の選択内容を保持する方法
-
ラジオボタンをsessionで使いたい
-
<input type="hidden" >で配列...
-
入力フォーム→確認画面→送信画...
-
DBの値をチェックボックスに反...
-
チェックボックスのうちひとつ...
-
POSTやGETの変数をフォーム無し...
-
チェックボックスのvalueを連結...
-
テキストボックスに初期値を入れる
-
【PHPチェック】ラジオボタンが...
-
PHPでじゃんけん勝負
-
パラメーターを隠す
-
ラジオボタンのチェックを判定...
-
フォームでのリセットを使う方法
-
テキストボックスとsubmitボタ...
-
PHPのページ間による配列の受け...
-
PHPでフォームに表示させたCSV...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
検索時の選択内容を保持する方法
-
PHP ボタンが押されたら処理を...
-
HTMLのリンクをクリックするこ...
-
フォームへの前回入力値をクリ...
-
PHPで画像の渡しが上手く行きま...
-
UPDATEの記述について
-
POSTデータのNAME属性をVALUEに...
-
ラジオボタンをsessionで使いたい
-
テキストボックスに初期値を入れる
-
画面が更新されてもチェックボ...
-
DBの値をチェックボックスに反...
-
PHPでクリックするたびに変数を...
-
同じページでフォームデータを...
-
smartyでチェックボックスをチ...
-
チェックボックスによる検索(...
-
入力フォーム→確認画面→送信画...
-
パラメーターを隠す
-
【PHPチェック】ラジオボタンが...
おすすめ情報