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

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

解決済

2回答

2132閲覧

なぜ構文エラーになるかが分からない

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/12/04 05:18

2.3日前はエラーが出ずに動いていましたが、今日動かすとこのようなエラーが出てしまいました。
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1' in C:\eclipse-php\xampp\htdocs\kenkyuu\schedule.php on line 60

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 in C:\eclipse-php\xampp\htdocs\kenkyuu\schedule.php on line 60

60行目の文は

PHP

1$reservations = $db->query('select * from reservation where year = '.$year.' and month = '.$month.'');

のようになっています。特に構文をいじったりしてないのになぜこのようなエラーが起きるのか分かりません。
よろしくお願い致します。

全体

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 23// require("nav_admin.php"); 24require("nav_user.php"); 25require('dbconnect.php'); 26 27 28$year = date('Y'); 29if(isset($_GET["month"])){ 30 $month = $_GET["month"]; 31 if(isset($_GET["year"])){ 32 $year = $_GET["year"]; 33 if(isset($_GET["btn"])){ 34 if($_GET["btn"] == 'next'){ 35 $month = $month+1; 36 if($month == 13){ 37 $month = 1; 38 $year = $year+1; 39 } 40 }elseif($_GET["btn"] == 'prev'){ 41 $month = $month-1; 42 if($month == 0){ 43 $month = 12; 44 $year = $year-1; 45 } 46 } 47 } 48 } 49 50} 51 52//linkでやる12月の次の処理、linkにyearを追加 53// else{ 54// $month = date('m'); 55// } 56// echo $month+1; 57// exit; 58 59 60$reservations = $db->query('select * from reservation where year = '.$year.' and month = '.$month.''); 61$monthly=[];//予定が空のときに処理 62while($reservation = $reservations->fetch()){ 63 $monthly[$reservation['day']][] = array($reservation['time1'],$reservation['time2'],$reservation['g_name']); 64} 65// ksort($monthly); 66// print_r($monthly); 67// exit; 68 69// 一か月分の日付を曜日付きで出力する 70$lastd = 31;//$yearと$monthから計算して求める 71$time = mktime(0, 0, 0, $month + 1, 0, $year); 72$lastd = date('d',$time); 73//時区間分割を実現する 74$divided=[]; 75for ($d=1; $d<= $lastd; $d++){ 76 if (array_key_exists($d, $monthly)){ 77 //配列のキーが存在するか調べる(キー、対象の配列) 78 //この日に予定があれば、分割していく 79 $intv = [[9,21,'']]; 80 foreach ($monthly[$d] as $yotei){//(対象配列 as その中身)、$yoteiは[x,y,z] 81 $intv= div($intv, $yotei); 82 } 83 $divided[$d] = $intv;//=[x,y,z] 84 }else{ 85 $divided[$d] = [[9,21,'']]; 86 } 87} 88 89//print_r($divided); 90//exit; 91echo '<div id="content">'; 92echo '<table border=1>'; 93echo '<h2>スケジュール編集</h2> '; 94echo '<ul class="nav nav-tabs" role="tablist"> 95 <li class="nav-item"> 96 <a class="nav-link active" id="item1-tab" data-toggle="tab" href="#item1" role="tab" aria-controls="item1" aria-selected="true">野球場</a> 97 </li> 98 <li class="nav-item"> 99 <a class="nav-link" id="item2-tab" data-toggle="tab" href="#item2" role="tab" aria-controls="item2" aria-selected="false">テニスコート</a> 100 </li> 101 </ul>'; 102echo "<h3>{$year}{$month}月</h3>"; 103echo "<a class='btn btn-info' href='?year=$year&month=$month&btn=prev'>前月</a>"; 104echo "<a class='btn btn-info' href='#'>編集</a>"; 105echo "<a class='btn btn-info' href='#'>引き継ぐ</a>"; 106echo "<a class='btn btn-info' href='?year=$year&month=$month&btn=next'>次月</a>"; 107echo '<tr><td></td>'; 108for ($h=9; $h<22; $h++){ 109 echo '<td >', $h, '</td>'; 110} 111echo '</tr>'; 112for ($d=1; $d<=$lastd; $d++){ 113 $time = mktime(0, 0, 0, $month, $d, $year); 114 $w = date('w',$time); 115 $wdays = array('日','月','火','水','木','金','土',); 116 $class = ''; 117 if ($w==0) $class='sun'; 118 if ($w==6) $class='sat'; 119 echo '<tr>'; 120 echo '<td><span class="'.$class.'">', $d,'('. $wdays[$w].')</span>'. '</td>'; 121 $yotei = $divided[$d]; 122 foreach ($yotei as $y){//$yotei=$divided[$d]=[x,y,z] 123 $y1 = $y[0];//[x,y,z]のx 124 $y2 = $y[1];//[x,y,z]のy 125 $y3 = $y[2];//[x,y,z]のz 126 $colspan=$y2-$y1+1; 127 if(!empty($y3)){ 128 echo '<td colspan="'. $colspan . '"><a href="edit.php?t1='.$y1.'&t2='.$y2.'&gm='.$y3.'">'.$y3.'</a></td>'; 129 }else{ 130 echo '<td colspan="'. $colspan . '"><a href="reservation.php?y='.$year.'&m='.$month.'&d='.$d.'&w='.$wdays[$w].'&t1='.$y1.'&t2='.$y2.'">○</a></td>'; 131 } 132 133 } 134 echo '</tr>'; 135} 136echo '</table>'; 137echo '</div>'; 138?> 139</body> 140</html> 141<?php 142//div.phpからコピーしたもの 143 function div($intv, $a){ 144 // $a=[11,12,''] =(div)=> $intv=[[9,10,''],[11,12,'試合'],[13,21,'']] 145 $a1 = $a[0]; 146 $a2 = $a[1]; 147 $a3 = $a[2];//追加 148 $out = []; 149 for ($i=0; $i<count($intv); $i++){ 150 $b1 = $intv[$i][0]; 151 $b2 = $intv[$i][1]; 152 $b3 = $intv[$i][2];//追加 153 154 if ($a1 >= $b1 and $a2 <= $b2){ 155 if ($b1<=$a1-1) 156 $out[]=[$b1, $a1-1, $b3]; //$b3を追加 157 $out[]=[$a1, $a2, $a3]; //$a3を追加 158 if ($a2+1<=$b2) 159 $out[]=[$a2+1,$b2, $b3]; //$b3を追加 160 }else{ 161 $out[] = $intv[$i]; 162 } 163 } 164 return $out; 165 } 166?>

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

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

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

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

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

guest

回答2

0

特に構文をいじったりしてないのになぜこのようなエラーが起きるのか分かりません。

$year$monthに来る値が変化すれば、構文として変わってしまいます。

SQL

1-- 両方が空文字列だった場合 2select * from reservation where year = and month =

そもそも論として、このようにSQLに値となる変数を直接混ぜることは、SQLインジェクションの危険がありますので、基本的にやってはいけません。値をバインドするようにしましょう。

投稿2020/12/04 05:45

maisumakun

総合スコア146018

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

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

boron

2020/12/04 06:19

返信ありがとうございます。 prepareを使ってバインドしようと思います。
guest

0

ベストアンサー

とりあえず変数をSQL文に直接つなげずに
prepareで処理してください
※アップした文書が変なので更新しました

投稿2020/12/04 05:29

編集2020/12/04 05:49
yambejp

総合スコア116724

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

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

yambejp

2020/12/04 05:50

途中までかいて消した回答がそのままアップになっていたので 改めて修正して回答アップしました
boron

2020/12/04 06:17

返信ありがとうございます。 とりあえずprepareを使ったところエラーが取れましたがまた別の問題が出てきたので引き続き頑張りたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問