大家晚上好。
我目前正在做一个小型的个人项目。它的目的是从我后端的数据库中检索大量值并将它们存储为变量。然后使用这些变量来修改一些 HTML5 Canvas 对象的外观(在这种情况下,我使用的是弧线)。
请注意,数据库中的值是Text
,因此我的绑定语句引用了它。我正在调用的查询(AVG,MIN,MAX)与我获得的值一起工作,因为字段存储数字数据(这仅仅是由于另一个处理添加或更新数据的脚本 - 这已经在运行MySQLi
,并且使用Text
是我情况的最佳解决方案)。
现在,我用标准的 MySQL 查询实现了我想要的,但它的代码很混乱,而且随着数据库的增长,它的性能可能会变得很糟糕。出于这个原因,我想使用循环。我也觉得bind_param
MySQLi 的安全性要好得多。该页面不接受任何用户输入,它仅用于显示,因此注入问题不大,但在将来的某个时候,我将寻求扩展它以允许用户控制显示的内容。
这是我原始 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;}
这比原来的要短,因为有 4x3 组查询(Temp0、Temp1、Temp2、Temp3 和 min、max、avg)。请注意,最后 6if
条语句仅用于确保在我的画布脚本尝试使用它们之前将空字段自动设置为 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
andMAX
循环几乎相同。
显然,这是行不通的,因为它只为每组查询分配一个变量,而不是为每个循环分配 4 个变量。
你可以想象,我想做的是将所有 12 个值分配给各个变量,以便我可以在我的画布脚本中使用它们。我不完全确定我是怎么做的。
我可以通过 MySQLi 回显单个值,或者我可以通过 MySQLi 查询数据库以更改或添加数据,但是尝试创建一个循环来执行我对 MySQLi(甚至 MySQL)的预期,这是我需要帮助的事情。