@mesht00o (web being)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

php チェックボックス 複数の値の受け渡し

こんばんは。
input type=“checkbox”で複数の値の受け渡しがしたいのですが、
「入力画面」で複数選択をしても「確認ページ」で最後に選択したもののみ受け渡しされてしまします。
色々調べてみて試行錯誤した結果今度は、
htmlspecialchars() expects parameter 1 to be string, array given in
とエラーが出てきて困っています。
皆様のお力添えをいただければと思います。
どうぞよろしくお願いします。

0 likes

2Answer

実際にどういったコードで試しているの分からないことにはなんとも言えませんので、
HTMLやPHPのコードも記載されていた方が回答もしやすいです。

おそらくですがチェックボックスのname属性が原因ではないかと思います。
name="values[]"のように[]をつけることで、チェックした項目の値をまとめて配列で受け取れます。

詳しくはこちらが参考になると思います。
【PHP】チェックボックスの値を受け取る

0Like

Comments

  1. @mesht00o

    Questioner

    blue32a様

    回答ありがとうございます。

    以下がコードになります。
    何かアドバイスございましたらよろしくお願いします!

    <?php
    //var_dump($_POST);

    //変数の初期化
    $page_flag = 0;
    $clean =array();
    $error =array();

    //サニタイズ

    if( !empty($_POST) ) {

    foreach( $_POST as $key => $value ) {
    $clean[$key] = htmlspecialchars( $value, ENT_QUOTES);
    }
    }


    if( !empty($clean['btn_confirm']) ) {

    $error=validation($clean);

    if ( empty($error)) {
    $page_flag = 1;


    // セッションの書き込み
    session_start();
    $_SESSION['page'] = true;

    }



    } elseif( !empty($clean['btn_submit']) ) {

    session_start();
    if( !empty($_SESSION['page']) && $_SESSION['page'] === true ) {

    // セッションの削除
    unset($_SESSION['page']);
    $page_flag = 2;

    // 変数とタイムゾーンを初期化
    $header = null;
    $auto_reply_subject = null;
    $auto_reply_text = null;
    $admin_reply_subject = null;
    $admin_reply_text = null;
    date_default_timezone_set('Asia/Tokyo');

    $header = "MIME-Version: 1.0\n";
    $header .= "From:<>\n";
    $header .= "Reply-To: \n";

    // 運営側へ送るメールの件名
    $admin_reply_subject = "お問い合わせを受け付けました";

    // 本文を設定
    $admin_reply_text = "下記の内容でお問い合わせがありました。\n\n";
    $admin_reply_text .= "お問い合わせ日時:" . date("Y-m-d H:i") . "\n";
    if( $_POST['nayami'] ==="01") {
    $admin_reply_text .= "ご相談内容:1\n";
    }else if ($_POST['nayami']==="02") {
    $admin_reply_text .= "ご相談内容:2\n";
    }else if ($_POST['nayami']==="03") {
    $admin_reply_text .= "ご相談内容:3\n";
    }else if ($_POST['nayami']==="04") {
    $admin_reply_text .= "ご相談内容:4\n";
    }else if ($_POST['nayami']==="05") {
    $admin_reply_text .= "ご相談内容:5\n";
    }else if ($_POST['nayami']==="06") {
    $admin_reply_text .= "ご相談内容:6\n";
    }else if ($_POST['nayami']==="07") {
    $admin_reply_text .= "ご相談内容:7\n";
    }else if ($_POST['nayami']==="08") {
    $admin_reply_text .= "ご相談内容:8\n";
    }
    // 管理者へメール送信
    mb_send_mail( '', $admin_reply_subject, $admin_reply_text);


    // 件名を設定
    $auto_reply_subject = 'お問い合わせありがとうございます。';

    // 本文を設定
    $auto_reply_text = "この度は、お問い合わせ頂き誠にありがとうございます。
    下記の内容でお問い合わせを受け付けました。\n\n";
    $auto_reply_text .= "お問い合わせ日時:" . date("Y-m-d H:i") . "\n";
    if( $_POST['nayami'] ==="01") {
    $auto_reply_text .= "ご相談内容:1\n";
    }else if ($_POST['nayami']==="02") {
    $auto_reply_text .= "ご相談内容:2\n";
    }else if ($_POST['nayami']==="03") {
    $auto_reply_text .= "ご相談内容:3\n";
    }else if ($_POST['nayami']==="04") {
    $auto_reply_text .= "ご相談内容:4\n";
    }else if ($_POST['nayami']==="05") {
    $auto_reply_text .= "ご相談内容:5\n";
    }else if ($_POST['nayami']==="06") {
    $auto_reply_text .= "ご相談内容:6\n";
    }else if ($_POST['nayami']==="07") {
    $auto_reply_text .= "ご相談内容:7\n";
    }else if ($_POST['nayami']==="08") {
    $auto_reply_text .= "ご相談内容:8\n";
    }
    // 自動返信メール送信
    mb_send_mail( $clean['email'], $auto_reply_subject, $auto_reply_text, $header);


    }
    } else {
    $page_flag = 0;
    }


    function validation($data) {

    $error=array();

    //バリデーション
    if( empty($data['nayami'])) {
    $error[] = "・「ご相談内容」は必ず選択してください。";
    }
    return $error;
    }?>

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
    <title></title>
    <meta name="description" content="">
    <meta name="keywords" content="">
    <!--style css-->
    <link rel="stylesheet" type="text/css" href="style/style.css">
    <link rel="stylesheet" type="text/css" href="style/min_style.css">
    </head>
    <body>
    <div class="oto_wrap">
    <?php if( $page_flag === 1): ?>

    <form method="post" action="">

    <div class="confirm_wrap">
    <label>ご相談内容</label>
    <?php foreach( $_POST[nayami] as $value ){
    echo "{$value}, ";
    }
    echo '</p>';
    ?>
    </div>

    <div class="bt_wrapper"><input type="submit" name="btn_back" value="戻る">
    <input type="submit" name="btn_submit" value="送信"></div>
    <input type="hidden" name="nayami" value="<?php echo $_POST['nayami']; ?>">
    </form>

    <?php elseif( $page_flag === 2 ): ?>
    <p class="send_mail">送信が完了しました。</p>
    <?php else: ?>

    <?php if( !empty($error) ): ?>
    <ul class="error_list">
    <?php foreach( $error as $value ): ?>
    <li><?php echo $value; ?></li>
    <?php endforeach; ?>
    </ul>
    <?php endif; ?>

    <form method="post" action="">

    <div class="form_wrap">
    <label class="title">ご相談内容<span>必須</span>(複数選択可)</label>
    <input type="checkbox" name="nayami[]" value="01">1
    <input type="checkbox" name="nayami[]" value="02">2
    <input type="checkbox" name="nayami[]" value="03">3
    <input type="checkbox" name="nayami[]" value="04">4
    <input type="checkbox" name="nayami[]" value="05">5
    <input type="checkbox" name="nayami[]" value="06">6
    <input type="checkbox" name="nayami[]" value="07">7
    <input type="checkbox" name="nayami[]" value="08">8
    </div>
    <div class="bt_wrapper"><input type="submit" name="btn_confirm" value="入力内容を確認する"></div>
    </div><!--oto_wrap-->
    </form>
    <?php endif; ?>

    </body>
    </html>

コードを拝見しました。

htmlspecialchars() expects parameter 1 to be string, array given in

これは「htmlspecialchars()のパラメータ1は文字列ですが、配列が指定された」というエラーです。

$clean[$key] = htmlspecialchars( $value, ENT_QUOTES);

おそらくこの行で出たものでしょう。

フォームからPOSTされた値は$_POSTに連想配列として入り、name属性とvalue属性がそのまま連想配列のキーと値になるのですが
name属性をnayami[]のように[]をつけた場合は値が配列となります。

<input type="text" name="hoge" value="hoge">
<input type="text" name="fuga[]" value="fuga1">
<input type="text" name="fuga[]" value="fuga2">
var_dump($_POST['hoge']); // string 'hoge'
var_dump($_POST['fuga']); // array(0 => 'fuga1', 1 => 'fuga2') 

おそらく$keynayamiのとき$valueが配列になっていると思います。

foreach($_POST as $key => $value) {
    $clean[$key] = htmlspecialchars($value, ENT_QUOTES);
}
0Like

Your answer might help someone💌