こんばんは。
私は現在、小さな個人的なプロジェクトに取り組んでいます。目的は、バックエンドのデータベースから多数の値を取得し、それらを変数として保存することです。これらの変数は、一部の HTML5 Canvas オブジェクトの外観を変更するために使用されます (この場合、アークを使用しています)。
Text
データベースの値は であるため、私の bind ステートメントはそれを参照していることに注意してください。私が呼び出しているクエリ (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、およびそれぞれの最小、最大、平均) があるため、これは元のクエリよりも短くなります。最後の 6 つのif
ステートメントは、キャンバス スクリプトが動作を試みる前に、null のフィールドが自動的に 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 つの変数ではなく、クエリのセットごとに 1 つの変数を割り当てるだけなので、これは機能しません。
ご想像のとおり、私がやりたいことは、12 個の値すべてを個々の変数に割り当てて、キャンバス スクリプトでそれらを操作できるようにすることです。私はこれについてどうやって行くのか完全にはわかりません。
MySQLi を介して個々の値をエコーアウトしたり、データベースにクエリを実行して MySQLi を介してデータを変更または追加したりできますが、MySQLi (または MySQL) で意図したことを実行するループを作成しようとすると、助けが必要になります。