【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

現在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>

A 回答 (3件)

ちょっとどこで使用したいのかわからないのですが・・・


======= 選択をするphp =======
----- プルダウンA -----
東京都
神奈川県
埼玉県
以下各都道府県名表示

・Aから東京都を選択

ここで
【東京23区の数】件のデータ中 1件~10件 を表示しています
を表示する

----- プルダウンB -----
東京都足立区
東京都北区
東京都葛飾区
東京都荒川区
以下10件まで表示

Bから選択された値をtokyo.phpへPOST
=============================

======= tokyo.php =======
23区情報を受け取って表示
=========================


上記のように「~から~を表示しています」処理はプルダウンBに対してだけ行うということでいいのでしょうか?

Bに対してだけなのであれば
>2 件のデータ中 1件~2件の用に表示はされるのですが
これが表示できていれば
>【条件に一致したデータはありません】となります。
このようにelse側が選択されることはないはずなのですが。

それとも、
tokyo.phpへ23区をPOSTしたあとにtokyo.phpの中で足立区なら足立区の詳細を出力する際に「~から~を表示しています」を使用したいのでしょうか?
SQL自体はおかしくないとは思うのですが、いずれにしても、
各変数をechoで画面にこまめに出力しながらデバッグしていく癖をつけたほうがいいかと思います。
SQLにおいても同様です。
mysql_queryする前にechoしてみて変数に正しい値がきちんと入っていて、自分が投げたいSQL文として成り立っているかなどを確認することが大事だと思います。
    • good
    • 0
この回答へのお礼

ご教授していただきましたおかげで無事にこちらの仕様に合わせた感じに仕上げることが出来ました!本当に色々とありがとうございます。
スクリプトなどを拝見していたのですが、書き方など大変勉強になりました。
自分も早くあのようにかけるようになりたいと意欲が沸きました。
まだ全体の中からみますと作り途中なのですが、また機会がありましたら
是非宜しくお願いいたします。
どうもありがとうございました!

お礼日時:2007/05/02 16:27

自分のサイトで使用しているロジックです。


内容をかなりはぶいたり、出力部分をechoに変えたりしたのでそのまま動くかはわかりませんが、流れはつかんでもらえるかと思います。
※自己流なので、このやり方がベストかどうかはわかりかねます。。

<?php
//offsetが空又は不正な文字列なら初期化
if(isset($_GET['offset'])){
$offset = $_GET['offset'];
$offset = (!$offset or !is_numeric($offset) or $offset<0)?0:(int)$offset;
}
else{
$offset = 0;
}
//1ページに表示する件数
$page1 = 10;

/* DB接続・選択処理を書いてください */


//SQL処理
$sql_nolimit = "select colname from hogetbl where hoge = 'hogehoge' order by colname;";
$sql_limit = "select colname from hogetbl where hoge = 'hogehoge' order by colname limit ".$offset.",".$page1.";";
$rs_nolimit = mysql_query($sql_nolimit) or die("quary faild sql_nolimit");
$rs_limit = mysql_query($sql_limit) or die("quary faild sql_limit");
$maxrows_nolimit = mysql_num_rows($rs_nolimit);
$maxrows_limit = mysql_num_rows($rs_limit);

//総ページ数
$pagesuu = ceil($maxrows_nolimit / $page1);

//「~から~を表示しています」の先頭と末尾の数字
$startno = $offset + 1;
if(($offset+$page1) < $maxrows_nolimit){
$endno = $offset + $page1;
}
else{
$endno = $maxrows_nolimit;
}

//検索結果が0件なら
if($maxrows_nolimit == 0){
echo '条件に一致したデータはありません<br>';
}
//1件以上あれば
else{
echo $maxrows_nolimit.' 件のデータ中 '.$startno.'件~'.$endno.'件 を表示しています<br>';
}

//リンクと「前へ」「次へ」を生成
//最後のページ
if(($offset > 0) and ($maxrows_nolimit <= ($offset + $page1))){
$previous = "thisfile.php?offset=" . ($offset - $page1) . "&page1=" . $page1;
echo '<a href="'.$previous.'"> 前へ </a><br>';
}
//最初のページ
elseif(($offset <= 0) and ($maxrows_nolimit > ($offset + $page1))){
$next = "thisfile.php?offset=" . ($offset + $page1) . "&page1=" . $page1;
echo '<a href="'.$next.'"> 次へ </a><br>';
}
//最初<ページ<最後
elseif(($offset > 0) and ($maxrows_nolimit > ($offset + $page1))){
$previous = "thisfile.php?offset=" . ($offset - $page1) . "&page1=" . $page1;
$next = "thisfile.php?offset=" . ($offset + $page1) . "&page1=" . $page1;
echo '<a href="'.$previous.'"> 前へ </a> <a href="'.$next.'"> 次へ </a><br>';
}

//データ表示
while($rec = mysql_fetch_array($rs_limit)){
echo $rec['colname']."<br>";
}
?>

この回答への補足

さっそくこちらで色々と試してみたのですが、
2 件のデータ中 1件~2件の用に表示はされるのですが
住所の例えば一つ目のプルダウンメニューで【東京都】なら東京都の一覧が表示され、
その中から「更に詳しく」というプルダウンがあり、23区情報を出力して10件毎表示をしたいと考えているのです検索してもデータがあるにも
【条件に一致したデータはありません】となります。
きっと私の$sql文が間違っていると思うのですが
そこで一つお伺いしたいのですが私が変更したのは
$sql_nolimit = "select add1 from woo where add1 = '$fld' order by add1;";
$sql_limit = "select add1 from woo where add1 = '$fld' order by add1 limit ".$offset.",".$page1.";";
$fld に add1がはいっており、こちらのadd1を出力し、その検索結果を毎回10件表示にしたいのですが、$sql文はあっていると思いますか?

補足日時:2007/04/30 09:55
    • good
    • 0
この回答へのお礼

gogo_tea様
またご回答して頂きどうもありがとうございます。
以前ご回答して頂きました時もgogo_tea様のおかげで無事に解決でき
勉強にもなりました。
今回につきましてもさっそく試させて頂きます!

お礼日時:2007/04/29 11:10

PEAR::Pagerを使うと、ご希望がある程度かなうのではないかと思います。


ご希望と厳密に一致するかどうかはわかりません。
    • good
    • 0

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