- ベストアンサー
ページ番号別にLIMIT定義を変えるには。たすけて
- ページ番号別にLIMIT定義を変える方法について教えてください。
- 質問文章では、ページIDに基づいてLIMIT句を使用して10件ずつデータを取得したいと考えていますが、どのように記述すれば良いですか?
- 現在、「SELECT * FROM lab WHERE LIMIT $pid*10,10」と記述していますが、エラーが発生しています。エラーの原因と正しい記述方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
二番目<?php ?>の中で、どのような判定処理がなされているか処理を追うことは出来ていますか? 二番目<?php ?>の中で、$countReの値が10として処理されているため、 $maxPage=ceil($countRe/10); └ここで10/10=1、で $maxPageの値は1になり、 if($maxPage==1 or $maxPage<$pid) return false; └このIF文でtrue判定されてしまい、returnしているからリンクが表示されないのです。 No.3で書いたように、別途総件数把握クエリを発行するなどして、 総件数の値を$countReに定義する必要があります。 …この説明の意味がわかりますか? この説明で解決方法がわからないのであれば、 あなたはまだそのアプリを編集するべきではありません(最低限必要な基礎知識が足りていません)。 今回の回答でこの質問への回答は最後とさせていただきます。 今後の作業方針としては 「ここをイジったら挙動が変わりそう」という形で改変するのではなく、 すべての行に対し、まずはそれぞれの行がどのようなことをしているのかを把握し、 その上で「どこをイジったら挙動が変わるかを考えて、前後関係が保たれるように編集」してください。 中途半端な状態で投げ出しておくのもあれなので、 最後に、動作保障は出来ませんがリンクが表示されそうなソースを書き残しておきます。 ----- <?php ーDB接続文ー $search_query = "select SQL_CALC_FOUND_ROWS * from ilab"; $usersearch= $_POST['usersearch']; $clean_search = str_replace('、', ' ',$clean_search); $clean_search = str_replace(' ', ' ',$usersearch); $search_words = explode(' ', $clean_search); $final_search_words = array(); if (count($search_words) > 0) { foreach ($search_words as $word) { if (!empty($word)) { $final_search_words[] = $word; } } } // Generate a WHERE clause using all of the search keywords $where_list = array(); if (count($final_search_words) > 0) { foreach($final_search_words as $word) { $where_list[] = "syou LIKE '%$word%'"; } } $where_clause = implode(' AND ', $where_list); // Add the keyword WHERE clause to the search query if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } $pid = intval($_GET['pid']); if ($pid < 1) $pid = 1; $limit_start_rows = ( $pid - 1 ) * 10; $search_query .= " LIMIT {$limit_start_rows}, 10"; $result = mysql_query($search_query); $num_rows_result = mysql_query("SELECT FOUND_ROWS()"); $num_rows = mysql_fetch_assoc($num_rows_result); $num_rows = $num_rows['FOUND_ROWS()']; if($num_rows== 0){ $message="該当データは見つかりませんでした。"; } else $message=$num_rows ."件該当しました<br/>"; echo $message; while($row = mysql_fetch_array($result)){ echo '<strong><img src="byou.gif" width="50" height="25" /> </strong><a href="a.php?id=' . $row['id'] . '">' . $row['byou'] . '</a><br/>'; echo '<strong><img src="syou.gif" width="50" height="25" alt="家庭の医学" /> </strong>' . $row['syou'] . '<br/>'; echo '<img src="sen.gif" width="240" height="3" alt="家庭の医学" /><br/>'; } ?> <?php $pid = $_GET['pid']; $countRe=$num_rows; pager($_GET["pid"],$countRe); function pager($pid,$countRe){ if($pid=="") $pid=1; $maxPage=ceil($countRe/10); if($maxPage==1 or $maxPage<$pid) return false; if($pid>10){ $startPage=$pid-9; $startMore="<a href=\"$PHP_SELF?pid=".($startPage -1)."\">< PREV</a>"; }else{ $startPage=1; } if($pid+10<$maxPage){ $endPage=$pid+10; $endMore=" <a href=\"$PHP_SELF?pid=".($endPage+1)."\">NEXT ></a>"; }else{ $endPage=$maxPage; } $page_footer=""; for($i=$startPage;$i<=$endPage;$i++){ $page_footer.=" ".(($pid==$i)?"<span style='font-Size:120%'>$i</span>":"<a href=\"$PHP_SELF?pid=$i\">$i</a>"); } $page_footer=$startMore.$page_footer.$endMore; print $page_footer."<br>"; } ?>
その他の回答 (4)
- hamachi98
- ベストアンサー率100% (5/5)
>二つ目のPHPのセレクト部分を削除し、1つ目にハマチさんの書かれたソースを記述すれば良いという解釈でよいでしょうか? 「~を削除し、~したら出来ました」 「~を削除し、~したのですが出来ませんでした」 という形で補足していただかないと、 上記の質問では「はい。それで良いです。」だけの返答しかしようがありません。 チャットでマンツーマンでやり取りをしている訳ではないので、 もう少し質問や補足の仕方を熟慮された方が良いと思います。 補足への回答ですが、先に書いたとおりその解釈で良いです。 $limit_start_rows = ( $pid - 1 ) * 10; $query = "select * from lab LIMIT {$limit_start_rows}, 10"; を削除し、1つ目を前述のように変更してください。
補足
こんにちは。ハマチさんの指示通りすると、1ページ目は10件表示されましたが、[1.2.3]といったリンクが消えてしまいました。つまりリンクが全く無い状態です。どうしたら良いでしょうか?二番目<?php ?> の情報を一番目の<?php ?>入れたらよいのでしょうか?よろしくお願いいたします。
- hamachi98
- ベストアンサー率100% (5/5)
厳しい言い方になりますが、 ・どの行でMySQLクエリが発行されているかわかりますか? ・LIMIT句はどういった結果をもたらすことを期待して使用するかわかりますか? 当初の質問にない部分まで持ち出され、それに回答する、というのを続けるのでは、 結局はそのアプリが完成するまで他人がソースを書き続けるハメになると思います。 (だから新たに新規で質問を起こせば良い、ということではなく) 「それは計算ドリルの答えを見ながら理解する」のではなくて、 「母親に自分の代わりに計算ドリルをやってもらっているだけ」です。 わからないから聞いている、という理屈はわかりますが、 理解できている部分が少なすぎる状態では、教えようもありません。 …とはいえ、なんらかの事情があって、 スキルも知識もないけどシステムに手を入れなければ状態なのかも知れないので、 これが最後ということで、もう少しだけお付き合いさせていただきます。 --- >まず上のPHPで全件取得し、下のPHPでLIMITでページングしていくように考えています。 >~略 >1ページ目も2ページ目も全件11件表示されてしまっています。 ご自身で仰られているように、データを全件取得しているのですから、 そのまま出力したのでは当然全件表示されてしまいます。 そしてSQLクエリを変数に代入するだけでは当然処理結果になんら影響を与えません。 LIMIT句を if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } のif文の直後に以下のように追加してください。 $pid = intval($_GET['pid']); if ($pid < 1) $pid = 1; $limit_start_rows = ( $pid - 1 ) * 10; $search_query .= " LIMIT {$limit_start_rows}, 10"; こうすることで、ページIDに呼応して必要な範囲のデータが抽出できるようになるかと思います。 ただし、このままでは $num_rows ."件該当しました<br/>"; の部分がどんな状況でも最大で「10件該当しました」にしかなりません。 別途総件数把握クエリを発行するか、 SQL_CALC_FOUND_ROWS&FOUND_ROWS()というSQL用関数を使う必要があります。 (が、それらまで踏み込むと止め処なくなるので割愛させていただきます。) また、最初のクエリではテーブル名が「ilab」で後半では「lab」と、 テーブル名に差異がありますがその点は大丈夫ですか?
補足
ありがとうございます。二つ目のPHPのセレクト部分を削除し、1つ目にハマチさんの書かれたソースを記述すれば良いという解釈でよいでしょうか?
理解できないのならともかく、理解する気のない奴には一生無理だっていろんな人が何度もアドバイスしたよね? なんでそれすら理解できないの? 今まで何度も名前を変えて何十件と同じようなことを繰り返しやってるよね?どうしてそこまで進歩ができないか自分で考えたことある?それは君の頭が向いてないから。 ・理屈で考えることができない ・人の話を聞けない ・言われたことを理解する知能が無い こんな君には無理だといつになったら分かるのかな? いいかげんマニュアルを自分で検索するくらいはしたらどうなのかな?それすらしないで他人に頼るのは、「やりかた」とか関係なくただの無能の証明でしかないよ。 >hamachi98さん この子は何をどう説明されてもかけらほども理解できず同じような投稿を繰り返すかわいそうな子です。 あなたの時間を無駄にしないためにも、今後は構わないことをおすすめします。
- hamachi98
- ベストアンサー率100% (5/5)
エラーになったのは、whereの後に条件式がないため(=SQL構文エラー)だと思います。 「LIMIT n, m」のnの部分は ( $pid - 1 ) * 10 で導き出せます。 ですので $limit_start_rows = ( $pid - 1 ) * 10; $query = "select * from lab LIMIT {$limit_start_rows}, 10"; のようにすると良いと思います。 また、セキュリティ対策を兼ねて、$pidの値が整数であることを確保するために $pid = intval($_GET['pid']); としておくと良いと思います。 (数値以外の値が入ってきた場合には0になりますので、 if($pid=="") $pid=1; の部分で1に矯正されます)
補足
hamachi様、丁寧な回答ありがとう御座います。荒らしに変な風評を流され、なかなか回答が貰えず困っていたところです。 <?php ーDB接続文ー $search_query = "select * from ilab"; $usersearch= $_POST['usersearch']; $clean_search = str_replace('、', ' ',$clean_search); $clean_search = str_replace(' ', ' ',$usersearch); $search_words = explode(' ', $clean_search); $final_search_words = array(); if (count($search_words) > 0) { foreach ($search_words as $word) { if (!empty($word)) { $final_search_words[] = $word; } } } // Generate a WHERE clause using all of the search keywords $where_list = array(); if (count($final_search_words) > 0) { foreach($final_search_words as $word) { $where_list[] = "syou LIKE '%$word%'"; } } $where_clause = implode(' AND ', $where_list); // Add the keyword WHERE clause to the search query if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } $result = mysql_query($search_query); $num_rows=mysql_num_rows($result); if($num_rows== 0){ $message="該当データは見つかりませんでした。"; } else $message=$num_rows ."件該当しました<br/>"; echo $message; while($row = mysql_fetch_array($result)){ echo '<strong><img src="byou.gif" width="50" height="25" /> </strong><a href="a.php?id=' . $row['id'] . '">' . $row['byou'] . '</a><br/>'; echo '<strong><img src="syou.gif" width="50" height="25" alt="家庭の医学" /> </strong>' . $row['syou'] . '<br/>'; echo '<img src="sen.gif" width="240" height="3" alt="家庭の医学" /><br/>'; } ?> <?php $pid = $_GET['pid']; $countRe=$num_rows; pager($_GET["pid"],$countRe); function pager($pid,$countRe){ if($pid=="") $pid=1; $maxPage=ceil($countRe/10); if($maxPage==1 or $maxPage<$pid) return false; if($pid>10){ $startPage=$pid-9; $startMore="<a href=\"$PHP_SELF?pid=".($startPage -1)."\">< PREV</a>"; }else{ $startPage=1; } if($pid+10<$maxPage){ $endPage=$pid+10; $endMore=" <a href=\"$PHP_SELF?pid=".($endPage+1)."\">NEXT ></a>"; }else{ $endPage=$maxPage; } $page_footer=""; for($i=$startPage;$i<=$endPage;$i++){ $page_footer.=" ".(($pid==$i)?"<span style='font-Size:120%'>$i</span>":"<a href=\"$PHP_SELF?pid=$i\">$i</a>"); } $page_footer=$startMore.$page_footer.$endMore; print $page_footer."<br>"; } $limit_start_rows = ( $pid - 1 ) * 10; $query = "select * from lab LIMIT {$limit_start_rows}, 10"; ?> と、しています。まず上のPHPで全件取得し、下のPHPでLIMITでページングしていくように考えています。現在のソースでは下のLIMITが効かず、上の$sqlが効いてしまっており、1ページ目も2ページ目も全件11件表示されてしまっています。どうすれば、下のPHPの$limit_start_rows = ( $pid - 1 ) * 10; $query = "select * from lab LIMIT {$limit_start_rows}, 10"; この部分を有効に出来るか宜しければ御教授いただきたいです。よろしくお願いいたします。
お礼
ハマチさんのお陰で出来ました!!!明日から仕事があるので、なんとしても10月中にと考えていたので大変助かりました!!まるで神様です。これを機により専門的に自ら学んでいくよう努力します。大変助かりました!!ありがとうございました!!