個人で子供向けのwebアプリを作成しています。
データベースに入力されたデータの1週間分を計算してグラフを表示するページなのですが、
1週間分のデータを取るところで間違っていると思われます。
どこに問題があるかご教授頂けないでしょうか。
初心者でコードが読みにくくて申し訳ありません。
ご指摘頂きありがとうございました。
MYSQLのヴァージョンはmysql - 5.1.73です。
試したこと追記
WHERE createdate >= DATE(DATE_ADD('2019-07-10', INTERVAL -7 DAY))
where以降の日付の指定が無ければ集計が取れます。where以降を付けるとエラーになります。
#1054 - Unknown column 'createdate' in 'where clause'
mysqliに書き直すとはこれで良いのでしょうか?
php $result = $mysqli->query("SELECT SUM(calorie), SUM(protein), SUM(lipid),SUM(carbohydrate), SUM(calcium), SUM(iron),SUM(zinc), SUM(magnesium), SUM(folic_acid),SUM(vitamin_a), SUM(vitamin_d), SUM(vitamin_e),SUM(vitamin_k), SUM(vitamin_b1), SUM(vitamin_b2),SUM(vitamin_c), SUM(dietary_fiber) FROM gohanmemor2 WHERE createdate >= DATE(DATE_ADD($day, INTERVAL -7 DAY))"; $row = $result->fetch_assoc($sum,$conn); $calorie = $row['SUM(calorie)']; $protein = $row['SUM(protein)']; $lipid = $row['SUM(lipid)']; $carbohydrate = $row['SUM(carbohydrate)']; $calcium = $row['SUM(calcium)']; $iron = $row['SUM(iron)']; $zinc = $row['SUM(zinc)']; $magnesium = $row['SUM(magnesium)']; $folic_acid = $row['SUM(folic_acid)']; $vitamin_a = $row['SUM(vitamin_a)']; $vitamin_d = $row['SUM(vitamin_d)']; $vitamin_e = $row['SUM(vitamin_e)']; $vitamin_k = $row['SUM(vitamin_k)']; $vitamin_b1 = $row['SUM(vitamin_b1)']; $vitamin_b2 = $row['SUM(vitamin_b2)']; $vitamin_c = $row['SUM(vitamin_c)']; $dietary_fiber = $row['SUM(dietary_fiber)']; $sto=$db->prepare($sql); $sto->execute(); $db=null; } catch (PDOException $e) { die("<h2>データベース接続に失敗しました</h2>"); }
mysql
1コード 2 3testテーブル 4create table test(sno int auto_increment,day date,calorie int,protein DOUBLE,lipid DOUBLE,carbohydrate DOUBLE,calcium DOUBLE,iron DOUBLE,zinc DOUBLE,magnesium DOUBLE,folic_acid DOUBLE,vitamin_a DOUBLE,vitamin_d DOUBLE,vitamin_e DOUBLE,vitamin_k DOUBLE,vitamin_b1 DOUBLE,vitamin_b2 DOUBLE,vitamin_c DOUBLE,dietary_fiber DOUBLE,primary key(sno)); 5 6 7INSERT INTO test(day,calorie,protein,lipid,carbohydrate,calcium,iron,zinc,magnesium,folic_acid,vitamin_a,vitamin_d,vitamin_e,vitamin_k,vitamin_b1,vitamin_b2,vitamin_c,dietary_fiber) 8values('2019-07-04',741,38.67,38.42,70.62,99.8,3.11,3.21,58.24,92,246.2,2.47,2.18,18.04,0.79,0.58,79,4.8), 9('2019-07-05',1103,45.2,58.4,92.9,694,1.9,6.4,66.7,42,270,0.5,1.2,13,0.29,0.48,10,0.5), 10('2019-07-06',1376,40.97,83.82,105.22,251.8,3.41,5.11,81.24,161,679.2,2.77,2.78,84.04,0.22,0.89,66,1.9), 11('2019-07-07',1088,58.57,62.52,82.72,833.8,2.21,6.91,117.24,163,373.2,0.97,2.18,20.04,0.89,0.72,59,7.8), 12('2019-07-08',835,47.8,32.3,80.2,27,2.5,4.3,76.72,66,30,11.1,1.4,11,0.88,0.5,9,1.8), 13('2019-07-09',988,53.78,45,96.34,552,5.59,8.6,104.7,158.5,209.44,2.6,1.99,86.32,1.03,0.81,68.72,5.18), 14('2019-07-10',1436,146.38,46.36,94.3,305,9.06,14.66,392.6,245.4,487.4,46.2,13.66,53.2,0.67,1.47,68,4.12), 15('2019-07-11',1049,62.6,36,142.9,1007,8.1,6.4,457,600,691,0.1,2.3,1276,1.28,1.6,57,14.11), 16('2019-07-12',828,31.6,39.7,80.4,63,3.4,4.1,45.7,56,150,2.3,1.4,14,0.32,0.58,10,0.5); 17 18
ここから問題のページを簡易化したものです。
php
1 2<?php 3//グラフ作成のPHP 4//formから起算日(デフォルトは当日)を指定して送信されます。 5$day=$GET_['day']; 6?> 7<!DOCTYPE html> 8<html> 9<head> 10<title>testグラフ</title> 11<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 12<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js" type="text/javascript"></script> 13<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js"></script> 14</head> 15<body> 16<?php 17 try{ 18 $db=new PDO('mysql:host=localhost;dbname=webdb','root','root'); 19 20 21 print("<p>データベース[webdb]に接続しました</p>"); 22 23 //起算日から1週間分のデータを取り出します。 24 $sql="SELECT * FROM test WHERE createdate >= DATE(DATE_ADD($day, INTERVAL -7 DAY))"; 25 26 27 $sto=$db->prepare($sql); 28 $sto->execute(); 29 30 while($row=$sto->fetch() ){ 31$sno =$row['sno']; 32$day =$row['day']; 33$calorie = ($row['calorie']); 34$protein = ($row['protein']); 35$lipid = ($row['lipid']); 36$carbohydrate = ($row['carbohydrate']); 37$calcium = ($row['calcium']); 38$iron = ($row['iron']); 39$zinc = ($row['zinc']); 40$magnesium = ($row['magnesium']); 41$folic_acid = ($row['folic_acid']); 42$vitamin_a = ($row['vitamin_a']); 43$vitamin_d = ($row['vitamin_d']); 44$vitamin_e = ($row['vitamin_e']); 45$vitamin_k = ($row['vitamin_k']); 46$vitamin_b1 = ($row['vitamin_b1']); 47$vitamin_b2 = ($row['vitamin_b2']); 48$vitamin_c = ($row['vitamin_c']); 49$dietary_fiber = ($row['dietary_fiber']); 50} 51 52 53 54 55 56//ビタミンとミネラルの合計を計算 57$mineral=$carbohydrate +$calcium +$iron +$zinc +$magnesium; 58$vitamin=$folic_acid +$vitamin_a +$vitamin_d +$vitamin_e +$vitamin_k +$vitamin_b1 +$vitamin_b2 +$vitamin_c; 59 $sto=$db->prepare($sql); 60 if($sto->execute()){ 61 print("<p>データ受け取りしました</p>"); 62 }else{ 63 print("<p>SQL文実行時にエラーが発生しました</p>"); 64 } 65 66 $db=null; 67 68 } catch (PDOException $e) { 69 die("<h2>データベース接続に失敗しました</h2>"); 70 } 71} 72//1週間分の摂取目標 73$calorie_total=10850; 74$protein_total=245; 75$lipid_total=210; 76$carbohydrate_total=455; 77$calcium_total=4200; 78$iron_total=45.5; 79$zinc_total=35; 80$magnesium_total=910; 81$folic_acid_total=910; 82$vitamin_a_total=3150; 83$vitamin_d_total=280; 84$vitamin_e_total=35.0; 85$vitamin_k_total=595; 86$vitamin_b1_total=5.6; 87$vitamin_b2_total=6.3; 88$vitamin_c_total=385; 89$dietary_fiber_total=77; 90 91//ビタミンとミネラルの合計を計算 92$mineral_total=$carbohydrate_total +$calcium_total +$iron_total +$zinc_total +$magnesium_total; 93$vitamin_total=$folic_acid_total +$vitamin_a_total +$vitamin_d_total +$vitamin_e_total +$vitamin_k_total +$vitamin_b1_total +$vitamin_b2_total +$vitamin_c_total; 94 95 96//パーセントの計算を定義 97function num2per($val, $val_total, $precision = 0) { 98if (($val < 0)or($val_total < 0)) { return false; } 99$val_percent = ($val / $val_total) * 100; 100return round($val_percent, $precision); 101} 102$calorie_percent=num2per($calorie, $calorie_total); 103$protein_percent=num2per($protein, $protein_total); 104$lipid_percent=num2per($lipid, $lipid_total); 105$dietary_fiber_percent=num2per($dietary_fiber, $dietary_fiber_total); 106$mineral_percent=num2per($mineral, $mineral_total); 107$vitamin_percent=num2per($vitamin, $vitamin_total); 108?> 109 110<tr><td colspan="9" style="text-align:center; font-size:30px;background-color: #33FF99;">栄養素の合計値をグラフで表示</td></tr> 111 112 113<!-- チャート描画キャンバス --> 114<tr><td colspan="9" style="width:720px;height:500px;backgroud-color:#FFF;"><div><canvas id="myChart" style="background-color:#fff;"></canvas></div></td></tr> 115<script> 116 117// 色の設定 118var colorSet = { 119 red: 'rgb(255, 99, 132)', 120 orange: 'rgb(255, 159, 64)', 121 yellow: 'rgb(255, 205, 86)', 122 green: 'rgb(75, 192, 192)', 123 blue: 'rgb(54, 162, 235)', 124 purple: 'rgb(153, 102, 255)', 125 grey: 'rgb(201, 203, 207)' 126}; 127 128// 乱数生成(0~100) 129var rnd100 = function(){ 130 return Math.round(Math.random() * 100); 131}; 132 133// 色のRGB変換 134var color = Chart.helpers.color; 135 136/* 137 * チャートの初期設定 138 */ 139var config = { 140 type: 'radar', 141 data: { 142 labels: ["エネルギー", "たんぱく質", "脂質", "炭水化物", "ミネラル", "ビタミン"], 143 datasets: [{ 144 label: "摂取量", 145 backgroundColor: color(colorSet.red).alpha(0.5).rgbString(), 146 borderColor: colorSet.red, 147 pointBackgroundColor: colorSet.red, 148 149 data: [<?php echo $calorie_percent ?>, <?php echo $protein_percent ?>, <?php echo $lipid_percent ?>, <?php echo $carbohydrate_percent ?>, <?php echo $mineral_percent ?>, <?php echo $vitamin_percent ?> ] 150 151 152 153 154 },] 155 }, 156 options: { 157 animation:false, 158 showTooltips: false, 159 legend: { position: 'bottom' }, 160 title: { 161 display: true, 162 fontSize:20, 163 fontColor:'#666', 164 text: '栄養素チャート' 165 }, 166 scale: { 167 display: true, 168 pointLabels: { 169 fontSize: 15, 170 fontColor: colorSet.blue 171 }, 172 ticks: { 173 display: true, 174 fontSize: 12, 175 fontColor: colorSet.green, 176 min: 0, 177 max: 100, 178 beginAtZero: true 179 }, 180 gridLines: { 181 display: true, 182 color: colorSet.yellow 183 } 184 } 185 } 186}; 187 188/* 189 * チャートの作成 190 */ 191var myRadar = new Chart($("#myChart"), config); 192 193</script> 194</table> 195</body> 196</html>
エラー表示は以下のエラーを書いています。
DBに接続しました。までは表示されますが
以降は一切表示されておりません。
php
1$sto=$db->prepare($sql); 2 if($sto->execute()){ 3 print("<p>データ受け取りしました</p>"); 4 }else{ 5 print("<p>SQL文実行時にエラーが発生しました</p>"); 6 } 7 8 $db=null; 9 10 } catch (PDOException $e) { 11 die("<h2>データベース接続に失敗しました</h2>"); 12 }