前提・実現したいこと
mysqlからpostgresqlに変更した際に出力が変わってしまいました。
・予約件数の表示がshop_idと結びついていなく、reserveレコードに入っている全件をカウントしてしまう。
・予約情報が表示されない($arr_reserveが空になっている)
reserveレコードに入っている予約ID(reserve_shop_id)とログイン時にsessionに入ったログインID(shop_id)で一致した情報を取り出して、ページング機能を使いreserveテーブルにデータが入ったのが遅い順(reserve_time)で表示させたいです。
MYSQLではSQL_CALC_FOUND_ROWSを使っていましたがPostgresqlでは使えないようなので同じように動かしたいです。
調べましたが解決策がわかりませんでした。
どう直すのか教えて頂けると助かります。
該当のソースコード
変更前のMYSQL //予約情報の取り出し SELECT SQL_CALC_FOUND_ROWS * FROM reserve WHERE reserve_shop_id=:shop_id ORDER BY reserve_time DESC limit :limit offset :offset; // 予約Total件数 SELECT FOUND_ROWS() as total;
変更後のPostgresql //予約情報の取り出し SELECT * FROM reserve WHERE reserve_shop_id=:shop_id ORDER BY reserve_time DESC limit :limit offset :offset; // 予約Total件数 SELECT COUNT(*) as total;
全体 <?php error_reporting(E_ALL); ini_set("display_errors",1); session_start(); try { //接続済み $pdo = new PDO(DSN,DB_USER,DB_PASS); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); // ①ユーザーIDからユーザー名を取り出す $query = "SELECT * FROM shop WHERE shop_id=:shop_id"; $shop_stmt = $pdo->prepare($query); $shop_stmt->bindValue(':shop_id', $_SESSION['user'], PDO::PARAM_INT); $shop_stmt->execute(); // ショップ情報の取り出し $row = $shop_stmt->fetch(PDO::FETCH_ASSOC); $shop_id = $row['shop_id']; $shop_name = $row['shop_name']; $yesno = $row['yesno']; $shop_comment = $row['shop_comment']; $shop_email = $row['shop_email']; // 予約情報の取り出し $sql = $pdo->prepare('select * from reserve where reserve_shop_id=:shop_id order by reserve_time desc limit :limit offset :offset'); $sql->bindValue(':shop_id', $_SESSION["user"], PDO::PARAM_INT); $sql->bindValue(":offset", $offset, PDO::PARAM_INT); $sql->bindValue(":limit", PAGE_LIMIT, PDO::PARAM_INT); $sql->execute(); $arr_reserve = []; while ($result = $sql->fetchAll(PDO::FETCH_ASSOC)){ $arr_reserve[] = [ 'reserve_shop_id' => $result['reserve_shop_id'], 'reserve_comment' => $result['reserve_comment'], 'reserve_time' => $result['reserve_time'], ]; } // 予約Total件数 $totalRow = $pdo->prepare("SELECT COUNT(*) as total from reserve"); $all = $totalRow->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { var_dump($e); die(); } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8"> <title>トップ</title> </head> <body> <main> <p class="alert alert-success" style="text-align:center;">予約数<?=htmlspecialchars($all['total']),ENT_QUOTES,'utf-8'); ?>件</p> <table class="table table-striped"> <thead> <tr> <th>コメント</th> <th>予約時間</th> </tr> </thead> <tbody> <?php foreach($arr_reserve as $key => $value): ?> <tr> <td><?= htmlspecialchars($value['reserve_comment'], ENT_QUOTES, 'UTF-8'); ?></td> <td><?= htmlspecialchars($value['reserve_time'], ENT_QUOTES, 'UTF-8'); ?></td> <tr> <?php endforeach; ?> </tbody> </table> </main> </div> </body> </html>
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。


回答2件