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

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

ただいまの
回答率

90.34%

  • PHP

    21321questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ページ遷移での値保持について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 5,260

SayakaxxSakura

score 12

PHP初心者です

現在商品数が180件程度のカタログサイトを作っています。
以前質問させていただいて、優しい方のお陰でページング機能を追加することができました。
しかしここで、問題が発生したのが、1ページ目で入力した値を
2ページ目で保持できず
注文確認画面に行くと、アクティブのページの情報しか表記されません。

例:
【A】index.php?=p1 で
10件の商品を選択、

そのままページ遷移し

【B】index.php?=p2 で
こちらでは8件の商品を選択

注文内容確認ボタン

【注文内容確認ページ】
ご注文内容は8件です

となり【A】で入力した値を保持できません。

これがわからず3日前に同じ質問させていただいたのですが、
session関数などを使えばできるとの回答でした。
ここ3日間ずっと検索をし
input hiddenやsessionを使って色々模索してみましたが
エラーがでてページが表示されなくなったり
値保持ができず何もかわらなかったり
とがっつりハマってしまっています。

なんとか解決策を教えて頂けないでしょうか?
よろしくお願いいたします。

調べたワード

PHP session 値保持
PHP session 使い方
PHP session 値 渡せない
PHP session 
ページング 値保持
ページング session
session foreach php
ページング session 値保持
php session 初心者
php session 関数 使い方

上記で検索してくるページはほとんど見ましたが
どれを見ても自分と近い状況の方はおらず理解できませんでした…

3日前とかわったところは正直ほとんどありません
色々検索、施行した結果結局何もわからなかったです。

session関数を使ったカウントはできましたが
値の受け渡しがやはりできませんでした

【フロント index.php】

<?php                      
require_once ('data.php'); 
require_once('menu.php');  

session_start();           

?>                         

<form action="confirm.php" method="post">
        <div class="item-item">
            <h3 class="lines-on-sides">CATALOG</h3>
            <p class="item-title">カタログ</p>
        </div>

        <div class="menu-items">
            <?php isset($_REQUEST['p'])? $_REQUEST['p'] *20 :0 * 20 ?>
                <?php foreach(array_slice($menus,isset($_REQUEST['p'])? ($_REQUEST['p'] -1 )  *20 :0 * 20, 20) as $menu): ?>
                    <div class="menu-item">
                        <img src="<?php echo $menu -> getImage(); ?>" class="catalog-image" alt="<?php echo $menu -> getJan() ?>" name="img"><!-- これで画像を呼び出し -->
                        <h3 class="catalog-title">
                            <a href="show.php?name=<?php echo $menu -> getName() ?>">
                                <?php echo $menu -> getName(); ?></a>
                            <?php
                            $_SESSION ['name'] = $menu -> getName();
                            ?>
                        </h3>
                        <p class="menu-item-type">Category<i class="fa fa-angle-double-right" aria-hidden="true"></i><?php echo $menu -> getType()?></p><!--サブカテゴリを表示-->
                        <p class="jan">JANCode<i class="fa fa-angle-double-right" aria-hidden="true"></i><?php echo $menu -> getJan() ?></p>
                        <p class="price">¥<?php echo $menu -> getTaxPrice() ?>(税込)</p><!-- これで値段を呼び出し -->
                        <select name="<?php echo $menu -> getName()?>" class="select">
                            <option value="0">0<i class="fa fa-caret-down" aria-hidden="true"></i></option>
                            <?php for($i = 1; $i <= 99; $i++): ?>
                                <option value="<?php echo $i?>"><?php echo $i?></option>
                            <?php endfor ?>
                        </select>
                        <span></span>
                    </div>
                <?php endforeach;?>

            <div class="pageWrap">
            <?php for($i = 1; $i <= ceil(Menu::getCount() / 20); $i++):?>
                <?php if($i == $_REQUEST['p']) :?>
                    <a class="pageColor-active" href="http://localhost/Catalog/?p=<?= $i ?>"><?= $i ?></a>
                <?php else :?>
                    <a class="pageColor" href="http://localhost/Catalog/?p=<?= $i ?>"><?= $i ?></a>
                <?php endif ?>
            <?php endfor?>
            </div>
        </div>

        <div class="mitumori-wrap">
            <h3>簡易見積り書を作成</h3>
            <div class="mitumori-background">
                <div class="mitumori-wrapper">
                        <p>お見積書宛名</p>
                    <input type="text" name="name" vaue="" class="mitu"/><span class="right">御中</span>
                </div>
                <p class="buttonwrap"><input type="submit" value="見積もり内容を確認" class="button" /></p>
            </div>
        </div>

    </form>

【確認ページ confrm.php】

<?php
require_once('data.php');

$conpanyName = $_POST['name'];

