みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

phpphp,mysqlページングについて

1つのphpファイルで作成を考えています。検索後(if($subsub){}を消せば)でなければページング機能は、可能です。1ページ目は、正常に表示しますが、2ページ目以降表示できません。データ保持ができません。同じ類の質問は、たくさん出てると思いますが・・・初心者ということもあり、ロジックがまだわかっていないのでできれば記述で教えていただければ幸いです。よろしくお願いします。
検索項目は、1項目で省略していますが、本来4~5項目で考えています。

<?php
// データベースに接続する
省略
$test = $_POST[test];

echo'
<form method="POST" action="".$_SERVER["PHP_SELF"]."">
<tr>
<input type="text" name="test">
<td><input type="submit" value="検索" name="subsub"></td>
</form>
';
//検索ボタンを押したら表示
if((isset($_POST['subsub']))or(isset($_GET['p'] ))){
//ページング処理
//総レコード数を取得する
//条件がある場合は、where 条件式を書く
$sql = "SELECT COUNT(*) AS reccnt FROM faq;";
$res = mysql_query($sql, $conn) or die ("データ抽出エラー");
$row = mysql_fetch_array($res, MYSQL_ASSOC);
$reccnt = $row["reccnt"];

//取り出す最大レコード数
$lim = 3;

//最初と最後のページ番号を定義
$first = 1;
$last = ceil($reccnt / $lim);

//表示するページ位置を取得
$p = intval($_GET['p']);
if ($p < $first) {
$p = $first;
}
elseif ($p > $last) {
$p = $last;
}

//表示するレコード位置を取得
$st = ($p - 1) * $lim;

//前後のページ移動数と表示数
$page = 3;

//前後$pageページ移動した際のページ番号を取得
$prev = $p - $page;
$next = $p + $page;

//前後1ページ移動した際のページ番号を取得
$prev1 = $p - 1;
$next1 = $p + 1;

//SELECTコマンドを実行して、$stレコード目から$lim件の各データを取得し、大きい順に並べる
$sql = "SELECT test FROM testtest WHERE test like '$test' ORDER BY id DESC LIMIT $st, $lim;";
$res = mysql_query($sql, $conn) or die ("データ抽出エラー");
echo'
<table border="1">
<tr>
<td>ID</td>
<td>テスト</td>
</tr>
';

//取得したデータを一件ずつ表示
while($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
echo'
<tr>
<td>'.$row["id"].'</td>
<td>'.$row["test"].'</td>
</tr>
';
}
echo '</table>';


//ページ移動リンクの組み立て

//1ページ前のページ
if ($p > 1) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$prev1\"><</a></font>&nbsp";
}

//各ページ番号への移動リンクを表示
for ($cnt = $p - $page; $cnt <= $last; $cnt++) {
if ($cnt < 1) {
$cnt = 1;
}
$pageno = "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$cnt\">$cnt</a></font>&nbsp";

//表示番号を指定数に区切る
//ページ番号と現在のページが同一の場合は
//リンク無しにする
if ($cnt <= $p + $page) {
if ($cnt == $p) {
$pageno = "<font size=\"1\">$p</font>&nbsp";
}
echo $pageno;
}
}

//1ページ後のページ
if (($next1 - 1) * $lim < $reccnt) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$next1\">></a></font>&nbsp";
}

echo "<br>\n";

//最初のページへ移動
if ($p > 1) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$first\">最初</a></font>&nbsp";
}

//前の$pageページへ移動
if ($p > $page) {
// << を $page"."ページ戻る にする事もできる
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$prev\"><<</a></font>&nbsp";
}

//次の$pageページへ移動
if (($next - 1) * $lim < $reccnt) {
// >> を $page"."ページ進む にする事もできる
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$next\">>></a></font>&nbsp";
}

//最後のページへ移動
if ($p < $last) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$last\">最後</a></font>&nbsp";
}
}
?>

投稿日時 - 2013-06-09 02:26:21

QNo.8125690

困ってます

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

>データ保持ができません。

$_POST['test']の値をanchor要素(のhref属性)に引き渡していませんからね。

こちら ↓ をどうぞ(多分同じ方ですよね)。

http://www.phppro.jp/qa/4056

投稿日時 - 2013-06-09 15:44:28

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

丸投げにも程があるという長いソースだったので、流し読みしかしてません。

あとで誰かがちゃんと書いてくれると思うので、本題とは関係ないことをツッコませてもらいます。

古い書籍などでよくあるので、こうをやってしまう人は多いのですが、$_SERVER["PHP_SELF"]は ぜーじゃくーせー があるので、$_SERVER["SCRIPT_NAME"]に変えるか、ファイルネーム決め打ちしてください。
あと毎回、↑これ書くんじゃなくて $fn = $_SERVER["SCRIPT_NAME"]; とか変数に入れたほうが見やすいと思いますよ。

てきとーにちゃんと説明すると、PHP_SELFだと ファイル名以降も取ってきてしまうので、よろしくないのです。

本当の具体例は避けますが、hoge.php?str=testとかだとすると、?マーク以降の「?str=test」の部分も取ってきてしまい、なんやかんやするとやばいことができるのです。

本当の具体例を避けてしまってるので、伝わりにくいことになってますが、「$_SERVER["PHP_SELF"] 脆弱性」でググれば出てきます。

投稿日時 - 2013-06-09 04:49:50

お礼

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

投稿日時 - 2013-06-10 22:42:47

あなたにオススメの質問