質問失礼します。
ただいま練習でローカル環境でPHPとMysqlの勉強をしています。
以前はデータベースに登録している全てのレコードをページネーションを付けて表示する方法が分からず
こちらで質問させていただき無事解決できました。
下記がその質問です。
https://teratail.com/questions/140851
今回はここから派生?して
ある列の値が指定した値だけのデータをページネーションをつけて表示したいのですがうまくいきません。
下記はソースコードになります。
カテゴリーを選択
<form id="selectcate" name="selectcate" method="post" action="menu-category.php"> <dl> <dt> <label for="kind">種類</label> </dt> <dd> <select name="kind"> <option value="魚">魚</option> <option value="肉">肉</option> <option value="野菜">野菜</option> <option value="ドリンク">ドリンク</option> </select> </dd> </dl> <input type="submit" value="検索"> </form>
初めに作った表示画面
<?php require('dbconnect.php'); if (isset($_REQUEST['page'])) { $page = $_REQUEST['page']; } else { $page = 1; } $page = max($page, 1); $category = $_REQUEST['kind']; //最終ページを取得 $cnt = $mysqli->query('SELECT COUNT(kind = "$category") AS cnt FROM menu'); $table = mysqli_fetch_assoc($cnt); $maxPage = ceil($table['cnt'] / 5); $page = min($page, $maxPage); $start = ($page - 1) * 5; ?> <div id="menu_list"> <table class="menu_list"> <tr> <th>商品管理ID</ht> <th>カテゴリー</ht> <th class="menu_name">商品名</ht> <th>価格</ht> <th class="menu_remarks">備考</ht> </tr> <?php echo($category); $recodeSet = $mysqli->query("SELECT * FROM menu WHERE kind = '".$category."' ORDER BY id LIMIT $start, 5"); while($table = mysqli_fetch_assoc($recodeSet)){ ?> <tr> <td class="menu_content"><?php echo(htmlspecialchars($table['id'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['kind'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['name'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['price'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['remarks'])); ?></td> </tr> <?php } ?> </table> <ul class="paging"> <?php if($page > 1){ ?> <li><a href="menu-category.php?page=<?php print($page - 1); ?>" onclick="document.form1.submit();return false;">前のページ</a></li> <form name="form1" method="POST" action="menu-category.php?page=<?php print($page - 1); ?>"> <input type=hidden name="kind" value="<?php echo($category);?>"> <?php } else { ?> <?php } ?> <?php if($page < $maxPage){ ?> <li><a href="menu-category.php?page=<?php print($page + 1); ?>" onclick="document.form2.submit();return false;">次のページ</a></li> <form name="form2" method="POST" action="menu-category.php?page=<?php print($page + 1); ?>"> <input type=hidden name="kind" value="<?php echo($category);?>"> <?php } else { ?> <?php } ?> </ul> </div>
これだと最大ページが5まであることになり本来は魚を選んだ場合はカウントの結果が7つなので2ページ目が最終ページなります。
しかしsqlでカウントしてかつ、特定の列の値の指定が足りないと気付き(思い)
sql文にWHERE = kind "$category"を足した。
ちなみにですがMySqlで
SELECT COUNT(kind = '魚') AS cnt FROM menu WHERE kind = '魚';
の文で希望通りの結果(7)が表示されました。
それを踏まえ新しく作ったコードが次のコードです。
修正版
<?php require('dbconnect.php'); if (isset($_REQUEST['page'])) { $page = $_REQUEST['page']; } else { $page = 1; } $page = max($page, 1); $category = $_REQUEST['kind']; //最終ページを取得 $cntsql = 'SELECT COUNT(kind = '."$category".') AS cnt FROM menu WHERE kind = '."$category".' '; var_dump($cntsql); // ここで値を確認していますが望み通りのSQLができているはずです。 $cnt = $mysqli->query($cntsql); $table = mysqli_fetch_assoc($cnt); $maxPage = ceil($table['cnt'] / 5); $page = min($page, $maxPage); $start = ($page - 1) * 5; ?> <div id="menu_list"> <table class="menu_list"> <tr> <th>商品管理ID</ht> <th>カテゴリー</ht> <th class="menu_name">商品名</ht> <th>価格</ht> <th class="menu_remarks">備考</ht> </tr> <?php echo "$category</br>"; $statement = 'SELECT * FROM menu WHERE kind = '."$category".' ORDER BY id LIMIT '.$start.', 5'; var_dump($statement); // ここで$startが0のはずが-5になります。ということは最終ページの取得がうまくいっていない。。 $recodeSet = $mysqli->query($statement); while($table = mysqli_fetch_assoc($recodeSet)){ ?> <tr> <td class="menu_content"><?php echo(htmlspecialchars($table['id'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['kind'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['name'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['price'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['remarks'])); ?></td> </tr> <?php } ?> </table> <ul class="paging"> <?php if($page > 1){ ?> <li><a href="menu-category.php?page=<?php print($page - 1); ?>" onclick="document.form1.submit();return false;">前のページ</a></li> <form name="form1" method="POST" action="menu-category.php?page=<?php print($page - 1); ?>"> <input type=hidden name="kind" value="<?php echo($category);?>"> <?php } else { ?> <?php } ?> <?php if($page < $maxPage){ ?> <li><a href="menu-category.php?page=<?php print($page + 1); ?>" onclick="document.form2.submit();return false;">次のページ</a></li> <form name="form2" method="POST" action="menu-category.php?page=<?php print($page + 1); ?>"> <input type=hidden name="kind" value="<?php echo($category);?>"> <?php } else { ?> <?php } ?> </ul> </div>
$startが-5のせいで何も表示されなくなりました。
表示されるエラーは2つあり2とも
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in
該当のコードの場所は
$table = mysqli_fetch_assoc($cnt);
while($table = mysqli_fetch_assoc($recodeSet)){
になります。
解決方法が見出せないのでご教授いただける方がいましたらどうかよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー