プロが教える店舗&オフィスのセキュリティ対策術

PHP+MySQLで分割ページを作っています。
検索結果のページを分割しているのですが、2ページ目以降に検索されたレコードが表示されません。

1).2ページ目以降に続きのレコード(下記では21件目以降)を表示させるには、どうすれば良いのでしょうか。

2).上記には関係ないのですが、「<?= $msg ?>」で検索結果の総数を表示したいのですが、「1」としか表示されません…ついでで良いので、ご指摘いただけたらと思います。


<?php
$keyword = $_POST['keyword']//検索ワードになります、下記の例では使用していません
?>

<?php
//データベース接続
$page = $_REQUEST['page'];
if ($page == '') {
$page = 1;
}
$page = max($page, 1);

// 最終ページを取得する
$sql = 'SELECT COUNT(*) AS cnt FROM table1';

$result = mysql_query($sql);
$rows = mysql_fetch_assoc($result);
$maxPage = ceil($rows['cnt'] / 20);
$page = min($page, $maxPage);

$start = ($page - 1) * 20;
$result = mysql_query('SELECT * FROM table1 LIMIT ' . $start . ',20');

$rowss = mysql_num_rows($sql);

//表示するデータを作成
if($rows){
while($row = mysql_fetch_array($result)) {
$tempHtml .= "<tr>";
$tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["mail"]."</td>";
$tempHtml .= "</tr>\n";
}
$msg = "".count($rowss)."";
}else{
$msg = "sorry";
}

//結果保持用メモリを開放する
mysql_free_result($result);

?>




//下記から、HTML部に表示しています

<?php
$start_a = ($start + 1);
print "".$start_a."件~";
$start_b = ($start + 20);
print "".$start_b."件を表示しています(".$page."ページ目/全".$maxPage."ページ)<br>";
if ($page > 1) {
print "<a href=\"page.php?page=".($page - 1)."\">前のページへ</a>  ";
} else {
print "前のページへ";
}
if ($page < $maxPage) {
print "<a href=\"page.php?page=".($page + 1)."\">次のページへ</a>  ";
} else {
print "次のページへ";
}
?>
<?= $msg ?>



何卒、よろしくお願い致します。

A 回答 (6件)

以前の質問の際に作成したサンプルです.


テーブルに id を追加しています。
<?php
// DB接続

//初期データ
$self= basename(__FILE__);
$dataRow= 3;
$currntPage= 1;
$dataHtml= '';
$pagerLink= '';
$message= "データがありません";

//パラメータを取得
$keyword= ( isset($_REQUEST['keyword']) ) ? $_REQUEST['keyword'] : '';
$startWith= isset($_REQUEST['s']) ? $_REQUEST['s'] +0 : 0;

//データ件数の取得
$sql = 'SELECT COUNT(id) FROM TABLE1';
if( strlen($keyword) > 0 )
$sql .= sprintf(" WHERE anime LIKE '%%%s%%'", mysql_real_escape_string($keyword ));
$dataNum = mysql_result(mysql_query($sql, $conn), 0) +0;

if( $dataNum > 0 ) {
//メッセージ変更
$message = sprintf('%d件のデータがあります', $dataNum);

//データ取得
$sql = 'SELECT * FROM TABLE1';
if( strlen($keyword) > 0 )
$sql .= sprintf(" WHERE anime LIKE '%%%s%%'", mysql_real_escape_string($keyword ));
$sql .= ' ORDER BY age, id ' .sprintf("LIMIT %d, %d", $startWith, $dataRow);

if($results = mysql_query($sql,$conn)) {
$dataHtml.= '<table>';
while($row = mysql_fetch_array($results))
$dataHtml.= sprintf('<tr><td>%d</td><td>%s</td><td>%s</td><td>%d</td></tr>'.PHP_EOL,
$row['id'], $row['name'], $row['anime'], $row['age']);
$dataHtml.= '</table>';
mysql_free_result($results);
}
else die("データの取得に失敗しました");

//ページャ作成
$pageNum = ( ( $dataNum % $dataRow ) > 0 ) ? intval($dataNum / $dataRow ) + 1: intval( $dataNum / $dataRow );
for($p=1; $p <= $pageNum; $p++) {
$nextWith = $dataRow * ($p -1);
if( $nextWith == $startWith ) {
$pagerLink .= sprintf('%d'.PHP_EOL, $p);
$currntPage= $p;
}
else
$pagerLink .= sprintf('<a href=%s?keyword=%s&s=%d>%d</a>'.PHP_EOL, $self, $keyword, $nextWith, $p);
}
$pagerLink .= sprintf('[%d/%dページ]', $currntPage, $pageNum );
}
mysql_close($conn);
?><html>
<body>
<form method="post">
<input type="text" name="keyword" value="<?php echo $keyword ?>"/>
<input type="hidden" name="s" value="0" />
<input type="submit" />
</form>
<?php
echo $message .PHP_EOL;
echo $dataHtml.PHP_EOL;
echo $pagerLink.PHP_EOL;
?>
</body>
</html>
    • good
    • 0
この回答へのお礼

前回に続き、お世話になっております・・・!!

初心者ながらもニュアンス(?)は少しずつ理解してきているのですが、やはり1つ1つの理解には至っておらず…
サンプルまで組んでいただいて、かなり勉強させていただいていますっ!!

ご回答ありがとうございます!!

