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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

2回答

23674閲覧

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

SayakaxxSakura

総合スコア19

PHP

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

0グッド

2クリップ

投稿2017/09/29 05:34

編集2017/09/29 06:17

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>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/09/29 05:44

エラーが出ている場合は、そのエラーメッセージも質問に追記してください。セッションを利用されているとのことなので、可能な限りプログラム全文を提示したほうが、回答者も指摘事項を見つけやすくなります。
SayakaxxSakura

2017/09/29 05:47

ありがとうございます。修正致します。
m.ts10806

2017/09/29 06:10

あとは「3日前の質問」と状態がどのように違って何を調べてどのようにやってみたのかを具体的に書かれた方が良いと思います。(調べた先のURLとか)
t_obara

2017/09/29 06:16

ちなみに、sessionについてはご理解できたのでしょうか?sessionを利用して、どうなることを期待してご提示された実装をしたのだけれど、想定通りに動作しないというように絞り込んで確認をするとより回答が得られやすいかと思います。
SayakaxxSakura

2017/09/29 06:19

ご質問ありがとうございます。はいsession関数に関しては軽く理解をし、アクセス数をカウントするものであれば制作はできました。ですが、上記にもあるようにそれを使ってどう値を渡すのか?には辿りつけませんでした。
SayakaxxSakura

2017/09/29 06:43

Jqueryは基本知識程度ですが、使えます。一時期Javascriptを勉強していたので読み取る事や簡易的なコードであれば使えます。
t_obara

2017/09/29 08:06

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

2017/09/29 09:37

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

2017/09/30 07:31

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

回答2

0

ベストアンサー

※ページャー実装版

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

view.php

PHP

1<?PHP 2session_start(); 3?> 4<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 5<script> 6$(function(){ 7 var flg=false; 8 $('input[type=checkbox][name="c[]"]').on('change',function(){ 9 var fd=new FormData(); 10 if(flg){ 11 fd.append("c",$(this).attr("value")); 12 fd.append("do",$(this).prop('checked')?"add":"del"); 13 } 14 $.ajax({ 15 "url":"regist.php", 16 "type":"post", 17 "dataType":"json", 18 "data":fd, 19 "processData": false, 20 "contentType": false, 21 }).done(function(data){ 22 console.log(data); 23 var c=data["c"]; 24 $('#f1 input[type=checkbox][name="c[]"]').each(function(){ 25 $(this).prop('checked', c.indexOf($(this).attr('value'))>=0); 26 }); 27 }); 28 }).eq(0).trigger('change'); 29 flg=true; 30}); 31</script> 32<form id="f1"> 33<?PHP 34$p=filter_input(INPUT_GET,"p",FILTER_DEFAULT,["options"=>["default"=>1]]); 35/*以下ページャーダミー*/ 36switch($p){ 37case "1": 38?> 39<input type="checkbox" name="c[]" value="1">1<br> 40<input type="checkbox" name="c[]" value="2">2<br> 41<input type="checkbox" name="c[]" value="3">3<br> 42<input type="checkbox" name="c[]" value="4">4<br> 43<a href="?p=2">next</a> 44<?PHP 45break; 46case "2": 47?> 48<input type="checkbox" name="c[]" value="5">5<br> 49<input type="checkbox" name="c[]" value="6">6<br> 50<input type="checkbox" name="c[]" value="7">7<br> 51<input type="checkbox" name="c[]" value="8">8<br> 52<a href="?p=1">prev</a> 53<a href="?p=3">next</a> 54<?PHP 55break; 56case "3": 57?> 58<input type="checkbox" name="c[]" value="9">9<br> 59<input type="checkbox" name="c[]" value="10">10<br> 60<input type="checkbox" name="c[]" value="11">11<br> 61<input type="checkbox" name="c[]" value="12">12<br> 62<a href="?p=2">prev</a> 63<?PHP 64break; 65} 66?> 67</form> 68

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 09:06

編集2017/10/02 03:03
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/09/29 09:07

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

2017/09/29 09:23

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

2017/09/29 09:31

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

2017/10/02 02:59

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

0

sampleあげておきます

  • view.php

表示・選択用ページ

  • regist.php

バックグラウンドでデータをセッションに登録するページ

view.php

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

PHP

1session_start(); 2print_r($_SESSION);

javascript

1$(function(){ 2 $('input').on('change',function(){ 3 var fd=new FormData($('#f1').get(0)); 4 $.ajax({ 5 url:"regist.php", 6 type:"post", 7 dataType:"json", 8 data:fd, 9 processData: false, 10 contentType: false, 11 }).done(function(data){ 12 console.log(data); 13 }); 14 }).eq(0).trigger('change'); 15});

HTML

1<form id="f1"> 2<input type="checkbox" name="c[]" value="1">1<br> 3<input type="checkbox" name="c[]" value="2">2<br> 4<input type="checkbox" name="c[]" value="3">3<br> 5<input type="checkbox" name="c[]" value="4">4<br> 6</form> 7<a href="?p=2">next</a> 8

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

regist.php

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

PHP

1session_start(); 2$c=filter_input(INPUT_POST,"c",FILTER_DEFAULT,['flags'=>FILTER_REQUIRE_ARRAY]); 3if(is_null($c)){ 4 unset($_SESSION["c"]); 5}else{ 6 $_SESSION["c"]=$c; 7} 8print json_encode(["c"=>$c]);

投稿2017/09/29 06:19

編集2017/09/29 06:19
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SayakaxxSakura

2017/09/29 06:32

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

2017/09/29 06:40

とりあえずテスト用なので適当な名前で2つファイルを作ってみてください reigst.phpはajax内でファイル名を指定すること ちゃんと実装するには仕様がおかしいところがあるので 動作が分かったら、つぎのステップに進みます
SayakaxxSakura

2017/09/29 06:54

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

2017/09/29 06:56

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

2017/09/29 07:02

Array ( [test] => 123 [count] => 21 ) □1 □2 □3 □4 next となっており、ボタンを押しても上記の連想配列の値は変わりませんがこれで合っているのでしょうか?
yambejp

2017/09/29 08:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問