Requête en boucle MySQLi vers les variables

Bon soir tout le monde.

Je travaille actuellement sur un petit projet personnel. Son but est de récupérer de nombreuses valeurs à partir d'une database sur mon backend et de les stocker en tant que variables. Ces variables sont ensuite utilisées pour modifier l'apparence de certains objects HTML5 Canvas (dans ce cas, j'utilise des arcs).

Notez que les valeurs dans la database sont Text et donc mes instructions bind se réfèrent à cela. Les requêtes que j'appelle (AVG, MIN, MAX) fonctionnent bien avec les valeurs que j'ai obtenues lorsque les champs stockent des données numériques (ceci est simplement dû à un autre script qui traite de l'ajout ou de la mise à jour des données – qui exécute déjà MySQLi , et l'utilisation de Text était la meilleure solution pour ma situation).

Maintenant, j'ai réalisé ce que je voulais avec les requêtes MySQL standard, mais c'est un code désordonné et la performance de celui-ci pourrait s'avérer terrible à mesure que la database augmente. Pour cette raison, je veux utiliser des loops. Je pense également que bind_param de MySQLi serait beaucoup mieux pour la security. La page n'accepte aucune input de l'user, c'est simplement pour l'affichage et donc l'injection est less préoccupante, mais à un moment donné, je chercherai à l'étendre pour permettre aux users de contrôler ce qui s'affiche.

Voici un exemple de mon exemple de code PHP MySQL original;

 $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;} 

C'est plus court que l'original, car il y a 4×3 sets de requêtes (Temp0, Temp1, Temp2, Temp3 et min, max, moyenne pour chaque). Notez que les 6 dernières instructions if sont simplement là pour s'assurer que les champs nuls sont automatiquement définis sur 0 avant que mon script de canvas ne tente de travailler avec eux (voir ci-dessous).

Pour montrer cette valeur sur l'arc, j'utiliserais ceci dans mon script de canvas (par exemple);

 var endAngle = startAngle + (<?= $r_T0A ?> / 36+0.02); 

Cela a fonctionné pour moi, et ce qui a été affiché était exactement ce à quoi je m'attendais.

Maintenant, en essayant de nettoyer mon code et de passer à une boucle et MySQLi, j'ai des problèmes. Étant très nouveau à la fois SQL et PHP, je pourrais utiliser une assistance.

C'est ce que j'ai essayé;

 $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; } } 

Remarque: mysqli est la connection MySQLi. J'ai coupé le code pour ne montrer que la boucle de requête AVG , mais les loops MIN et MAX sont presque identiques.

Évidemment, cela ne fonctionnera pas car il ne s'agit que d'atsortingbuer une variable à chaque set de requêtes, au lieu de 4 variables pour chaque boucle.

Comme vous pouvez l'imaginer, ce que je veux faire est d'assigner les 12 valeurs aux variables individuelles afin que je puisse travailler avec elles dans mon script de canvas. Je ne suis pas tout à fait sûr de la façon dont je vais aborder cela.

Je peux faire écho à des valeurs individuelles via MySQLi, ou je peux interroger la database pour modifier ou append des données via MySQLi, mais j'essaie de faire une boucle qui fait ce que j'ai l'intention avec MySQLi (ou même MySQL), c'est quelque chose dont j'ai besoin d'aide.

À partir de ma lecture de votre code, vous avez un nombre fixe de colonnes et connaissez leur nom, et vous appliquez les agrégats AVG(), MIN(), MAX() au même tableau sur le même groupe agrégé, sans clause WHERE appliqué. Par conséquent, ils peuvent tous être effectués dans une requête à partir de laquelle vous devez simplement récupérer une seule ligne.

 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 

Cela peut se faire en un seul appel à $mysqli->query() , et aucune binding de paramètre n'est nécessaire pour ne pas avoir besoin des frais généraux de prepare() . Un appel à fetch_assoc() est nécessaire pour récupérer une seule ligne, avec des colonnes alias comme a0, min0, max0, etc... comme je l'ai fait plus haut.

 // 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']); 

Ceux-ci peuvent être tirés dans la scope globale avec extract() , mais je recommand contre cela. Les garder dans leur tableau $values rend leur source plus explicite.

Comme vous pouvez l'imaginer, ce que je veux faire est d'assigner les 12 valeurs aux variables individuelles afin que je puisse travailler avec elles dans mon script de canvas. Je ne suis pas tout à fait sûr de la façon dont je vais aborder cela.

Compris. Voici ce que je ferais.

 <?php // RAY_temp_scottprichard.php error_reporting(E_ALL); echo '<pre>'; // RANGE OF TEMPS $time = range(0,3); // RANGE OF VALUES $funcs = array ( 'A' => 'AVG' , 'B' => 'MIN' , 'T' => 'MAX' ) ; // CONSTRUCT THE QUERY STRING $query = 'SELECT '; foreach ($time as $t) { foreach ($funcs as $key => $func) { $query .= PHP_EOL . $func . '(Temp' . $t . ') AS ' . 'T' . $t . $key . ', ' ; } } // DECLOP THE UNWANTED TRAILING COMMA $query = rsortingm($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); 

Voir la string de requête de sortie ici: http://www.laprbass.com/RAY_temp_scottpritchard.php

Lorsque vous exécutez cette requête, vous récupérerez une ligne avec * mysql_fetch_assoc () * ou équivalent, et il aura toutes les variables que vous voulez dans cette ligne, avec des keys nommées. Ensuite, vous pouvez utiliser quelque chose comme ceci pour injecter les noms et les valeurs des variables dans votre script. http://php.net/manual/en/function.extract.php

L'extrait PHP () permet l'utilisation d'un préfixe, donc vous devriez pouvoir éviter d'apporter trop de modifications à votre script existant.

HTH, ~ Ray