session_start();


?>

<div class="order-wrapper">
    <div class="order-border-wrap">
        <h2 class="confi-title">見積もり内容</h2>
        <div class="order-wrap2">
            <div class="order-left"><h2>商品内容</h2></div>
            <div class="order-center"><h2>数量</h2></div>
            <div class="order-right"><h2>小計</h2></div>
        </div>
        <?php $totalPayment = 0 ?>
        <?php foreach ($menus as $menu): ?>
            <!-- 変数$orderCountに$_POSTで受け取った値を代入 -->
            <?php
                $orderCount = $_POST[$menu -> getName()];
                echo $menu -> setOrderCount($orderCount);
                $totalPayment += $menu -> getTotalPrice(); //$totalPaymentに注文の合計を代入
            ?>
                <?php if(1 <= $orderCount): ?>



                <div class="order-wrap">
                    <div class="left">
                        <img src="<?php echo $menu -> getImage(); ?>" class="catalog-image-confirm" alt="<?php echo $menu -> getJan() ?>">

                    </div>
                    <div class="center">
                        <p class="order-item-type"><?php echo $menu->getType() ?></p>
                        <p class="order-name"> <?php echo $menu -> getName() ?>
                        <p class="order-texprice">¥<?php echo $menu -> getTaxPrice() ?></p>
                    </div>
                    <div class="right">
                        <p class="order-count"><?php echo $orderCount ?></p>
                    </div>
                    <div class="right2">
                        <p class="order-price">¥<?php echo $menu -> getTotalPrice() ?></p>
                    </div>
                </div>
                <?php endif ?>
        <?php endforeach ?>
    </div>
    <h3 class="tex-Total-Price">合計金額: <span class="red">¥<?php echo $totalPayment ?></h3>
    <a data-target="con1" class="modal-open"><button class="print">お見積書を発行</button></a>
    <br class="clear">
</div>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/09/29 17:06

    アクセス数とは個人ごとのアクセス数を意味していますか?単に不特定多数のページアクセスを意味しているのでしょうか?後者と認識しておられるのであれば、まだ理解が不足されているのだと思います。

    キャンセル

  • SayakaxxSakura

    2017/09/29 18:37

    ご質問ありがとうございます。個人ごとのアクセス数です

    キャンセル

  • t_obara

    2017/09/30 16:31

    個人ごとをセッションに保存できるのであれば、ページごとの情報も同じような考えで保持するように考えると良いと思いますが、さらにその先で引っかかっているとするならば、その点を質問とした方が、より適切に素早い回答が得られるのではないかと思われます。

    キャンセル

回答 2

+2

sampleあげておきます

  • view.php
    表示・選択用ページ
  • regist.php
    バックグラウンドでデータをセッションに登録するページ

 view.php

チェックボックスが変わる度にformデータをregistに送ってバックグラウンドに登録しておきます

session_start();
print_r($_SESSION);
$(function(){
  $('input').on('change',function(){
    var fd=new FormData($('#f1').get(0));
    $.ajax({
    url:"regist.php",
    type:"post",
    dataType:"json",
    data:fd,
    processData: false,
    contentType: false,
    }).done(function(data){
      console.log(data);
    });
  }).eq(0).trigger('change');
});
<form id="f1">
<input type="checkbox" name="c[]" value="1">1<br>
<input type="checkbox" name="c[]" value="2">2<br>
<input type="checkbox" name="c[]" value="3">3<br>
<input type="checkbox" name="c[]" value="4">4<br>
</form>
<a href="?p=2">next</a>


※今回はサンプルなのでページングはスタティックに書いてありますが
ページャー部分はphpで実装して下さい

 regist.php

送られてきたデータをセッションにため、念の為jsonデータとして元ページに戻します

session_start();
$c=filter_input(INPUT_POST,"c",FILTER_DEFAULT,['flags'=>FILTER_REQUIRE_ARRAY]);
if(is_null($c)){
  unset($_SESSION["c"]);
}else{
  $_SESSION["c"]=$c;
}
print json_encode(["c"=>$c]);

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/29 15:32

    詳細な回答ありがとうございます。
    view.phpはindex.phpに
    regist.phpを新たにファイルとして作成させていただければ良いのでしょうか?
    やってる事はなんとなく読めるのですが、自分のソースだとどう反映すれば良いのかがわかりません。
    初心者のためせっかくのコードも理解できずすみません。

    キャンセル

  • 2017/09/29 15:40

    とりあえずテスト用なので適当な名前で2つファイルを作ってみてください
    reigst.phpはajax内でファイル名を指定すること

    ちゃんと実装するには仕様がおかしいところがあるので
    動作が分かったら、つぎのステップに進みます

    キャンセル

  • 2017/09/29 15:54

    上記実装してみました。
    チェックボックス4つが並んだページに
    NEXTを押すとページが遷移するといった仕様で間違いないでしょうか?
    ページング部分がわからないため。そのまま
    a href="?p=2" のままですが良かったでしょうか?
    ファイル名もそのまま作りました。

    キャンセル

  • 2017/09/29 15:56

    チェックしたチェックボックスの番号が何の変哲もないaタグで飛んだ先で
    print_r()で表示されますよね?
    これがセッションを利用したデータの遷移です。

    キャンセル

  • 2017/09/29 16:02

    Array ( [test] => 123 [count] => 21 )
    □1
    □2
    □3
    □4

    next

    となっており、ボタンを押しても上記の連想配列の値は変わりませんがこれで合っているのでしょうか?

    キャンセル

  • 2017/09/29 17:32

    ごめんなさい、本チャン用に相当修正するのでスレッド分けます
    いましばらくお待ち下さい

    キャンセル

