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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

0回答

801閲覧

ボタンを押したときの処理を書いたらオブジェクトがないとエラーが出てしまう

boron

総合スコア11

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2020/11/16 02:07

編集2020/11/19 00:10

次月を押すと次月のカレンダーが表示されるようにしたいです。
イメージ説明
そこで

PHP

1if(isset($_POST["month"])){ 2 $month = date('m',strtotime('1 month')); 3}

を追加してボタンが押されたときに現在の月に+1して次月を表示させようと考えましたが、次のようなエラーが出ます。
Fatal error: Call to a member function fetch() on a non-object in C:\eclipse-php\xampp\htdocs\kenkyuu\update&edit2.php on line 34

34行目は

PHP

1while($reservation = $reservations->fetch()){ 2 $monthly[$reservation['day']][] = array($reservation['time1'],$reservation['time2'],$reservation['g_name']); 3}

のようになっています
どうしてボタンを押したときの処理を書いただけでこのようなエラーが発生するのか分かりませんしどのように解決すればよいか分かりません。
教えていただけないでしょうか?
全体のコードは次のようになっています。

PHP

1<!DOCTYPE html> 2<html><head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>スケジュール編集</title> 5<style> 6 .sun{color: red;} 7 .sat{color: blue;} 8 #content{ 9 padding: 20px; 10 width: 720px; 11 min-height: 490px; 12 margin: 0 auto; 13 margin-bottom: 10px; 14 font-size: 153.9%; 15} 16 17 18</style> 19</head> 20<body> 21 22<?php 23require("nav_admin.php"); 24require('dbconnect.php'); 25 26if(isset($_POST["month"])){ 27 $month = date('m',strtotime('1 month')); 28} 29// $month = date('m'); 30$year = date('Y'); 31 32$reservations = $db->query('select * from reservation where year = '.$year.' and month = '.$month.''); 33 34while($reservation = $reservations->fetch()){ 35 $monthly[$reservation['day']][] = array($reservation['time1'],$reservation['time2'],$reservation['g_name']); 36} 37// ksort($monthly); 38// print_r($monthly); 39// exit; 40 41// 一か月分の日付を曜日付きで出力する 42$lastd = 31;//$yearと$monthから計算して求める 43$time = mktime(0, 0, 0, $month + 1, 0, $year); 44$lastd = date('d',$time); 45//時区間分割を実現する 46$divided=[]; 47for ($d=1; $d<= $lastd; $d++){ 48 if (array_key_exists($d, $monthly)){ 49 //配列のキーが存在するか調べる(キー、対象の配列) 50 //この日に予定があれば、分割していく 51 $intv = [[9,21,'']]; 52 foreach ($monthly[$d] as $yotei){//(対象配列 as その中身)、$yoteiは[x,y,z] 53 $intv= div($intv, $yotei); 54 } 55 $divided[$d] = $intv;//=[x,y,z] 56 }else{ 57 $divided[$d] = [[9,21,'']]; 58 } 59} 60 61//print_r($divided); 62//exit; 63echo '<div id="content">'; 64echo '<table border=1>'; 65echo '<h2>スケジュール編集</h2> '; 66echo '<ul class="nav nav-tabs" role="tablist"> 67 <li class="nav-item"> 68 <a class="nav-link active" id="item1-tab" data-toggle="tab" href="#item1" role="tab" aria-controls="item1" aria-selected="true">野球場</a> 69 </li> 70 <li class="nav-item"> 71 <a class="nav-link" id="item2-tab" data-toggle="tab" href="#item2" role="tab" aria-controls="item2" aria-selected="false">テニスコート</a> 72 </li> 73 </ul>'; 74echo "<h3>{$year}{$month}月</h3>"; 75echo "<form name=\"\" method=\"POST\">"; 76echo "<button type=\"button\" onclick=\"location.href='#'\">前月</button>"; 77echo "<button type=\"submit\" name=\"month\" value=\"0\">次月</button>"; 78echo '<input type="text" name="sname" size="2"/>年<input type="text" name="sname" size="2"/>月'; 79echo "<button type=\"button\" onclick=\"location.href='#'\">検索</button>"; 80echo "<button type=\"button\" onclick=\"location.href='#'\">編集</button>"; 81echo "<button type=\"button\" onclick=\"location.href='#'\">引き継ぐ</button>"; 82echo "</form>"; 83echo '<tr><td></td>'; 84for ($h=9; $h<22; $h++){ 85 echo '<td >', $h, '</td>'; 86} 87echo '</tr>'; 88for ($d=1; $d<=$lastd; $d++){ 89 $time = mktime(0, 0, 0, $month, $d, $year); 90 $w = date('w',$time); 91 $wdays = array('日','月','火','水','木','金','土',); 92 $class = ''; 93 if ($w==0) $class='sun'; 94 if ($w==6) $class='sat'; 95 echo '<tr>'; 96 echo '<td><span class="'.$class.'">', $d,'('. $wdays[$w].')</span>'. '</td>'; 97 $yotei = $divided[$d]; 98 foreach ($yotei as $y){//$yotei=$divided[$d]=[x,y,z] 99 $y1 = $y[0];//[x,y,z]のx 100 $y2 = $y[1];//[x,y,z]のy 101 $y3 = $y[2];//[x,y,z]のz 102 $colspan=$y2-$y1+1; 103 if(!empty($y3)){ 104 echo '<td colspan="'. $colspan . '">'.$y3.'</td>'; 105 }else{ 106 echo '<td colspan="'. $colspan . '"><a href="reservation.php?y='.$year.'&m='.$month.'&d='.$d.'&w='.$wdays[$w].'&t1='.$y1.'&t2='.$y2.'">○</a></td>'; 107 } 108 109 } 110 echo '</tr>'; 111} 112echo '</table>'; 113echo '</div>'; 114?> 115</body> 116</html> 117<?php 118//div.phpからコピーしたもの 119 function div($intv, $a){ 120 // $a=[11,12,''] =(div)=> $intv=[[9,10,''],[11,12,'試合'],[13,21,'']] 121 $a1 = $a[0]; 122 $a2 = $a[1]; 123 $a3 = $a[2];//追加 124 $out = []; 125 for ($i=0; $i<count($intv); $i++){ 126 $b1 = $intv[$i][0]; 127 $b2 = $intv[$i][1]; 128 $b3 = $intv[$i][2];//追加 129 130 if ($a1 >= $b1 and $a2 <= $b2){ 131 if ($b1<=$a1-1) 132 $out[]=[$b1, $a1-1, $b3]; //$b3を追加 133 $out[]=[$a1, $a2, $a3]; //$a3を追加 134 if ($a2+1<=$b2) 135 $out[]=[$a2+1,$b2, $b3]; //$b3を追加 136 }else{ 137 $out[] = $intv[$i]; 138 } 139 } 140 return $out; 141 } 142?>

