晚上好。
我目前正在开展一个小型的个人项目。它的目的是从我后端的数据库中检索大量值并将它们存储为变量。然后使用这些变量来修改某些HTML5 Canvas对象的外观(在这种情况下,我使用的是弧形)。
请注意,数据库中的值为Text
,因此我的绑定语句引用了该值。我正在调用的查询(AVG,MIN,MAX)可以正常工作,因为字段存储了数值数据(这只是由于另一个处理添加或更新数据的脚本 - 已经运行{ {1}},使用MySQLi
是我情况的最佳解决方案。)
现在,我用标准的MySQL查询实现了我想要的东西,但它的代码很混乱,随着数据库的增长,它的性能可能会变得非常糟糕。出于这个原因,我想使用循环。我也觉得MySQLi Text
对安全性要好得多。该页面不接受任何用户输入,它仅用于显示,因此注入不是一个问题,但在将来的某个时候,我将寻求扩展它以允许用户控制显示的内容。
以下是我原始MySQL PHP代码示例的示例;
bind_param
这比原来的短,因为有4x3组查询(Temp0,Temp1,Temp2,Temp3和min,max,avg for each)。请注意,最后6个$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;}
语句仅用于确保在我的canvas脚本尝试使用它们之前将null字段自动设置为0(参见下文)。
要在弧上显示该值,我会在我的画布脚本中使用它(例如);
if
它对我有用,所显示的正是我的预期。
现在,在尝试清理我的代码并转到循环和MySQLi时,我遇到了问题。作为SQL和PHP的新手,我可以使用一些帮助。
这是我试过的;
var endAngle = startAngle + (<?= $r_T0A ?> / 36+0.02);
注意: $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
循环几乎相同。
显然,这不会起作用,因为它只为每组查询分配一个变量,而不是为每个循环分配4个变量。
你可以想象,我想要做的是将所有12个值分配给各个变量,以便我可以在canvas脚本中使用它们。我不完全确定我是怎么回事。
我可以通过MySQLi回显单个值,或者我可以查询数据库以通过MySQLi更改或添加数据,但是尝试创建一个循环来执行我想要的MySQLi(甚至是MySQL),这是我需要的帮助用。
答案 0 :(得分:1)
在我阅读您的代码时,您拥有固定数量的列并知道其名称,并且您正在将AVG(), MIN(), MAX()
聚合应用于同一聚合组中的同一个表,而不是WHERE
条款适用。因此,它们都可以在一个查询中完成,您只需从中获取一行。
SELECT
AVG(Temp0) AS a0,
MIN(Temp0) AS min0,
MAX(Temp0) AS max0,
AVG(Temp1) AS a1,
MIN(Temp1) AS min1,
MAX(Temp1) AS max1,
AVG(Temp2) AS a2,
MIN(Temp2) AS min2,
MAX(Temp2) AS max2,
AVG(Temp3) AS a3,
MIN(Temp3) AS min3,
MAX(Temp3) AS max3
FROM VTempStats
这可以通过一次调用$mysqli->query()
来完成,不需要参数绑定,因此您不需要prepare()
的开销。需要调用fetch_assoc()
来检索单行,其中的列别名为a0, min0, max0, etc...
,如上所述。
// Fetch one row
$values = $result_resource->fetch_assoc();
print_r($values);
printf("Avg 0: %s, Min 0: %s, Max 0: %s... etc....", $values['a0'], $values['min0'], $values['max0']);
可以使用extract()
将这些内容拉入全局范围,但我建议不要这样做。将它们保存在$values
数组中可以使它们的来源更加明确。
答案 1 :(得分:1)
您可以想象,我想要做的是将所有12个值分配给单个变量,以便我可以在canvas脚本中使用它们。我不完全确定我是怎么回事。
解读。这就是我要做的。
<?php // RAY_temp_scottprichard.php
error_reporting(E_ALL);
echo '<pre>';
// RANGE OF TEMPS
$temps = range(0,3);
// RANGE OF VALUES
$funcs = array
( 'A' => 'AVG'
, 'B' => 'MIN'
, 'T' => 'MAX'
)
;
// CONSTRUCT THE QUERY STRING
$query = 'SELECT ';
foreach ($temps as $t)
{
foreach ($funcs as $key => $func)
{
$query .= PHP_EOL
. $func
. '(Temp'
. $t
. ') AS '
. 'T'
. $t
. $key
. ', '
;
}
}
// DECLOP THE UNWANTED TRAILING COMMA
$query = rtrim($query, ', ');
// ADD THE TABLE NAME
$query .= ' FROM VTempStats';
// ADD ANY ORDER, LIMIT, WHERE CLAUSES HERE
$query .= ' WHERE 1=1';
// SHOW THE WORK PRODUCT
var_dump($query);
请在此处查看输出查询字符串:http://www.laprbass.com/RAY_temp_scottpritchard.php
运行此查询时,将使用* mysql_fetch_assoc()*或等效项获取一行,并且它将包含您在该行中所需的所有变量以及命名键。然后你可以使用这样的东西将变量名和值注入你的脚本。 http://php.net/manual/en/function.extract.php
PHP extract()允许使用前缀,因此您应该能够避免对现有脚本进行太多更改。
HTH,~Ray