- ベストアンサー
PHPで、データを表示させるとき、「何件表示・次のページへ」をやりたいのですが、データが初期化されてうまくできません・・・
お世話になります。 現在、MySQLにデータを入れておいて、Aページで、検索条件を指定し、それをPOSTでBページへ渡します。その受け取ったデータを下に、20件ずつ表示させ、21件目から「次のページ」をクリックすることで、表示させたいのですが、「次のページ」をクリックすると、条件がクリアされ、うまく表示ができません。 簡単な各ページの内容ですが、 A.html(条件指定ページ) ・県名 (項目:福岡、山口、広島)←3項目 ・市町村名 (フリーワード) これら2項目をB.php へPOSTします。 B.php
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 if($p > 1){ echo "<a href=\"".$_SERVER["PHP_SELF"]."?p=$prev">前のページ</a>"; } if(($next - 1)*20 < $datacnt){ echo "<a href=\"".$_SERVER["PHP_SELF"]."?p=$next">次のページ</a>"; の部分で、入力された条件を引き継ぐ必要があります。 ?p=$prev&ken=$kenUrl&ctv=$ctvUrl こうすれば条件も次のページに引き継げます。 1で回答したとおり、$kenUrlと$ctvUrlはURLエンコードを行います。 $kenUrl = rawurlencode($ken); $ctvUrl = rawurlencode($ctv); で、受け取りですが、現在のソースを見た限りだと POSTになっているので、受け取れません。 GETで別途に受け取るか、$ken = $_REQUEST['ken']; で取得してください。 取得後、デコード処理が入ります。 $ken = rawurldecode($ken); $cvt = rawurldecode($cvt); これでやりたいことは実現できると思います。
その他の回答 (2)
- athanasius
- ベストアンサー率37% (361/964)
MYSQL のLIMIT 句を使って select XXX from XXX_table LIMIT 先頭,20 として、 B.php に POST するときに、 先頭の位置を20 ずつ 増やしていけばよいのでは? 私は PostgreSQL で、LIMIT 句を使って質問のような内容を実現したことがありますので、あまり使い方に違いはないとは思います。
補足
すみません、回答ありがとうございます。 質問が途中で途切れていて、No.1さんの補足欄に追加させていただきました。 athanasiusさんのとおり、その方法はできるのですが、次のページ21件~40件目を表示させるときに、$ken,$ctvが初期化されてしまい、条件がうまく設定できません。よろしくお願いします(^^;;
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 B.phpに渡した時点で検索条件をセッションに入れるか、 「次のページ」のリンクに検索条件を埋め込む方法があると 思います。 例えばセッションを使う場合は、検索条件と次のページの開始位置 をセットしておき、 次のページが押され、PHPが呼び出されたときに、セッションから 検索条件と開始位置を取り出してSQLを発行すればいいと思います。 リンクに検索条件を埋め込む場合はエンコードが必要になると思います。 <a href="./b.php?kenmei=エンコードした県名&free=エンコードした市町村名&start=21">次のページ</a> そして、SQLを発行する際に、kenmeiとfreeをデコードしてから発行します。
補足
すみません、途中で途切れてしまいました。 <?php ken = $_POST['ken']; //県名が入ります ctv = $_POST['ctv']; //市町村名(フリーワード) if($ken != "" && $ctv != ""){ $sqlcnt ="SELECT COUNT(*) AS cnt FROM table WHERE ken=\"$ken\" && ctv LIKE '%\"$ctv\"%' LIMIT $st,$lim"; }elseif($ken == "" && $ctv != ""){ $sqlcnt ="SELECT COUNT(*) AS cnt FROM table WHERE ctv LIKE '%\"$ctv\"%' LIMIT $st,20"; }elseif($ken !="" && $ctv ==""){ $sqlcnt ="SELECT COUNT(*) AS cnt FROM table WHERE ken=\"$ken\" LIMIT $st,20"; }else{ $sql ="SELECT COUNT(*) AS cnt FROM table LIMIT $st,20"; } if(!$conn = mysql_connect("localhost","usr","passwd")){ die("接続不可"); mysql_select_db("database",$conn); $res = mysql_query($sqlcnt,$conn) or die("抽出エラー"); $row = mysql_fetch_array($res); $datacnt = $row["cnt"]; $p = intval($_GET['p']); if($p <1){ $p = 1; } $st = ($p - 1)*20; $prev = $p - 1; if($prev < 1){ $prev = 1; } $next = $p + 1; if($p > 1){ echo "<a href=\"".$_SERVER["PHP_SELF"]."?p=$prev">前のページ</a>"; } if(($next - 1)*20 < $datacnt){ echo "<a href=\"".$_SERVER["PHP_SELF"]."?p=$next">次のページ</a>"; if($conn = mysql_connnect("localhost","usr","passwd")){ die("接続不可"); mysql_select_db("database",$conn); if($ken != "" && $ctv != ""){ $sql ="SELECT * FROM table WHERE ken=\"$ken\" && ctv LIKE '%\"$ctv\"%' LIMIT $st,$lim"; }elseif($ken == "" && $ctv != ""){ $sql ="SELECT * FROM table WHERE ctv LIKE '%\"$ctv\"%' LIMIT $st,20"; }elseif($ken !="" && $ctv ==""){ $sql ="SELECT * FROM table WHERE ken=\"$ken\" LIMIT $st,20"; }else{ $sql ="SELECT * FROM table LIMIT $st,20"; } $res = mysql_query($sql,$conn); while($row = mysql_fetch_array($res)){ print($row["ken"],$row["ctv"]\n); } mysql_free_result($res); ?> 稚拙なプログラミングですが、間違いないものとします。ここで、データ数が50件だとして、20件表示後、次のページ をクリックすると、$ken,$ctvともにクリアされ、すべてのデータが表示されるようになります。これを、変数を維持したまま適切に動作させれるようにしたいのですが、さっぱりです。。。すみません、教えてください!よろしくお願いします。
お礼
ご丁寧にありがとうございます! 早速明日試してみたいと思います。 本当にありがとうございました!