TransWikia.com

PHP/セッションを使ってページがリダイレクトされてもチェックボックスにチェックされた状態を作りたい

スタック・オーバーフロー Asked by isseng on December 26, 2021

現在、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 (関数ファイル)

<?php
//商品名一覧取得
function getItemsName(){
  $items = array("料理1","料理2","料理3","料理4");
  return $items;
}

// チェックした商品の値を取得する
function chVal($target,$list,$val1,$val2){
  if(isset($list[$val1][$val2]) && $list[$val1][$val2] == $target){
     echo 'checked="checked"';
    }
}

?>

order.php (入力画面)

<?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>

追加

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

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

confirm.php(確認画面)

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

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

$DATA = $_SESSION['DATA'];

$DATAの中身を確認すると

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

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

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

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

One Answer

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

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

order.php

<?php
session_start();    
$_SESSION["aItems"] = ["料理1"=>0,"料理2"=>0,"料理3"=>0,"料理4"=>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>

confirm.php

<?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>";

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

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

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

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

Answered by Kouki.W on December 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP