晚上好。MySQLi循环查询变量
我目前正在研究一个小型个人项目。它的目的是从后端数据库中检索大量值并将它们存储为变量。然后使用这些变量修改一些HTML5 Canvas对象的外观(在这种情况下,我使用的是弧线)。
请注意,数据库中的值是Text
,因此我的绑定语句引用了这一点。我正在调用的查询(AVG,MIN,MAX)可以很好地处理字段存储数值数据时的值(这仅仅是由于另一个处理添加或更新数据的脚本 - 已经运行了MySQLi
,并使用Text
是我的情况的最佳解决方案)。
现在,我用标准的MySQL查询达到了我想要的效果,但是它的代码很乱,随着数据库的增长,它的性能可能会变得很糟糕。出于这个原因,我想使用循环。我也觉得MySQLi的bind_param
会更好的安全性。该页面不接受任何用户输入,仅用于显示,因此注入不太受关注,但在将来的某个时刻,我会将其扩展为允许用户控制显示的内容。
下面是我的原始MySQL PHP代码示例的示例;
$T0A = mysql_query('SELECT AVG(Temp0) FROM VTempStats'); // Average
$T0B = mysql_query('SELECT MIN(Temp0) FROM VTempStats'); // Bottom/MIN
$T0T = mysql_query('SELECT MAX(Temp0) FROM VTempStats'); // Top/MAX
$T1A = mysql_query('SELECT AVG(Temp1) FROM VTempStats'); // Average
$T1B = mysql_query('SELECT MIN(Temp1) FROM VTempStats'); // Bottom/MIN
$T1T = mysql_query('SELECT MAX(Temp1) FROM VTempStats'); // Top/MAX
$r_T0A = mysql_result($T0A, 0);
$r_T0T = mysql_result($T0T, 0);
$r_T0B = mysql_result($T0B, 0);
$r_T1A = mysql_result($T1A, 0);
$r_T1T = mysql_result($T1T, 0);
$r_T1B = mysql_result($T1B, 0);
if ($r_T0A == "") {$r_T0A = 0;}
if ($r_T1A == "") {$r_T1A = 0;}
if ($r_T0B == "") {$r_T0B = 0;}
if ($r_T1B == "") {$r_T1B = 0;}
if ($r_T0T == "") {$r_T0T = 0;}
if ($r_T1T == "") {$r_T1T = 0;}
这比原来更短的,因为有4×3集的查询(TEMP0,TEMP1,TEMP2,TEMP3,和最小值,最大值,平均为每个)的。请注意,最后的6 if
语句只是为了确保在我的画布脚本尝试使用它们之前将空字段自动设置为0(请参见下文)。要在圆弧上显示该值,我会在我的画布脚本中使用此值(例如);
var endAngle = startAngle + (<?= $r_T0A ?>/36+0.02);
它为我工作,显示什么是我期望的。
现在,在试图清理我的代码并转向循环和MySQLi时,我遇到了问题。对SQL和PHP都很新颖,我可以使用一些帮助。
这是我试过的;
$q_avg = "SELECT AVG(Temp?) FROM VTempStats";
for ($i_avg = 0; $i_avg <= 3; ++$i_avg)
{
if ($s_avg = $mysqli->prepare($q_avg))
{
$s_avg->bind_param('s',$i_avg);
$s_avg->execute();
$s_avg->bind_result($avg);
$s_avg->fetch();
echo $avg;
}
}
注:mysqli
是MySQLi的连接。我已将代码缩减为仅显示AVG
查询循环,但MIN
和MAX
循环几乎完全相同。
很明显,这不起作用,因为它只为每组查询分配一个变量,而不是每个循环的4个变量。
正如你可以想象的,我想要做的是将所有12个值分配给单个变量,以便我可以在我的画布脚本中使用它们。我不完全确定我是如何去解决这个问题的。
我可以通过MySQLi回显单个值,或者我可以通过MySQLi查询数据库以更改或添加数据,但试图创建一个循环来完成我想要的MySQLi(甚至是MySQL),这是我需要的帮助。
你有没有考虑动态生成的查询和使用单个查询,而不是很多疑问?如果没有,我可能会告诉你这是如何完成的。 –
关于这一点:“请注意,最后的6条if语句仅仅确保那些为null的字段自动设置为0 ...”如果将列定义为NOT NULL DEFAULT'0'这样,空列将始终具有可预测的值,并且可以跳过所有if()语句! –
@MichaelBerkowski:这可能是正确的建议! –