前提
投稿を出力する画面を作っています。
最新の投稿から15件を最初のページ出力するためにMAX(id)をSELECTしています。
実現したいこと
最終目標:MAX(id)から降順に15件のデータを出力させたいです。
今回の質問:MAX(id)を取得してそれを$SESSIONに代入したいのですが、次のようなエラーでできません。$resultの中身が違うのですが、調べてみても同じようなことをやっている人を見つけられず、なんと書けば良いのか分かりません。
発生している問題・エラーメッセージ
Warning: Undefined array key "id" in ------- on line 39 Fatal error: Uncaught Error: Call to a member function bindValue() on null in -------:82 Stack trace: #0 {main} thrown in --------- on line 82
該当のソースコード
php
1<?php 2$db = new PDO('mysql:host=--------'); 3$count_sql= "SELECT COUNT(*) as cnt FROM post"; 4if(isset($_GET['page']) && is_numeric($_GET['page'])){ 5 $page= $_GET['page']; 6}else{ 7 $page=1; 8} 9$counts = $db -> query($count_sql); 10$count = $counts -> fetch(PDO::FETCH_ASSOC); 11$max_page = ceil($count['cnt'] / 15); 12 13if($page == 1 || $page == $max_page) { 14 $range = 4; 15}elseif($page ==2 || $page == $max_page -1){ 16 $range = 3; 17}else{ 18 $range = 2; 19} 20$from_record = ($page -1 *15 +1); 21if($page == $max_page && $count['cnt'] % 15 !== 0) { 22 $to_record = ($page - 1) * 15 + $count['cnt'] % 15; 23}else{ 24 $to_record = $page * 15; 25} 26?> 27<?php 28session_start(); 29$db = new PDO('mysql:host=----------'); 30$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 31$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 32$sql = 'SELECT MAX(id) FROM post'; 33$stmt = $db->prepare($sql); 34$stmt->execute(); 35$result = $stmt->fetch(); 36$stmt = null; 37$db = null; 38if(!empty($result)){ 39$_SESSION['maxid'] = $result['id']; 40$maxid = $_SESSION['maxid']; 41}else{ $err_msg = "問題の読み出しエラー";} 42?> 43 44<!DOCTYPE html> 45<!--------------------------------共通のHTML--------------------------------------------------> 46<html lang="ja"> 47 <head> 48 <meta charset="utf-8"> <!このページの情報> 49 <meta name="viewport" content="width=device-width, initial-scale=1"> 50 <link rel="shortcut icon" href="/favicon.ico"> <!ブックマークのアイコン> 51 <link rel="apple-touch-icon" href="/apple-touch-icon.png"> 52 <meta name="description" content="分からないことを聞いたり説明し、分からないことをなくす.より理解を深めるwebsite。"> 53 <title>Arch Education</title> 54 <link rel="stylesheet" href="-------?<?php echo date('Ymd-Hi');?>" type="text/css"> 55 </head> 56 <body bg-color="#000"> 57<!-----------------------------header-他のページでも共通のヘッダー----------------------------> 58 <header> 59 <div class="body header-inner header-logo"> 60 <img src="/images/header.jpg" alt="header.jpg" width="100" height="60"> 61 <a href="" class="header-botton">設定</a> 62 <h1 href="" class="header-name">Other Question</h1> 63 </div> 64 </header> 65<!-----------------------------nav-----------------------------------------------------------> 66<!---------------------------------------main-----------------------------------------------> 67 <section class="main"> 68 <form action="" method="post"> 69 <div class="scrolling-image-container"><!スクロール画面自体のコンテナ> 70 <div class="scrolling-image"> 71 <a href="" ></a> 72 </div><!スクロール画面の投稿画面。> 73 <input type="hidden" name="scrolling" id="count" value=15> 74 <div id="content"> 75 <input class="1" href="/post/post.html?<?php echo $_SESSION['maxid'];?>"> 76 <?php 77 if($page == 1){ 78 $sql = 'SELECT title FROM post where :maxid'; 79 $stmt->bindValue(':maxid', $maxid, PDO::PARAM_INT); 80 $stmt = $db->prepare($sql); 81 $stmt->execute(); 82 $result = $stmt->fetch(); 83 $stmt = null; 84 $db = null; 85 if(!empty($result)){ 86 $_SESSION['title'] = $result['title']; 87 exit(); 88 echo $_SESSION['title']; 89 }else{ $err_msg = "これ以上問題がありません。";} 90 }else{ 91 $nextid = ($maxid - 15 * $page); 92 $sql = 'SELECT title FROM post where :nextid'; 93 $stmt->bindValue(':nextid', $nextid, PDO::PARAM_STR); 94 $stmt = $db->prepare($sql); 95 $stmt->execute(); 96 $result = $stmt->fetch(); 97 $stmt = null; 98 $db = null; 99 if(!empty($result)){ 100 $_SESSION['title'] = $result['title']; 101 exit(); 102 echo $_SESSION['title']; 103 }else{ $err_msg = "これ以上問題がありません。";} 104 } 105 ?> 106 </input> 107 <div class="2" href="/post/post.html">追加されたコンテンツ2</div> 108 <div class="3" href="/post/post.html">追加されたコンテンツ3</div> 109 <div class="4" href="/post/post.html">追加されたコンテンツ4</div> 110 <div class="5" href="/post/post.html">追加されたコンテンツ5</div> 111 <div class="6" href="/post/post.html">追加されたコンテンツ6</div> 112 <div class="7" href="/post/post.html">追加されたコンテンツ7</div> 113 <div class="8" href="/post/post.html">追加されたコンテンツ8</div> 114 <div class="9" href="/post/post.html">追加されたコンテンツ9</div> 115 <div class="10" href="/post/post.html">追加されたコンテンツ10</div> 116 <div class="11" href="/post/post.html">追加されたコンテンツ11</div> 117 <div class="12" href="/post/post.html">追加されたコンテンツ12</div> 118 <div class="13" href="/post/post.html">追加されたコンテンツ13</div> 119 <div class="14" href="/post/post.html">追加されたコンテンツ14</div> 120 <div class="15" href="/post/post.html">追加されたコンテンツ15</div> 121 </div> 122 </div> 123 </form> 124 <p class="from_to"><?php echo $count['cnt']; ?>件中 <?php echo $from_record; ?> - <?php echo $to_record; ?> 件目を表示</p> 125 <?php 126for($i = 1; $i <= $max_page; $i++) { 127 if($i >= $page - $range && $i <= $page + $range) { 128 if($i == $page) { 129?> 130 <span class="now_page_number"><?php echo $i; ?></span> 131<?php }else{ ?> 132 <a href="page=<?php echo $i; ?>" class="page_number"><?php echo $i; ?></a> 133<?php 134 ;} 135 }else{;} 136;} 137?> 138 </section> 139<!-----------------------------------footer-完成----------------------------------------------> 140 <footer> 141 <div class="body footer btn-orange btn-circle btn-circle-a"> 142 <a href="" class="btn btn-orage btn-circle btn-circle-a">他の質問</a> 143 <a href="-------" class="btn btn-orage btn-circle btn-circle-a">Research</a> 144 <a href="-----" class="btn btn-orage btn-circle btn-circle-a">+Q</a> 145 <a href="" class="btn btn-orage btn-circle btn-circle-a">問題集</a> 146 <a href="------" class="btn btn-orage btn-circle btn-circle-a">Profile</a> 147 </div> 148 <a href="" class="footer-copyright"> 149 © Arch 150 </a> 151 </footer> 152 </body> 153</html>
テーブル構造
CREATE TABLE `post` ( `id` int(10) NOT NULL, `subject` varchar(15) DEFAULT NULL, `grade` varchar(15) DEFAULT NULL, `post` varchar(2000) DEFAULT NULL, `pictures` int(11) DEFAULT NULL, `title` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
試したこと
"selectでMAX(id)を取得 出力方法"と調べたところ
https://medium-company.com/select-max/
のようなMAX(id)の使い方などは出てくるのですが、それをSESSIONなどに代入方法が出てきません。
補足情報(FW/ツールのバージョンなど)
39行目は$_SESSION['maxid'] = $result['id'];の部分です。
82行目は$stmt->bindValue(':maxid', $maxid, PDO::PARAM_INT);です。
$SESSIONに代入ができていないので81行目のエラーも出ていると思っています。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。