- ベストアンサー
チェックボックス 複数選択
現在PHPを勉強しているのですがどうしてもわからなくなってしまったので 質問をさせて頂きます。 現在自分が作ろうとしているのは 登録フォーム→確認ページ→登録完了ページ(MYSQLに接続)の流れになっております。 その中でチェックボックスでつまずいております。 こちらにそのコードを一部を記載させて頂きます。 どこで困っているかと申しますと、登録フォームから確認ページまでは 複数選択されたチェックボックスを表示されることができたのですが、 確認ページから登録ページに変わる際に文字化けなどをし、 mysqlに接続して登録した際も文字化けになってしまいます。 他にも変数の受け渡しもうまく出来ていないと思います。 自分の中の結論としては確認ページのhiddenあたりが間違ってるのでは ないかと思ってるのですが何度試してみてもうまくいきません。 大変困っており、誰かご存知の方、もしくはこういう風に変更した方がいいとかありましたらご教授をお願い出来ませんでしょうか? 1,登録フォーム <tr> <td>施術(チェックボックス)<br />順番不問</td> <td> <span class="checkbox"><input name="sejyutu[]" type="checkbox" value="aaa" />aaa</span> <span class="checkbox"><input name="sejyutu[]" type="checkbox" value="bbb" />bbb</span> </td> </tr> 2,登録確認ページ $sejyutu = $_POST["sejyutu"]; <?php if (trim($sejyutu) == "" || !isset($sejyutu)){ echo "施術が選択されておりません。"; $flag_sejyutu=0; } elseif (empty($sejyutu)){ echo "施術が選択されておりません"; $flag_sejyutu=0; } else { if(isset($sejyutu) and count($sejyutu)>0){ $sejyutu_value = ""; for($i=0;$i<count($sejyutu);$i++){ if($i == 0){ $sejyutu_value .= $sejyutu[$i]; } else { $sejyutu_value .= " " . $sejyutu[$i]; } } } print mb_convert_encoding(trim($sejyutu_value),"sjis","euc-jp") ; $flag_sejyutu=1; } ?> <?php if($flag_sejyutu==1) { ?> <form action="reg_complete.php" method ="post"> <input type="hidden" name="sejyutu_value[]" value="<?php echo $sejyutu_value; ?>"> } 3,登録完了ページ $sejyutu = $_POST['sejyutu_value']; それからmysqlに接続。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
一旦文字コードの確認をした方がよさそうですね。。 空のファイルを作成し、 <?php phpinfo() ?> と書いて適当な名前で保存してそのファイルへアクセスし mbstring項の mbstring.http_input mbstring.http_output mbstring.internal_encoding mbstring.language このあたりを確認してみてください。 まずはこの部分とphpファイルの保存時の文字コード、phpファイル内のmetaタグでの文字コード指定がうまくいってないと表示がおかしなことになるかと思います。 http://tsuttayo.sytes.net/php/char_trn/index.html の php.ini 設定表→php.iniの設定 辺りが参考になるかと思います。 登録確認ページの if($i == 0){ $sejyutu_value .= urlencode($sejyutu[$i]); } else { $sejyutu_value .= "," . urlencode($sejyutu[$i]); } を一旦 if($i == 0){ $sejyutu_value .= $sejyutu[$i]; } else { $sejyutu_value .= "," . $sejyutu[$i]; } echo $sejyutu_value;exit; とでもして 受け取った文字列を素直に表示できるようにします。 で、 php.iniのmbstring.~の文字コードを変更 ↓ apache再起動 ↓ 登録確認ページを表示 を行ってみてください。 そちらの環境がわからないので心当たりのあるコードに変えて見て何か変化があればその辺が怪しいということになります。 >print mb_convert_encoding(trim($sejyutu_value),"sjis","euc-jp") ; こうしないと正常に表示されないということはphpファイル保存とmetaでの指定文字コードはSJISでされているっぽいですね。 もしかしたらphp.iniを触らずに登録フォーム、登録確認ページなどをeucで保存しなおしてmetaでの指定もEUC-JPにしたら正常に表示できるかもしれません・・・。
その他の回答 (4)
- widoww
- ベストアンサー率20% (33/159)
質問主さんの文章を読んでいると、 何が問題となっているのか非常にわかりにくいです。 もっと単純化したプログラムを自分で作ってみて 原因を特定されてから質問したほうがいいと思います。 たとえば 単純にフォームから受け取ったデータを表示する、それがうまく言ったらMYSQLにわたすだけの操作をするプログラムでうまくいくかを調べていくなどすることで、原因は特定できると思います。 どこがおかしいのかわからないなら、小分けにしてそれぞれうまくいくか調べるのが常套手段です、まずそれをやられることをお勧めします。
- gogo-tea
- ベストアンサー率75% (25/33)
#2です。 urlencodeで日本語文字列をエンコードして渡したら 受け取る側ではurldecodeという関数でデコードしてやります。 3,登録完了ページ $sejyutu = urldecode($_POST['sejyutu_value']); var_dump($sejyutu); でどうでしょうか。
補足
ご返答ありがとうございます。 こちらでさっそく調べさせて頂きました。encode,decodeについて勉強になりました! またこちらで頂きましたように変更をしてみたのですが、 うまくいきませんでした。 現在の状況ですが、 2,登録確認ページ <?php if (trim($sejyutu) == "" || !isset($sejyutu)){ echo "施術が選択されておりません。"; $flag_sejyutu=0; } elseif (empty($sejyutu)){ echo "施術が選択されておりません"; $flag_sejyutu=0; } else { if(isset($sejyutu) and count($sejyutu)>0){ $sejyutu_value = ""; for($i=0;$i<count($sejyutu);$i++){ if($i == 0){ $sejyutu_value .= urlencode($sejyutu[$i]); } else { $sejyutu_value .= "," . urlencode($sejyutu[$i]); } } } print mb_convert_encoding(trim($sejyutu_value),"sjis","euc-jp") ; $flag_sejyutu=1; } ?> <?php if($flag_sejyutu==1) { ?> <form action="reg_complete.php" method ="post"> <input type="hidden" name="sejyutu_value" value="<?php echo $sejyutu_value; ?>"> } 3, 登録完了ページ $sejyutu = urldecode($_POST['sejyutu_value']); echo var_dump($sejyutu); エラー、文字化けに関しては 登録確認ページで チェックボックスの所は依然文字ではなく、 %A5%E9%A5%B8%A5%AA%C7%C8,%A5%B2%A5%EB%A5%DE%A5%CB%A5%A6%A5%E0%B2%B9%C0%F4,%A5%DB%A5%C3%A5%C8%A5%B9%A5%C8%A1%BC%A5%F3 の形になっており、読めません。 変更前(urlencode)を入れる前はチェックボックスの文字は表示されておりました。 また登録完了ページでdecodeをした際、 var_dumpで調べて見たところ表示は string(40) "・鬣ク・ェヌネ,・イ・・゛・ヒ・ヲ・犂ケタ・・ロ・テ・ネ・ケ・ネ。シ・・ のようになっておりました。 実際になにが原因なのか分からないのですが、いくつか不審点があります。まず一番初めの登録フォームから <span class="checkbox"><input name="sejyutu[]" type="checkbox" value="aaa" />aaa</span>の形で登録確認ページに渡してるのですが var_dumpで確認をした所、すでに文字化けしている状況でしたので print mb_convert_encoding(trim($sejyutu_value),"sjis","euc-jp") ; で確認ページに表示をさせていました。 この登録フォームからすでに文字化けしているのが問題なのかなと思っておりました。 その他に 登録完了ページで文字化けした表記がそのままmysqlに登録されるのですが、その際なぜか<input...とタグまで登録されております。 これは一体なにが問題でなっているのかが分かりません。 変数の受け渡しで問題があるとしか思えないのですが どこかが分かりません。 質問や疑問ばかりでも申し訳ございません。。
- gogo-tea
- ベストアンサー率75% (25/33)
if($i == 0){ $sejyutu_value .= $sejyutu[$i]; } else { $sejyutu_value .= " " . $sejyutu[$i]; } これをみると$sejyutu_valueって文字列ですよね なのでhiddenのnameはsejyutu_value[]ではなくsejyutu_valueで良いのではないでしょうか。 で、 上述の部分は if($i == 0){ $sejyutu_value .= urlencode($sejyutu[$i]); } else { $sejyutu_value .= "," . urlencode($sejyutu[$i]); } のようにして渡して見たらどうでしょうか。
補足
gogo-tea様 ご返答ありがとうございます。さっそくですが$sejyutu_valueはチェックボックスで選択された文字列になります。hiddenのnameは色々と試しており、 sejyutu_valueもやってみたのですがどうしてもうまくいかず色々と試しておりました。 また if($i == 0){ $sejyutu_value .= $sejyutu[$i]; } else { $sejyutu_value .= " " . $sejyutu[$i]; } の部分を if($i == 0){ $sejyutu_value .= urlencode($sejyutu[$i]); } else { $sejyutu_value .= "," . urlencode($sejyutu[$i]); } に変更したところ、 登録確認ページんpチェックボックスで選択された文字列 を表示する所で %A5%E9%A5%B8%A5%AA%C7%C8,%B4%E4%C8%D7%CD%E1,%A5%B2%A5%EB%A5%DE%A5%CB%A5%A6 このように表示されてしまい、 登録確認ページで var_dump($_POST["sejyutu_value"]; で確認してみると string(92) "%A5%E9%A5%B8%A5%AA%C7%C8,%B4%E4%C8%D7%CD%E1,%A5%B2%A5%EB%A5%DE%A5%CB%A5%A6%A5%E0%B2%B9%C0%F4" このような形になっております。 mysqlのデータベースでも確認しみますと 同じ表記で登録されてしまいます。 もう少しで出来そうな気はするのですが、他に変更をどのようにしていいかわからない状況です。。
- STICKY2006
- ベストアンサー率29% (1536/5269)
こんちは。 >>自分の中の結論としては確認ページのhiddenあたりが間違ってるのでは では、hiddenの中身を確認してみればよいだけかと思うのですが。。。。 >>文字化けなどをし、 Web関係の文字化けは、大体、文字のコード違いかと個人的には思ってます。 定義してあるファイル自体のコードが違うのか、Web通信を行った際に、通信に適さないコードだったため化けたか。。。 PHP使用者じゃないのであるかどうか分かりませんけど、ASPには、「HTMLEncode」という、HTML通信を行う際に、適したコードに変換して通信を行う処理が存在しますけど、PHPにはどうでしょうか??
補足
さっそくのご返答ありがとうございます。 hiddenの中身の確認ですが、それは登録完了ページに 変数がちゃんと受け取ってるかどうかの確認ということでしょうか? もしそうであれば、登録確認ページの var_dump($_POST["sejyutu_value"]; $sejyutu = $_POST["sejyutu_value"]; で確認をしたのですが、 表示としては array(1) { [0]=> string(73) "磁失磁蒔蕊縞 雫靆邪赦。ヲ磁軸磁。ヲ酌磁射磁示磁犇嫉実。ヲ> となってしまいます。 文字化けに関しては mb_convert_encodingで対処しようとしてるのですが 登録確認ページから登録完了ページに飛ぶ際にうまくいってません。 素人で深く説明できず、申し訳ございません。 となり
お礼
ご丁寧な回答どうもありがとうございます! 私の方でphp.iniなどを調べたり色々していたのですが、結局 途方に暮れていたのですが、gogo-tea様が最後に申しておりました metaの変更をしたらうまくいきました!丸二日かけてそこが問題だとは 少々拍子抜けしましたが、ご指摘のおかげで無事に解決することが出来ました。本当にありがとうございます!