• ベストアンサー

PHPで、データを表示させるとき、「何件表示・次のページへ」をやりたいのですが、データが初期化されてうまくできません・・・

お世話になります。 現在、MySQLにデータを入れておいて、Aページで、検索条件を指定し、それをPOSTでBページへ渡します。その受け取ったデータを下に、20件ずつ表示させ、21件目から「次のページ」をクリックすることで、表示させたいのですが、「次のページ」をクリックすると、条件がクリアされ、うまく表示ができません。 簡単な各ページの内容ですが、 A.html(条件指定ページ) ・県名 (項目:福岡、山口、広島)←3項目 ・市町村名 (フリーワード) これら2項目をB.php へPOSTします。 B.php

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.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); これでやりたいことは実現できると思います。

tomofriend
質問者

お礼

ご丁寧にありがとうございます! 早速明日試してみたいと思います。 本当にありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

MYSQL のLIMIT 句を使って select XXX from XXX_table LIMIT 先頭,20 として、 B.php に POST するときに、 先頭の位置を20 ずつ 増やしていけばよいのでは? 私は PostgreSQL で、LIMIT 句を使って質問のような内容を実現したことがありますので、あまり使い方に違いはないとは思います。

tomofriend
質問者

補足

すみません、回答ありがとうございます。 質問が途中で途切れていて、No.1さんの補足欄に追加させていただきました。 athanasiusさんのとおり、その方法はできるのですが、次のページ21件~40件目を表示させるときに、$ken,$ctvが初期化されてしまい、条件がうまく設定できません。よろしくお願いします(^^;;

全文を見る
すると、全ての回答が全文表示されます。
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 B.phpに渡した時点で検索条件をセッションに入れるか、 「次のページ」のリンクに検索条件を埋め込む方法があると 思います。 例えばセッションを使う場合は、検索条件と次のページの開始位置 をセットしておき、 次のページが押され、PHPが呼び出されたときに、セッションから 検索条件と開始位置を取り出してSQLを発行すればいいと思います。 リンクに検索条件を埋め込む場合はエンコードが必要になると思います。 <a href="./b.php?kenmei=エンコードした県名&free=エンコードした市町村名&start=21">次のページ</a> そして、SQLを発行する際に、kenmeiとfreeをデコードしてから発行します。

tomofriend
質問者

補足

すみません、途中で途切れてしまいました。 <?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ともにクリアされ、すべてのデータが表示されるようになります。これを、変数を維持したまま適切に動作させれるようにしたいのですが、さっぱりです。。。すみません、教えてください!よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【PHP】 次の5件の記事を表示させるには?

    例えば、ログファイル(log.txt)に保存されてる記事数が15件あったとします。 【log.txtファイルの中身】 1,あああ君,おはよう ・ ・ ・ 5,おおお君,良い天気ですね ・ ・ ・ 15,そそそ君,明日は晴れるでしょ ページに表示される仕組みについて、画面に表示される記事数を $log= 5; と変数で 5にしています。 ですので、最初のページ(abc.php)に表示される記事は、「1,あああ君,おはよう」のログから5件表示されるのですが 「次のページ」「前のページ」のリンクで、例えば「次のページ」で(abc.php)リンクした場合、「5,おおお君,良い天気ですね」 のログから5件表示させるにはどの様にするば良いのでしょうか? 仕組みなど詳しく教えて頂けると助かります。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 「次の10件を表示する」のような表示がしたい

    住所録を表示するページをPHPで作成しました。 問題なくできたのですが、データが増えたので一度に表示するのは例えば20件とかにして、「次の20件」のようなボタンをおすと、 21件~40件を表示させ、そのページには、 「前の20件」と「次の20件」のボタンを表示させたいと考えています。 最初のページには、「前の20件」ボタンはなく、 最後のページには、「次の20件」ボタンは表示させないように考えています。 どのようにすればよろしいでしょうか。 ご教授ください。 ************************************************ 作成したPHP ************************************************ <?php print("<table>"); $cont = mssql_connect("サーバ名","ユーザ名","パスワード"); mssql_select_db('DB名', $cont); $sql = "select * from テーブル名 $rc = mssql_query($sql,$cont); while ($array = mssql_fetch_array($rc)) { print("<tr>"); print("<td>"); print "".$array["氏名"].""; print("</td>"); print("<td>"); print "".$array["住所"].""; print("</td>"); print("</tr>"); } print("</table>"); mssql_close($cont); ?> ************************************************ 環境 PHP5.2 Apache2.2 SQLserverVersion5 PHPとSQLは別サーバになります。 両サーバOS:windows

    • ベストアンサー
    • PHP
  • mysql>PHPにデータ表示、10件ごとにページ分割

    はじめまして、PHP勉強中の初心者です。。 MYSQLから取り出したデータを件数でページ分割したいのですが、 うまくきません。。 環境:eclipse3.5、mysql5.0、php5.0、xampp (phpで、sql接続、select * from でデータは表示は確認できてます)。。 ソースは↓です。。(初心者なもので不備がればすみません)。。 eclipse上では if (($page_num+1)*10<$cnt) {}でエラーで表示されます。。 どなたかご存知の方いましたら、教えていただけないでしょうか? <!--kensaku.html--> <html> <body> <form action ="kensaku.php" method="post">    名前:<input type="text" name="nm">    年齢:<input type="hidden" name="page_num" value="0">    <input type="submit" name="exec" value="検索"> </form> </body> </html> //kensaku.php ソース <html> <body> <? $nm=$_POST['nm']; $page_num=$_POST['page_num']; //データベースに接続 if (!$conn =mysql_connect("","user","PASS")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("table", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select id,name from table " ; $sql.= "where name like '%$nm% ' order by id " ; $sql.="limit" . $page_num * 10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border=1>" ; echo "<tr><td>id</td><td>name</td></tr>" ; while($row = mysql_fetch_array($res)){ echo "<tr>" ; echo "<td>" . $row["id"] . "</td>" ; echo "<td>" . $row["name"] . "</td>" ; echo "</tr>" ; } echo "</table>" ; //検索条件に該当する全データの件数取得 $sql = "select count(*) from member " ; $sql.="where name like '% $nm % ' order by id " ; if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } $row = mysql_fetch_array($res) ; $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) echo ceil($cnt / 10), "ページの中の", $page_num + 1, "ページ目を表示<br>"; //前の10件 if ($page_num !=0) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num -1..">"; echo "&lt 前の10件"; } //次の10件.--ここからエラー行ですが、、解決策がわかりません。。 if (($page_num+1)*10<$cnt) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num +1..">"; echo " 次の10件 &g</a>t"; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </body> </html> すみませんが、ご存知の方いましたら、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • MySQLとPHPで一覧表示させページ分割するには

    PHP初心者です。 フォトライブラリを作っているのですが、MySQLからのデータを指定件数表示させることは出来るようになりました。 しかしその後の「次のページ」リンクを作り、クリックされた際に次ページで次の一覧を表示させる方法(ページ生成)がわかりません。 静的ページにしたいので、mod_rewriteを使うとの事がわかったのですが、それを具体的に使う方法がわかりませんでした。 サーバへどのような要求があった際にどのようなページを表示させる、等が出来るようなのですが、実際の静的ページ生成の方法・ソースが発見出来ませんでした。 わかりやすいサイトがございましたら教えてくださいませ。

    • 締切済み
    • PHP
  • PHPのデータの受け渡しとフレーム

    PHPを最近始めた者なのですが、 データの受け渡しについてわからないことがあります。 あるページのフォームで入力したデータをフレーム構造のページへ受け渡したとします。(データを入力したページをAとします) これはページAに設置されているフォームのソースです。 <form action="フレームページ.php" method="post"> <input name=(省略)> <input type='submit' value='submit'> </form> フレームページで表示されるページをB、Cとします。 目的はページAで入力したデータをページB、Cに反映させることなのですが、どうしても構造上問題があるのか反映されません。 たぶん受け渡したいデータがフレームページにいってしまい、ページBとCには届いていないと思うのですが、なんとかページB、Cに渡す方法はないでしょうか? フォームのactionをページB.phpと直接打てばデータが反映されることは確認しています。

    • ベストアンサー
    • PHP
  • 「○件リスト表示&次のページへ」と表示させたいのですが・・・

    Web上でPOP3に接続して新着メールを確認するプログラムを作成しています。 受信したメールの一覧を表示させるのではなく、1ページに表示する件数を指定して、件数が多い場合は次のページへといったように表示させたいのですが、プログラムの作成方法がわかりません。 OSはwindowsXP PHP5を利用しています。 どなかたご教授くだされば幸いです。 どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • 【PHP】 URLデータの取得と実行に関して。

    こんばんは。非常に悩んで困っています。 (参考図)               ┌→上フレーム(A.php)               │               │ aaa.php→bbb.php―┼→中フレーム(B.php)               │               │               └→下フレーム(C.php) もし、A.php ページ内のボタン【B】をクリックしたら、中フレームで B.php ページが表示される仕組みで その時、同時に下フレームの C.php ページで、中フレーム にはどのページが表示されているのかを URLで取得する仕組みにしたいのですが、どうやったよいのでしょうか? 具体的には、その時、B.php ページのURLデータを C.php ページ内のボタン【B】のリンクとなるURLに収納したいのです。 そして、C.php ページ内のボタン【B】を押しても、中フレームで B.php ページが表示される仕組にしたいのです。 自分なりに、セッション関数などを使い色々と試したのですが、どうもうまい事いきません。(汗) ちなみに、セッション関数でデータの受け渡しの仕組みをした場合・・・ A.php のページ内のボタン【B】をクリックしたら、中フレームで B.php ページのURLを B.php ページ内で、セッションの値を $_SESSION['burl'] = $burl; として保存し C.php ページ内のボタン【B】URL指定のところで $_SESSION['burl'] として呼び出しても、値が収納されません。(汗) 【参考】 ・ 上記の参考図の表示がずれていたら脳内変換で宜しくお願いします。 ・ ページはフレームを使用し、上フレーム・中フレーム・下フレームと縦に組んでいます。 ・ bbb.php のページは require 関数で呼び出されるページとなってます。 中途半端な知識で対応できず、苦しんでおります。 ちなみに、私は「PHP」の経験が浅いので、分かりやすく詳しく教えて頂けると非常に助かります。 もし宜しければ何方か、どうか教えて下さい。宜しくお願いします。

    • 締切済み
    • PHP
  • PHP 1ページあたりの表示制限に関して

    <?php require_once('test/common.php'); $Data=file("test/item.csv"); $ID=$_GET[id"]; if($P>0){ $Prev=$ID-1; $PrevPage="<a href='index2.html?id={$Prev}'>前の10件</a>"; } $Size=sizeof($Data); if($Size/1-1>$ID){ $Next=$ID+1; $NextPage="<a href='index2.html?id={$Next}'>次の10件</a>"; } ?> 全<?=$Size?>件 | <?=$PrevPage?> <?=$NextPage?> 「次の10件」「前の10件」のところを文字じゃなく画像を用いたいのですが、<img src="img/next.png" width="100px" />を入れてみるとページがエラーになってしまいます。文字じゃなく画像を使うにはどのようにすればいいのですか? 教えてください。

    • 締切済み
    • PHP
  • PHP 10件表示 "前へ" "次へ"

    現在PHPとMYSQLを使用しております。  SQLでデータベースから$fldが一致したデータだけ抽出したデータを 10件ずつ表示させて”次へ”を押すと11~20件目が表示。 また”次へ”を押すと...といった感じに"次へ"と"前に"を表示させたいのですがどうしてもやり方がおもいつきません。  どなたかご存知の方ご教授お願いできませんでしょうか。 ここに今出来ていますスクリプトを記載させて頂きます。 extract($_REQUEST); if (!isset($page)) { $page = 1; } if(!empty($fld)) { //$fldに検索したい住所が入ってます。 $local = addslashes($fld); $where .= "add1 = '$fld' && "; } if(!empty($where)) { $where = substr($where, 0, -3); $where = "WHERE " . $where; } $sql = "select count(*) as cnt from ○○ ". $where; $rst = mysql_query($sql); $row = mysql_fetch_array($rst); $tcnt = $row["cnt"]; mysql_free_result($rst); $totalpage = ceil($tcnt / $PAGESIZE); $pagehead = "<B>$tcnt 件みつかりました。 " . "[" . ($PAGESIZE * ($page - 1) + 1) . "-"; if ($page < $totalpage) { $pagehead .= ($PAGESIZE * $page) . "] を表示</B>"; } else { $pagehead .= "$tcnt] を表示</B>"; } $sql = "select * from ○○ ". $where. " order by renban desc limit " . $PAGESIZE * ($page - 1) . ", $PAGESIZE"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>登録データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo "<br />"; echo $row["people"]; echo " "; echo $row["add1"]; echo $row["add2"]; echo "-"; echo $row["sta"]; echo " "; echo $row["tel"]; echo $row["url"]; echo $row["sejitu"]; echo $row["pr"]; echo "</p><hr />"; } } ?> <?= $pagehead ?> <?php mysql_free_result($result); mysql_close; $param_local = rawurlencode($local); if ($page > 1) { $body .= "<A href = '$PHP_SELF?page=" . ($page - 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "前の $PAGESIZE 件</A>"; } if ($totalpage > 1 and $page < $totalpage) { $body .= "<A href = '$PHP_SELF?page=" . ($page + 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "次の $PAGESIZE 件</A>"; } ?> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • formでデータを送信すると、AUでページが表示できない

    AUの携帯でPHPで書かれているページに普通にアクセスすると表示されるのですが、そのページの中にPOSTで送信するボタンがあり、そのボタンをクリックすると「リクエストされたページは表示できません」というエラー表示がされてしまいます。 POSTがだめなのかもと考え、GETに変えてみましたが同様の結果でした。 サーバの設定の問題かなとも思いましたが、他のページはきちんと見ることができます。また、ファイルのサイズの問題かと思いましたが、画像も使用していないページですし、POSTで送信するデータ量も多いとは考えられないのですが、他にどのような問題が考えられますか? よろしくお願いします。

    • ベストアンサー
    • PHP