68958


現在、PHPにて問合せフォームを作成しています。

入力画面となる `order.php`
で送信ボタンを押した際に、チェックボックスにチェックした商品名(複数選択可)を配列`$items`に入れ、それを`$_SESSION['DATA']`に入れたいのですが、下記コード内容で入れることができません。(以下参照)  
ご回答いただけますと幸いです。

### 環境

  * mac OS X Mojave 10.14.6
  * Google Chrome
  * MAMP 5.7 (MySQL 5.7.26, php 7.4.2, Apache 2.2.34)

* * *

### ソースコード

**lib-order.php** (関数ファイル)

[code]

    <?php
    //商品名一覧取得
    function getItemsName(){
      $items　= array("料理１","料理２","料理３","料理４");
      return $items;
    }
    
    // チェックした商品の値を取得する
    function chVal($target,$list,$val1,$val2){
      if(isset($list[$val1][$val2]) && $list[$val1][$val2] == $target){
         echo 'checked="checked"';
        }
    }
    
    ?>
    
[/code]

**order.php** (入力画面)

[code]

    <?php
    
    require_once('lib-order.php');
    
    session_start();
    
    if(!isset($_SESSION['BACK']) && !isset($_POST["back"])){
        unset($_SESSION['DATA']);
        unset($_SESSION['ERROR']);
        unset($_SESSION);
    }
    
    unset($_SESSION['BACK']);
    
    //商品名一覧
    $itemNames = getItemsName();
    
    $DATA = $_SESSION['DATA'];
    $ERROR = $_SESSION['ERROR'];
    
    ?>
    
    <form method="post" action="confirm.php" >
    〜
    省略
    〜
      <dl>
        <dt><span class="label">必須</span>ご希望商品</dt>
        <dd>
          <?php 
            foreach($itemNames as $key=>$value){
             echo '<label>'.'<input type="checkbox" name="items['.$key.']" value="'.$value.'" '.chVal($value,$DATA,"items",$key).'>'.$value.'</label>';
            }
          ?>
        </dd>
      </dl>
      <button class="btn-submit" type="submit" name="confirm" value="confirm">入力確認</button>
    </form>
    
[/code]

* * *

### 追加

すみません、確認したところ、`$_SESSION['DATA']`に配列は入っていました。  
エラー等で、`order.php` (入力画面)にリダイレクトされても、チェックボックスにチェックされたままの状態を作りたいです。

**●以下詳細**  
`order.php`
(入力画面)にて、フォーム送信ボタンを押したあと(`method="post"`)、遷移先の`confirm.php`(確認画面)にて、以下のように`$_POST`を変数に代入したのち、セッション変数に代入してます。

**confirm.php** (確認画面)

[code]

    $DATA = $_POST;
    $_SESSION['DATA'] = $DATA;
    
[/code]

そこから、エラーがあれば`order.php`(入力画面)にリダイレクトし、以下のように`$DATA`に代入してます。

[code]

    $DATA = $_SESSION['DATA'];
    
    
[/code]

`$DATA`の中身を確認すると

[code]

    Array ( [fullname] => 山田 太郎 [fullname-kana] => やまだ たろう [items] => Array ( [0] => 料理1 [1] => 料理2 [3] => 料理3 [3] => 料理4 )  )
    
[/code]

といった多次元配列となっています。

複数選択可のチェックボックスでチェックを打ったものが、上記配列`[items]`に入るようになっています。  
`lib-order.php`(関数ファイル)の関数(`chVal`)をつかって(`order.php`参照)  
リダイレクトされても、チェックボックスにチェックされている状態を作りたいです。

説明がまとまっておらず、すみません、、


CC BY-SA 4.0
2020-07-24T09:29:58.123
68910
2020-07-26T02:25:08.093
2020-07-25T11:23:50.063
32986
41231
question
php array session
PHP/セッションを使ってページがリダイレクトされてもチェックボックスにチェックされた状態を作りたい


こんにちは、はじめまして。

コードを拝見しました。とりあえずこちらでリロードしても、チェックボックスが維持されて、ポストもできるようにフォームを作成してみました。関数や変数名などに関しては踏襲しおらず、処理については、だいぶ変えてしまっているので、ご質問の趣旨や環境に則さない点などございましたらご指摘ください。

## order.php

[code]

    <?php
    session_start();    
    $_SESSION["aItems"] = ["料理１"=>0,"料理２"=>0,"料理３"=>0,"料理４"=>0];
    
    if(isset($_POST)){
        if(isset($_POST["items"])){
            foreach($_POST["items"] as $k=>$v){
                //echo $k,$v;
                $_SESSION["aItems"][$k]=$v=="on"?1:0;
            }
        }
        if($_POST["key"] == "submit"){
            //Redirect With Post Parameter
            header('HTTP/1.1 307 Temporary Redirect');
            header("Location: ./confirm.php");
            die;
        }
    }
    ?>
    <form method="post" action="./order.php" >
      <dl>
        <dt><span class="label">必須</span>ご希望商品</dt>
        <dd>
          <?php 
            foreach($_SESSION["aItems"] as $key=>$value){
             $checked=""; if($value) $checked="checked=checked";
             echo "<label><input type='checkbox' name='items[$key]' $checked>$key</label>";
            }
          ?>
        </dd>
      </dl>
      <button class="btn-submit" type="submit" name="key" value="submit">確認画面へ</button>
      <button class="btn-submit" type="submit" name="key" value="reload">リロード</button>
    </form>
    
[/code]

## confirm.php

[code]

    <?php
    session_start();
    echo "### SESSION DATA<br><pre>";
    json_encode(var_export($_SESSION));
    echo "</pre><br>### POSTED DATA<br><pre>";
    json_encode(var_export($_POST));
    echo "</pre>";
    
[/code]

セッションに値を代入されてないのがうまく動かない原因ではないかと思います。  
素のPHPではポストされた内容をセッションに移し替えてあげるひと手間が必要です。

他に気になった点ですが。

  * POSTは自分宛てとし、ボタンパラメーターでジャンプ先を制御したほうが、フォームの内容を維持するなどのケースでは楽に実装できますので、例ではそのようにしています。
  * input checkbox については値のon/offは checked=checked もしくは単に checked でチェックされた状態をあらわします
  * PHPで変数が反映された文字列を作るのはダブルクォートかヒアドキュメントを使ったほうが楽です

セッション周りの汚染とかクリンナップを考え出すと素のPHPでの作業は、大変ですので、基礎を学んだあとはフレームワークの利用なども検討されることをおすすめします。


CC BY-SA 4.0
2020-07-25T14:37:41.170
68958
2020-07-26T02:25:08.093
2020-07-26T02:25:08.093
37777
37777
68910
answer