お礼日時:2011/03/11 19:09

> ついでの質問で申し訳ないです。


>
> また別にはなるのですが、フリーワードとインプットやセレクトを一緒に使おうとすると、すべてパラメータで処理になるということで良いのでしょうか?
>(まだまだ先なのですが、テーブルの選択も考えておりまして)

質問の意図が読み取りづらいです。
HTML上で表現された項目は、GETかPOST(もしくは Cookie)になりますが、そういった事以外の何かを考えてらっしゃるのでしょうか?

入力された値を持ちまわり方ということでしたら

- 毎回パラメータで取得する
- パラメータをCookie に格納する
- 一度パラメータで取得しセッションに格納する

のような方式が考えられますが、いつから~いつまで持ちまわるのかライフサイクルを決めて、実装する必要があります。

テーブルの選択ということは、検索対象ごとにテーブルを持つ方法を検討されているのでしょうか?

例えば、カテゴリマスターテーブル(カテゴリID, カテゴリ名), とデーターテーブル(ID, カテゴリID, データ)のようなテーブル設計ですと、2つのテーブルで沢山のカテゴリ分類が可能になりますし、参照するテーブル名も一定しています。ちがうのは WHERE句のカテゴリIDだけですから、これだけパラメータで取得すれば良い事になります。

具体的な状況になってから別途質問を起こされたほうが、明確な回答が得られるかと思います。
    • good
    • 0
この回答へのお礼

ごめんなさい、いろいろ考えていたらぽろぽろと疑問が出てきておりました。
ページング(?)のない状態での検索はできたのですがページングがわからない状態だったので、今回質問させていただいたので・・・すみません、よくばり過ぎてました・・・。
この先はまたやりたいことを明確にして、わからないことがあれば質問させていただきたいと思いますっ!!

ありがとうございました!!

お礼日時:2011/03/13 20:50

SELECT COUNT(id) FROM TABLE1



このクエリーが流れますか?
確認してみてください。(FALSEになっている気がします)

環境によって、テーブル名など大文字小文字を判別する場合、しない場合があるので注意する必要があります。

この回答への補足

ついでの質問で申し訳ないです。

また別にはなるのですが、フリーワードとインプットやセレクトを一緒に使おうとすると、すべてパラメータで処理になるということで良いのでしょうか?
(まだまだ先なのですが、テーブルの選択も考えておりまして)

補足日時:2011/03/13 13:10
    • good
    • 0
この回答へのお礼

すみません、原因わかりました!!

$conn(←変数…であってるのでしょうか)の設定をしてなかったようです!!
凡ミスです、すみません。

本当にご丁寧な回答いただいて、かなり勉強させていただきました!!
ありがとうございました!!

お礼日時:2011/03/12 19:41

うぅっ。


読み返すと、変なトコがボロボロと。

- form タグに action が指定されていないので、ページングしてから再検索したときURLが変だ。

- if($results = mysql_query($sql,$conn)) の if ブロック
$results = @mysql_query($sql,$conn) or die("データの取得に失敗しました");
と書きたかったんだと思われます。

あんまりイケてないですね。

この回答への補足

-formタグに・・・

<form method="post" action="sample.php">としました

- if($results¥・・・

if($results = mysql_query($sql,$conn)) {
$dataHtml.= '<table>';
while($row = mysql_fetch_array($results))
$dataHtml.= sprintf('<tr><td>%d</td><td>%s</td><td>%s</td><td>%d</td></tr>'.PHP_EOL,
$row['id'], $row['name'], $row['anime'], $row['age']);
$dataHtml.= '</table>';
mysql_free_result($results);
}else{
print "データの取得に失敗しました";
}


としてみたのですが・・・良かったのでしょうか・・・?

今ページの方で、「データがありません」と表示される状態です。

度々申し訳ないのですが、ご指摘いただけたらと思います。

補足日時:2011/03/11 19:55
    • good
    • 0
この回答へのお礼

ありがとうございました!!

お礼日時:2011/03/14 10:29

↓の回答ですが、ページ番号ではなく、offset 値を直接渡しています。


#後なんか bug があった気がするんですが、ちょっと思い出せません。

適当なファイル名(pagingSample.phpとか) に保存してアクセスしてください。

テーブルは以下のようにしたらしいです。

CREATE TABLE TABLE1 (
id int AUTO_INCREMENT PRIMARY KEY,
name varchar(256) NOT NULL,
anime varchar(256) NOT NULL,
age int ) ENGINE=InnoDB CHARSET=utf8;

以前の質問に id を追加しただけだと思います。

ノリで30分ぐらいで書いたソースなので、もう少し効率的に書けそうですが、参考にしてみてください。

この回答への補足

さらについでで申し訳ないのですが・・・

この場合の
$self= basename(__FILE__);

「__FILE__」には作ったPHPのファイル名を置き換えるということで良いのでしょうか?

補足日時:2011/03/11 21:02
    • good
    • 0
この回答へのお礼

ありがとうございました!!

お礼日時:2011/03/13 13:02

$_POSTはPOSTで送信した値しか入りません。


検索条件をページネーションに組み込んでGETで遷移させたり
セッション変数に格納しておくなどの対応が必要です。

mysql_num_rowsは数値を返すので
さらにcount( )する必要はありません。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます!!

>>セッション変数
勉強します!!

お礼日時:2011/03/11 19:04

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