2

こんばんは。

私は現在、小さな個人的なプロジェクトに取り組んでいます。目的は、バックエンドのデータベースから多数の値を取得し、それらを変数として保存することです。これらの変数は、一部の 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クエリ ループのみを表示するようにコードを切り詰めましたが、ループMINMAXループはほぼ同じです。

明らかに、ループごとに 4 つの変数ではなく、クエリのセットごとに 1 つの変数を割り当てるだけなので、これは機能しません。

ご想像のとおり、私がやりたいことは、12 個の値すべてを個々の変数に割り当てて、キャンバス スクリプトでそれらを操作できるようにすることです。私はこれについてどうやって行くのか完全にはわかりません。

MySQLi を介して個々の値をエコーアウトしたり、データベースにクエリを実行して MySQLi を介してデータを変更または追加したりできますが、MySQLi (または MySQL) で意図したことを実行するループを作成しようとすると、助けが必要になります。

4

2 に答える 2

1

あなたのコードを読んだところ、固定数の列があり、それらの名前を知っていて、句を適用AVG(), MIN(), MAX()せずに、同じ集計グループの同じテーブルに集計を適用しています。WHEREしたがって、それらはすべて1 つのクエリで実行でき、そこから 1 つの行をフェッチするだけで済みます。

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

これは への 1 回の呼び出しで実行でき$mysqli->query()、パラメータ バインディングは必要ないため、 のオーバーヘッドは必要ありませんprepare()fetch_assoc()上記で行ったようにエイリアス化された列を使用して、1 つの行を取得するにはを 1 回呼び出す必要があります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配列に保持すると、ソースがより明確になります。

于 2012-12-23T16:53:25.210 に答える
1

ご想像のとおり、私がやりたいことは、12 個の値すべてを個々の変数に割り当てて、キャンバス スクリプトでそれらを操作できるようにすることです。私はこれについてどうやって行くのか完全にはわかりません。

了解した。これが私がすることです。

<?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()* または同等のものを使用して 1 つの行をフェッチし、名前付きキーを使用してその行に必要なすべての変数を取得します。次に、このようなものを使用して、変数名と値をスクリプトに挿入できます。 http://php.net/manual/en/function.extract.php

PHP の extract() ではプレフィックスを使用できるため、既存のスクリプトに多くの変更を加える必要がなくなります。

HTH、〜レイ

于 2012-12-23T16:58:54.817 に答える