スタック・オーバーフロー Asked by isseng on December 26, 2021
現在、PHPにて問合せフォームを作成しています。
入力画面となる order.php
で送信ボタンを押した際に、チェックボックスにチェックした商品名(複数選択可)を配列$items
に入れ、それを$_SESSION['DATA']
に入れたいのですが、下記コード内容で入れることができません。(以下参照)
ご回答いただけますと幸いです。
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
参照)
リダイレクトされても、チェックボックスにチェックされている状態を作りたいです。
説明がまとまっておらず、すみません、、
こんにちは、はじめまして。
コードを拝見しました。とりあえずこちらでリロードしても、チェックボックスが維持されて、ポストもできるようにフォームを作成してみました。関数や変数名などに関しては踏襲しおらず、処理については、だいぶ変えてしまっているので、ご質問の趣旨や環境に則さない点などございましたらご指摘ください。
<?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>
<?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ではポストされた内容をセッションに移し替えてあげるひと手間が必要です。
他に気になった点ですが。
セッション周りの汚染とかクリンナップを考え出すと素のPHPでの作業は、大変ですので、基礎を学んだあとはフレームワークの利用なども検討されることをおすすめします。
Answered by Kouki.W on December 26, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP