チェックボックスのエラーについて - PHPプロ!Q&A掲示板

1482

  • 0P

チェックボックスのエラーについて

質問日時 / 2008年9月4日 21:18    回答数 / 3件

Questioner:  agupx  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

チェックボックスの入力結果を配列の数字とそれにあたる名前で取得し
MYSQLに登録しております。
登録には思うような結果が返ってくるのですがチェックボックスのいずれかを
選択している状態でsubmitすると以下のエラーが出てしまいます。

『Warning: htmlspecialchars() expects parameter 1 to be string, array given in ファイル名 on line 268』

268行目は$v = htmlspecialchars($v, ENT_QUOTES);なのですがエラーを
なくすにはどうすればいいのでしょうか?

チェックボックスにチェックをしていない常態でsubmitした場合はエラーは
表示されず何が原因なのか全く想像もつかない状態です。。。

PHP
  1. function decode() {
  2.     $array = array();
  3.     foreach ($_POST as $k => $v) {
  4.         if (get_magic_quotes_gpc()) {
  5.             $v = stripslashes($v);
  6.         }
  7.         $v = htmlspecialchars($v, ENT_QUOTES);
  8.         $array[$k] = $v;
  9.     }
  10.     return $array;
  11. }
  12.  
  13. // チェックボックスの配列
  14. $status_list = array();
  15. $status_list = array('あああ', 'いいい', 'ううう', 'えええ', 'おおお')
  16.  
  17. if (isset($_POST['confirm'])) {
  18.     // 配列初期化
  19.     $array = decode();
  20.     // データ取得配列
  21.     $data_list = array();
  22.     foreach ($array as $k => $v) {
  23.         $data_list["$k"] = "$v";
  24.     }
  25.     // ステータスチェック
  26.     $status_key = array();
  27.     if (is_array($_POST['status'])) {
  28.         foreach ($_POST['status'] as $val) {
  29.             // 配列に値を代入
  30.             $status_key[] = $val;
  31.             // 確認画面表示用
  32.             $status_view .= $status_list["$val"] . ',';
  33.             // mysql登録用
  34.             $status_val .= $val . ',';
  35.             // 選択状態保持
  36.             $status_selected = $status_key;
  37.         }
  38.         // 確認画面表示用
  39.         $data_list['status_name'] = $status_view;
  40.         // mysql登録用
  41.         $data_list['status_code'] = $status_val;
  42.     }
  43. }
  44. $smarty->assign('status_checkbox', $status_list);
  45. $smarty->assign('status_selected', $status_selected);

smarty側tpl
  1. <form method="post" action="{$smarty.server.SCRIPT_NAME}">
  2. <table border="1">
  3. <tr>
  4. <th>ステータス</th>
  5. <td>
  6. {html_checkboxes name="status" options=$status_checkbox|smarty:nodefaults selected="$status_selected" separator=""}
  7. </td>
  8. </tr>
  9. </table>
  10. <p><input type="submit" name="confirm" value="登録内容確認"></p>
  11. </form>

1番目と2番目のチェックボックスを選択している状態でのprint_rの結果
  1. Array
  2. (
  3.     [status] => 
  4.     [confirm] => 登録内容確認
  5.     [status_name] => あああ,いいい,
  6.     [status_code] => 0,1,
  7. )

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01yakou850チェックボックスの値が 複数選択している場合・1つ
┃┗A01-1agupxお返事ありがとうございます。 早速ためしてみたとこ
┗A02tezcelloエラー時は「 $v が配列になっている」と文句を言って

回答一覧

並び替え:

A01
answereryakou850 [9月4日 21:44] (最終編集:9月4日 21:50)

チェックボックスの値が
複数選択している場合・1つしか選択していない場合・1つも選択していない場合で
配列だったり文字列だったり変化してしまってエラーになっているんでないでしょうか?
ためしに
  1. var_dump($_POST['status']);
のコードを書いて、上に書いた複数選択している場合・1つしか選択していない場合・1つも選択していない場合で試してみてください。
予想があっていれば順に配列・文字列・NULLになるかとおもいます。

  1. function decode() {
  2.     $array = array();
  3.     foreach ($_POST as $k => $v) {
  4.         if (get_magic_quotes_gpc()) {
  5.             $v = stripslashes($v);
  6.         }
  7.         if (!is_array($v)) {
  8.             $v = htmlspecialchars($v, ENT_QUOTES);
  9.         } else {
  10.             foreach ($v as $skey => $sval) {
  11.                 $v[$skey] = htmlspecialchars($sval, ENT_QUOTES);
  12.             }
  13.         }
  14.         $array[$k] = $v;
  15.     }
  16.     return $array;
  17. }
これでは期待の結果になりますでしょうか?

# 追記
html_checkboxesを調べずに書いてしまいました。
<input type=checkbox name="*****[]">で出力されるので
配列orNULLですかね・・・文字列はなさそうな感じです

この意見に回答する

ツリーへ TOPへ

A01-1
replyeragupx [9月4日 22:26]

お返事ありがとうございます。
早速ためしてみたところエラーは表示されなくなりprint_rの結果で

  1. Array 
  2.     [status] => Arrayにならないのはなぜ? 
  3.     [confirm] => 登録内容確認 
  4.     [status_name] => あああ,いいい, 
  5.     [status_code] => 0,1, 
  6. )

と思っていましたがバッチリArrayとなり配列を取得できているようです^^

配列を取得して取得したい値を返す箇所がおかしいのかと悩んでいたのですが
解決でき助かりました!

この意見に回答する

ツリーへ TOPへ

A02
answerertezcello [9月4日 22:22]

エラー時は「 $v が配列になっている」と文句を言っているのですから、その通りなんでしょう。

異なる input タグに同じ name 属性を与えている所はないでしょうか?
そのせいで、本来は1次元の配列で与えられるべき値が、2次元配列になってしまっているとか。

動的に name 属性を変更していると、1次元だったり、2次元だったりするのではないでしょうか?

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)