php ข้อมูลในฐานข้อมูลและข้อมูลที่แสดงในเว็บจากการเขียน php code ไม่ถูกต้อง
ผมมีปัญหาที่ข้อมูลที่เก็บไว้ใน database และข้อมูลที่แสดงบนเว็บจากการดึงข้อมูลจาก database ไม่ถูกต้องครับ
เช่น ผมเขียน php code กำหนดให้เลือกค่า min(data) จากในฐานข้อมูลมาแสดงและค่าที่แสดงบนเว็บนั้นไม่ใช่ครับที่ต่ำที่สุด
ในกรณีเดียวกันกำหนดให้เลือกค่า max(data) จากในฐานข้อมูลมาแสดงและค่าที่แสดงบนเว็บนั้นไม่ใช่ครับที่สูงที่สุด
ผมไม่เข้าใจเลยว่าผิดตรงไหน หากมีผู้เชี่ยวชาญคนใดสามารถแก้ปัญหาได้รบกวนช่วยบอกผมด้วยนะครับ ขอบคุณครับ
Code (PHP)
<html>
<head>
<?php
$query = "
SELECT DATETIME AS date, ID AS id,
M_A_VA AS M_A_VA, M_B_VA AS M_B_VA, M_C_VA AS M_C_VA
FROM meter
GROUP BY ID";
$query19="select avg(M_A_VA) as 'AVG_A' from meter";
$query20="SELECT M_A_VA AS 'MIN_A', DATETIME AS 'DT_MIN' FROM meter WHERE M_A_VA = (SELECT MIN(M_A_VA) FROM meter WHERE M_A_VA <> 0)";
$query21="SELECT M_A_VA AS 'MAX_A', DATETIME AS 'DT_MAX' FROM meter WHERE M_A_VA = (SELECT MAX(M_A_VA) FROM meter)";
$query22="select avg(M_B_VA) as 'AVG_B' from meter";
$query23="SELECT M_B_VA AS 'MIN_B', DATETIME AS 'DT_MIN' FROM meter WHERE M_B_VA = (SELECT MIN(M_B_VA) FROM meter WHERE M_B_VA <> 0)";
$query24="SELECT M_B_VA AS 'MAX_B', DATETIME AS 'DT_MAX' FROM meter WHERE M_B_VA = (SELECT MAX(M_B_VA) FROM meter)";
$query25="select avg(M_C_VA) as 'AVG_C' from meter";
$query26="SELECT M_C_VA AS 'MIN_C', DATETIME AS 'DT_MIN' FROM meter WHERE M_C_VA = (SELECT MIN(M_C_VA) FROM meter WHERE M_C_VA <> 0)";
$query27="SELECT M_C_VA AS 'MAX_C', DATETIME AS 'DT_MAX' FROM meter WHERE M_C_VA = (SELECT MAX(M_C_VA) FROM meter)";
$res19=mysqli_query($conn,$query19);
$res20=mysqli_query($conn,$query20);
$res21=mysqli_query($conn,$query21);
$res22=mysqli_query($conn,$query22);
$res23=mysqli_query($conn,$query23);
$res24=mysqli_query($conn,$query24);
$res25=mysqli_query($conn,$query25);
$res26=mysqli_query($conn,$query26);
$res27=mysqli_query($conn,$query27);
$data19=mysqli_fetch_array($res19);
$data20=mysqli_fetch_array($res20);
$data21=mysqli_fetch_array($res21);
$data22=mysqli_fetch_array($res22);
$data23=mysqli_fetch_array($res23);
$data24=mysqli_fetch_array($res24);
$data25=mysqli_fetch_array($res25);
$data26=mysqli_fetch_array($res26);
$data27=mysqli_fetch_array($res27);
$result = mysqli_query($con, $query);
$resultchart = mysqli_query($con, $query);
//for chart
$id = array();
$M_A_VA = array();
$M_B_VA = array();
$M_C_VA = array();
$date = array();
while($rs = mysqli_fetch_array($resultchart)){
$id[] = "\"".$rs['id']."\"";
$M_A_VA[] = "\"".$rs['M_A_VA']."\"";
$M_B_VA[] = "\"".$rs['M_B_VA']."\"";
$M_C_VA[] = "\"".$rs['M_C_VA']."\"";
$date[] = "\"".$rs['date']."\"";
}
$id = implode(",", $id);
$M_A_VA = implode(",", $M_A_VA);
$M_B_VA = implode(",", $M_B_VA);
$M_C_VA = implode(",", $M_C_VA);
$date = implode(",", $date);
?>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.bundle.js"></script>
<div class="container">
<div class="row">
<div class="col-md-12">
<p align="center">
<canvas id="myChart5" width="800px" height="300px"></canvas>
<script>
var ctx = document.getElementById("myChart5").getContext('2d');
var myChart5 = new Chart(ctx, {
type: 'line',
data: {
labels: [<?php echo $date;?>],
datasets: [
{
label: 'Phase:A Apparent Power [VA]',
data: [<?php echo $M_A_VA;?>],
},
{
label: 'Phase:B Apparent Power [VA]',
data: [<?php echo $M_B_VA;?>],
},
{
label: 'Phase:C Apparent Power [VA]',
data: [<?php echo $M_C_VA;?>],
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero:true
}
}]
}
}
});
</script>
</p>
</div>
</div>
</div>
<hr>
<table width="1400" border="1" cellpadding="10" cellspacing="0" align="center">
<td colspan="2" align="center"><h6><font size="6">Minimum Value</td>
<td colspan="2" align="center"><h6><font size="6">Maximum Value</td></tr>
<tr><td align="center" width="15%"><h1><font size="6">Value</td>
<td align="center"><h1><font size="6">Date Time</td>
<td align="center" width="15%"><h1><font size="6">Value</td>
<td align="center"><h1><font size="6">Date Time</td></tr>
<tr><td align="center" bgcolor="FFE6E6"><h4>
<?php echo number_format($data19['AVG_A'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="FFE6E6"><h4>
<?php echo number_format($data20['MIN_A'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="FFE6E6"><h4>
<?php echo $data20['DT_MIN'];?>
</td>
<td align="center" bgcolor="FFE6E6"><h4>
<?php echo number_format($data21['MAX_A'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="FFE6E6"><h4>
<?php echo $data21['DT_MAX'];?>
</td>
</tr>
<tr><td align="center" bgcolor="C8FFFF"><h4>
<?php echo number_format($data22['AVG_B'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="C8FFFF"><h4>
<?php echo number_format($data23['MIN_B'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="C8FFFF"><h4>
<?php echo $data23['DT_MIN'];?>
</td>
<td align="center" bgcolor="C8FFFF"><h4>
<?php echo number_format($data24['MAX_B'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="C8FFFF"><h4>
<?php echo $data24['DT_MAX'];?>
</td>
</tr>
<tr><td align="center" bgcolor="FAFAD2"><h4>
<?php echo number_format($data25['AVG_C'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="FAFAD2"><h4>
<?php echo number_format($data26['MIN_C'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="FAFAD2"><h4>
<?php echo $data26['DT_MIN'];?>
</td>
<td align="center" bgcolor="FAFAD2"><h4>
<?php echo number_format($data27['MAX_C'],2, '.', '')."";?>
</td>
<td align="center" bgcolor="FAFAD2"><h4>
<?php echo $data27['DT_MAX'];?>
</td>
</tr>
</table>
<hr>
</html>
Tag : PHP, MySQL, HTML, Web Hosting, Windows
ประวัติการแก้ไข 2020-06-23 00:36:40
Date :
2020-06-23 00:33:57
By :
deatinyfrank
View :
668
Reply :
21
คำถามเกี่ยวกับ database ไม่มี database ประกอบ ตอบไม่ได้ครับ เพราะตัวแปรที่อ้างอิงมาต้องดูที่ field header หรือ database table structure
ผมอาจดูไม่ครบถ้วนเริ่มตาลาย ขอพักก่อนครับ
ประวัติการแก้ไข 2020-06-23 03:53:02 2020-06-23 03:53:21 2020-06-23 03:53:38
Date :
2020-06-23 03:52:42
By :
PhrayaDev
การคำนวณ field ที่เป็น varchar (ข้อมูลต้องเป็นตัวเลขเท่านั้น) ใช้ CAST() แปลงชนิดข้อมูลเป็นตัวเลขก่อน เช่น
Code (MySQL)
SELECT CAST("123456" AS UNSIGNED) TestCastUInt;
https://www.w3schools.com/sql/func_mysql_cast.asp
หรือ ถ้าจะให้ดี เปลี่ยนชนิดของข้อมูลที่ database จาก varchar เป็น int
Date :
2020-06-23 13:03:49
By :
PhrayaDev
ก็เปลี่ยน เป็น double สิครับ มันเป็นเลขทศนิยม
Date :
2020-06-23 14:05:48
By :
Chaidhanan
เลขทศนิยมมี DECIMAL(size, d)
จำนวนตัวเลขหน้าจุด = size - d
จำนวนตัวเลขหลังจุด = d
เช่น
DECIMAL(12, 2) คือ ตัวเลขก่อนและหลังจุดรวมกันต้องไม่เกิน 12 ตัว โดยระบุให้แสดงจุดทศนิยม 2 ตำแหน่ง
สำหรับการ cast เป็น decimal
Code (SQL)
SELECT CAST(fieldOfVarchar AS DECIMAL(12, 2));
เมื่อได้เป็นตัวเลขก็เอาฟังก์ชันทางคณิตศาสตร์ครอบ ก็จะได้ข้อมูลเป็นตัวเลข เช่น
Code (SQL)
SELECT SUM(CAST(fieldOfVarchar AS DECIMAL(12, 2))) sumVarchar;
Code (SQL)
SELECT MAX(CAST(fieldOfVarchar AS DECIMAL(12, 2))) maxVarchar;
พอคุณรู้ concept การทำงานแล้วก็นำไปใช้ในการจริง เช่น
Code (PHP)
$query19="SELECT AVG(CAST(M_A_VA AS DECIMAL(12, 2))) AS 'AVG_A' FROM meter";
$query20="SELECT CAST(M_A_VA AS DECIMAL(12, 2)) AS 'MIN_A', DATETIME ...
ประวัติการแก้ไข 2020-06-23 14:35:16 2020-06-23 14:36:08 2020-06-23 14:40:22
Date :
2020-06-23 14:26:02
By :
PhrayaDev
ถ้าจะ cast ต้อง cast ทั้งหมดครับ ทุกส่วนของ statement ไม่เว้นแม้แต่ WHERE ที่เป็นการคำนวณ หรือเปรียบเทียบทางคณิตฯ
ประวัติการแก้ไข 2020-06-23 15:33:13
Date :
2020-06-23 15:31:52
By :
PhrayaDev
ตรงนี้ด้วยครับ
Code (SQL)
...WHERE CAST(M_A_Vrms AS DECIMAL(12, 2)) = ...
Date :
2020-06-23 15:56:40
By :
PhrayaDev
FROM test1 WHERE M_A_Vrms <> 0
สีแดง ปล่อยไว้ทำไม...ผมบอกว่าทุกส่วน ทุกส่วนคือทุกตัวที่เป็น varchar และต้องการ decimal
Date :
2020-06-23 17:03:56
By :
PhrayaDev
เหมือนเดิมยังไงครับ...ไม่แสดงข้อมูลที่หน้าเว็บ หรือ เหมือนตอนที่ยังไม่ได้ cast
ลองเทส sql จาก $query2 แล้วก็ได้ปกตินะ
ข้อมูลการเทส
Code (SQL)
CREATE TABLE tb
(`M_A_Vrms` varchar(255), `DATETIME` datetime)
;
INSERT INTO tb
(`M_A_Vrms`, `DATETIME`)
VALUES
(12.123, '2020-01-01 10:00:01'),
(11.1567, '2020-01-02 11:00:01'),
(14.65433, '2020-01-03 12:00:01'),
(13.9876, '2020-01-04 13:00:01'),
(8.435261, '2020-01-05 14:00:01')
;
คำสั่งคิวรี
Code (SQL)
SELECT MIN(CAST(M_A_Vrms AS DECIMAL(12, 2))) AS 'MIN_A', DATETIME AS 'DT_MIN_A'
FROM tb
WHERE CAST(M_A_Vrms AS DECIMAL(12, 2)) = (
SELECT MIN(CAST(M_A_Vrms AS DECIMAL(12, 2)))
FROM tb
WHERE CAST(M_A_Vrms AS DECIMAL(12, 2)) <> 0
)
ผลลัพธ์
http://sqlfiddle.com/#!9/0ad4bd/13
Date :
2020-06-23 19:36:53
By :
PhrayaDev
การแสดงหน้าเว็บเป็น output ที่ฝรั่งเรียกว่า Front-end (หรือ หน้าบ้าน)
ฺBack-end (หลังบ้าน) ไม่ใช่ปัญหาแล้ว ...จากการพิสูจน์ใน #15
ถ้าอยากให้ช่วยดูส่วนหน้าบ้าน นำโค้ดส่วนนั้นที่ปรับปรุงล่าสุด มาโพสต์ด้วยครับ
Date :
2020-06-23 20:12:45
By :
PhrayaDev
ONLY_FULL_GROUP_BY มันเปิดอยู่...จัดการปิดมันก่อนครับ
phpmyadmin > localhost > Variables > sql mode > ลบเฉพาะ ONLY_FULL_GROUP_BY ออก > save > ลองคิวรีใหม่
อีกทางเลือกใช้คำสั่ง GROUP BY ห้อยท้ายคำสั่งคิวรี
Date :
2020-06-23 21:52:47
By :
PhrayaDev
นึกว่าวันนี้จะได้ย้ายไปดาวอังคารแล้ว
Date :
2020-06-23 23:08:02
By :
PhrayaDev
Load balance : Server 01