質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

731閲覧

MAX(id)を取得してそれを$SESSIONに代入したい

aoihello

総合スコア31

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/09/09 13:00

前提

投稿を出力する画面を作っています。
最新の投稿から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 &copy; 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行目のエラーも出ていると思っています。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

$_SESSION['maxid'] = $result['MAX(id)'];と書き換えたところうまくいきました。
ご回答いただいた方誠にありがとうございました。

投稿2022/09/09 14:23

編集2022/09/09 14:24
aoihello

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQLでselectしている項目にidが存在しないためです。
別名でidをつけるか、1つ目の項目というような指定で値を取得すればよいと思います。

投稿2022/09/09 13:35

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoihello

2022/09/09 13:40

ご回答誠にありがとうございます。 ちょうど今$_SESSION['maxid'] = $result['MAX(id)'];と書いたところエラーは出なくなりました。 しかし、全くHTMLが読まれず真っ白な画面になってしまってそれについての質問をしようとした所でした。 これは$_SESSION['maxid'] = $result['MAX(id)'];のやり方が間違っていてtabuu様が仰るような形にするものなのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問