質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

1ページ内に存在する、複数フォームの値を同時に保持したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,117

score 5

前提・実現したいこと

●【1ページ内に存在する複数フォームの値を、ページ遷移(PHPアクション実施時)で同時に保持したい】

現在、PHP学習の一環で、
簡単な「掲示板」サイトを作っています。
下記の様な機能が実装済です。
A.検索機能(投稿内容や、ユーザー名で検索が出来ます)
B.投稿機能 ※確認画面を挟んで”はい”を押すとDBにレコードを書き込む
C.投稿削除機能 ※確認画面を挟んで”はい”を押すとDBからレコードを削除する

AとBとCで、<form>が別れていて、それぞれ別のPHPファイル(A:検索/B:投稿確認/C:削除確認)を実行させています。
それぞれの<form>毎で、その実行した<form>下のテキストボックスの値は、$_POSTで保持する事が可能ですが、
残りのformの値を保持する事が出来ません。

例えば、検索を実施した際、検索キーワードの保持は出来るが、
投稿内容(内容と投稿者名)の保持が出来なくなってしまうという次第です。

formが異なる場合、どのようにして複数フォームの値を保持出来るのでしょうか?

プログラミング学習を始めて日が浅いため、拙い理解&拙いソースコードで申し訳ないです。
Google検索では、適切なページに辿り着くことができず、大変、困惑しております。
ご教示いただければ幸いです。
よろしくお願い致します。

発生している問題・エラーメッセージ

該当のソースコード

PHP
HTML


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>おしゃべりBBS</title>
</head>
<body>

<?php
session_start();
$SESSION_['ses'] = "";
var_dump($SESSION_['ses']);

//デバッグ用
//print_r($_POST);
?>
<!--見出し-->
<h1>おしゃべりBBS</h1>

<!--検索&並び替え-->
<form action="index.php" method="post" id="search">
<h2>検索</h2>
<select name="search_category">
<option value="all">全て</option>
<option value="content">投稿内容</option>
<option value="user_name">投稿者</option>
<!--<option value="updated_at">投稿日時</option>-->
</select>
<input type="text" name="search_word" value="<?php if(!empty($_POST["search_word"])){echo $_POST["search_word"]; }?>"/>
<button type="submit" onclick="onButtonClick()";>検索</button>
<br />
<!-- 並び替え-->
<select name="sort">
<option value="asc" <?php if(isset($_POST["sort"]) ){ if($_POST["sort"] == "asc"){ echo "selected";} }?>>
投稿が古い順
</option>
<option value="desc" <?php if(isset($_POST["sort"]) ){ if($_POST["sort"] == "desc"){ echo "selected";} }?>>
投稿が新しい順
</option>
</select>
<button type="submit">並び替える</button>
</form>

<!--投稿フォーム-->
<h2>投稿フォーム</h2>
<form action="add_confirm.php" method="post">
<label>投稿内容</label>
<input type="text" name="content" id="content" required/>
<label>投稿者</label>
<input type="text" name="user_name" id="user_name"/>
<button type="submit">送信</button>
</form>

<!--投稿一覧出力-->
<h2>投稿一覧</h2>
<?php
//DBからレコードを取得する
//並び替えのセッティング
if(isset($_POST["sort"]) ){
if($_POST["sort"] == "desc"){
$sort = "DESC";
}else{
$sort = "ASC";
}
}else{
$sort = "ASC";
}
//検索絞り込みのセッティング
if(isset($_POST["search_word"]) && $_POST["search_word"] != ""){
$search_flg = true;
$search_word = htmlspecialchars($_POST["search_word"]);
if($_POST["search_category"] == "all"){
//対象カテゴリー>全て
$search_ctg = "all";
}elseif ($_POST["search_category"] == "content") {
//対象カテゴリー>投稿内容
$search_ctg = "content";
}elseif ($_POST["search_category"] == "user_name") {
//対象カテゴリー>投稿者
$search_ctg = "user_name";
/*}elseif ($_POST["search_category"] == "updated_at") {
// code...
$search_ctg = "updated_at";*/
}
}else{
$search_flg = false;
$search_word = "";
echo "B通過";
}
//DBへの接続
$pdo = new PDO('mysql:host=localhost;dbname=bbs_db;charset=utf8', "root", ""  );
//DBからデータを取得
if($search_flg == false){
//初期は絞り込みなしで全件表示
$sql = "SELECT * FROM bbs ORDER BY updated_at ".$sort;
}else{
//検索絞り込み実施時はキーワードで絞り込む
//カテゴリー>全種
if($search_ctg == "all"){
$sql = "SELECT * FROM bbs WHERE user_name LIKE \"%".$search_word."%\" OR content LIKE \"%".$search_word."%\" ORDER BY updated_at ".$sort;
var_dump($sql);
}
//カテゴリー>投稿者
if($search_ctg == "user_name"){
$sql = "SELECT * FROM bbs WHERE user_name LIKE \"%".$search_word."%\" ORDER BY updated_at \"".$sort;
var_dump($sql);
}
//カテゴリー>投稿内容
if($search_ctg == "content"){
$sql = "SELECT * FROM bbs WHERE content LIKE \"%".$search_word."%\" ORDER BY updated_at \"".$sort;
var_dump($sql);
}
}
$stmt = $pdo->prepare($sql);
$stmt->execute();
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<?php
//DBにデータが存在しない場合と、検索実施の結果該当が0件の場合、表を表示せずにコメントのみ表示する
if(empty($row)){
?>
<h2 style="color:red">データが存在しませんでした。</h2>
<?php
//検索有無に関わらず、1件以上のデータが存在する場合、表でレコードを表示する
}else{
?>
<!-- 投稿内容の表示-->
<table border="1">
<tr>
<th>id</th>
<th>日時</th>
<th>投稿者</th>
<th>投稿内容</th>
<th></th>
</tr>
<?php
foreach ($row as $value) {
?>
<tr>
<td><?php echo $value['id'];?></td>
<td><?php echo $value['updated_at'];?></td>
<td><?php echo $value['user_name'];?></td>
<td><?php echo $value['content'];?></td>
<td>
<form action="delete_confirm.php" method="post">
<input type="hidden" name="delete_id" value="<?php echo $value['id'];?>">
<button type="submit">削除</button>
</form>
</td>
</tr>
<?php
}
?>
</table>
<?php
}
?>
</body>
</html>

試したこと

javascriptで、各フォームの実行ボタンを押下した際に、
PHPのセッション変数に、getElementbyIdで取得した値を保持させようとしたが、
思うようには動かず。
(そもそも無理?)

補足情報(FW/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

クッキーやjsを使って無理やりすればできますが
それはもはやpostで別々な送り先に送る意味がなくなります
formの送り先が違うのですからほかのformを参照しないでください
そうじゃなければ一つの送り先にしてなにかの値をつかって
各送り先に振り分けてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/23 19:44

    なるほど、formを分離せずに、ひとまとめにして、
    それぞれのボタンでアクションを分けたりすればいいのですね。
    ご回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る