checkベストアンサー

+1

※ページャー実装版

とりあえず、すべてベタに貼り付けます。

 view.php

<?PHP
session_start();
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function(){
  var flg=false;
  $('input[type=checkbox][name="c[]"]').on('change',function(){
    var fd=new FormData();
    if(flg){
      fd.append("c",$(this).attr("value"));
      fd.append("do",$(this).prop('checked')?"add":"del");
    }
    $.ajax({
      "url":"regist.php",
      "type":"post",
      "dataType":"json",
      "data":fd,
      "processData": false,
      "contentType": false,
    }).done(function(data){
      console.log(data);
      var c=data["c"];
      $('#f1 input[type=checkbox][name="c[]"]').each(function(){
        $(this).prop('checked', c.indexOf($(this).attr('value'))>=0);
      });
    });
  }).eq(0).trigger('change');
  flg=true;
});
</script>
<form id="f1">
<?PHP
$p=filter_input(INPUT_GET,"p",FILTER_DEFAULT,["options"=>["default"=>1]]);
/*以下ページャーダミー*/
switch($p){
case "1":
?>
<input type="checkbox" name="c[]" value="1">1<br>
<input type="checkbox" name="c[]" value="2">2<br>
<input type="checkbox" name="c[]" value="3">3<br>
<input type="checkbox" name="c[]" value="4">4<br>
<a href="?p=2">next</a>
<?PHP
break;
case "2":
?>
<input type="checkbox" name="c[]" value="5">5<br>
<input type="checkbox" name="c[]" value="6">6<br>
<input type="checkbox" name="c[]" value="7">7<br>
<input type="checkbox" name="c[]" value="8">8<br>
<a href="?p=1">prev</a>
<a href="?p=3">next</a>
<?PHP
break;
case "3":
?>
<input type="checkbox" name="c[]" value="9">9<br>
<input type="checkbox" name="c[]" value="10">10<br>
<input type="checkbox" name="c[]" value="11">11<br>
<input type="checkbox" name="c[]" value="12">12<br>
<a href="?p=2">prev</a>
<?PHP
break;
}
?>
</form>

 regist.php

<?PHP
session_start();
$post_c=filter_input(INPUT_POST,"c");
$c=[];
if(isset($_SESSION["c"])){
  if(is_array($_SESSION["c"])){
    $c=$_SESSION["c"];
  }else{
    unset($_SESSION["c"]);
  }
}
$do=filter_input(INPUT_POST,"do");

if($do=="del" and in_array($post_c,$c)){
  $c=array_filter($c,function($x) use($post_c){return $x!==$post_c;});
  $c=array_values($c);
}if($do=="add" and !in_array($post_c,$c)){
  array_push($c,$post_c);
}
$_SESSION["c"]=$c;
print json_encode(["c"=>$c]);
?>

※表記がダブっていた箇所があったので修正してます

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/29 18:07

    なにか不具合があったら指摘下さい

    キャンセル

  • 2017/09/29 18:23

    ありがとうございます!!早速テストしてみましたが
    ページ遷移しても値保持できてますね!!
    これを自分のページに反映させるにはどうすれば良いのでしょうか?

    キャンセル

  • 2017/09/29 18:31

    挙動がわかれば後は実装するだけですよね?
    選択方法を精査して、registにデータを投げるだけです
    最終的な確認ページでは、セッションデータから全てのチェック済み項目を
    抜き出して羅列すればいいでしょう

    キャンセル

  • 2017/10/02 11:59

    返答が遅くなり申し訳ございません。
    自分のために、わかりやすく実装コードまで組んでいただきありがとうございました。
    無事実装したところ思うような挙動になりましたので改めてご報告させていただきます。
    ベストアンサーに選ばせて頂きました。

    キャンセル

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

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

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

  • PHP

    21321questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。