アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

現在、MySQLにデータを入れておいて、Aページで、検索条件を指定し、それをPOSTでBページへ渡します。その受け取ったデータを下に、20件ずつ表示させ、21件目から「次のページ」をクリックすることで、表示させたいのですが、「次のページ」をクリックすると、条件がクリアされ、うまく表示ができません。

簡単な各ページの内容ですが、

A.html(条件指定ページ)
・県名
(項目:福岡、山口、広島)←3項目
・市町村名
(フリーワード)
これら2項目をB.php へPOSTします。

B.php

A 回答 (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);

これでやりたいことは実現できると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/15 23:00

MYSQL のLIMIT 句を使って



select XXX from XXX_table LIMIT 先頭,20

として、

B.php に POST するときに、 先頭の位置を20 ずつ 増やしていけばよいのでは?

私は PostgreSQL で、LIMIT 句を使って質問のような内容を実現したことがありますので、あまり使い方に違いはないとは思います。

この回答への補足

すみません、回答ありがとうございます。
質問が途中で途切れていて、No.1さんの補足欄に追加させていただきました。

athanasiusさんのとおり、その方法はできるのですが、次のページ21件~40件目を表示させるときに、$ken,$ctvが初期化されてしまい、条件がうまく設定できません。よろしくお願いします(^^;;

補足日時:2005/02/15 17:41
    • good
    • 0

こんにちは。



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

補足日時:2005/02/15 17:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!