requireの中身nav_admin.phpは次のようになっています

PHP

1<!DOCTYPE html> 2 3<html> 4<head> 5<meta charset="UTF-8"> 6 7<meta http-equiv="X-UA-Compatible" content="IE=edge"> 8<meta name="viewport" content="width=device-width, initial-scale=1"> 9 10 <link rel="stylesheet" href="css/bootstrap.css"> 11 <script type="text/javascript" src="js/jquery-3.2.1.js"></script> 12 <script type="text/javascript" src="js/bootstrap.js"></script> 13 <link href="css/bootstrap.min.css" rel="stylesheet"> 14 <!-- jQuery読み込み --> 15 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 16 <!-- BootstrapのJS読み込み --> 17 <script src="js/bootstrap.min.js"></script> 18<style type="text/css"> 19 .container{ 20 width:800px; 21 margin:0px auto 0px auto; 22 } 23 24 </style> 25</head> 26 27<body> 28 <div class="container"> 29 <nav class="navbar navbar-default"> 30 <div class="container-fluid"> 31 <div class="navbar-header"> 32 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> 33 <span class="sr-only">Toggle navigation</span> 34 <span class="icon-bar"></span> 35 <span class="icon-bar"></span> 36 <span class="icon-bar"></span> 37 </button> 38 <a class="navbar-brand" href="#">○○市施設予約システム</a> 39 </div> 40 <ul class="nav navbar-nav navbar-right"> 41 <li><a href="https://localhost/kenkyuu/admin-home.php">ホーム</a></li> 42 <li><a href="https://localhost/kenkyuu/login.php">ログイン</a></li> 43 <li><a href="https://localhost/kenkyuu/update&edit.php">スケジュール編集</a></li> 44 <li><a href="https://localhost/kenkyuu/account-catalogue.php">アカウント一覧</a></li> 45 <li><a href="https://localhost/kenkyuu/apply-permission.php">申請承認</a></li> 46 </ul> 47 </div> 48 </nav> 49 </body> 50</html>

requireの中身dbconnect.phpは次のようになっています

PHP

1<?php 2 try{//例外処理 3 $db = new PDO('mysql:dbname=kenkyuu;host=127.0.0.1;charaset=utf8','root','' 4 , array( 5 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'//文字化け対策 6 ) 7 );//データベースへの接続 8 9 } catch(PDOException $e){//正常に接続できなかったときのためにcatchを用意 10 print('DB接続エラー:' . $e->getMessage()); 11 } 12?>

エラー発生時の$monthは
イメージ説明
エラーが発生するのは次月を押したときです

追記
DB上に、次月の予定は存在していますか?
→次月の予定は存在していません。
その場合は全て空き状態(○)として表示させたいと考えています。

dbconnect.phpの$db = new PDO(...); の次の行に
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
と入れて実行をすると
Warning: array_key_exists() expects parameter 2 to be array, nulll given in C:"eclipse-php¥xampp¥htdocs¥kenkyuuupdate&edit2.php on line 53
というエラーが表示されました

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

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

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

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

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

m.ts10806

2020/11/16 02:13

>全体のコードは requireで他にもコードを読み込まれているのでそれら次第です。そちらのコードもご提示ください。
m.ts10806

2020/11/16 02:14

あと、エラーも画像よりテキストでコピペしたものを提示してもらった方がありがたいです。画像開かなければいけませんし、画像だとそこにある文字情報をコピーできません。
YT0014

2020/11/16 03:53 編集

エラー発生時、$month がどうなっているのか、ご提示ください。 不明な場合は、ご確認ください。 加えて、PDO::queryの仕様をご確認ください。 https://www.php.net/manual/ja/pdo.query.php
cerfweb

2020/11/16 14:48

エラーが発生するのは最初の表示ですか、次月というボタンを押した時ですか。
YT0014

2020/11/18 03:55

DB上に、次月の予定は存在していますか?
cerfweb

2020/11/18 11:15

dbconnect.phpの$db = new PDO(...); の次の行に $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); と入れたらどんなエラーが表示されますか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問