<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Cette partie du contenu n'a rien à voir avec le sujet de l'article</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Bienvenue à monPHPNotes d'étude!\n"</span></span><span>;
</span><span><span class="hljs-variable">$today</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"La date d'aujourd'hui est: <span class="hljs-subst">$today</span></span></span><span>\n";
</span></span>
L'optimisation des performances est souvent négligée lors de l'utilisation de PHP pour les opérations de base de données, en particulier lorsque vous utilisez des extensions MySQLI pour les instructions préparées. Cet article présentera comment combiner mysqli_stmt :: $ field_count et mysqli_stmt :: bind_result pour améliorer l'efficacité de la requête tout en garantissant la maintenabilité et la sécurité du code.
La propriété $ field_count est utilisée pour renvoyer le nombre de champs dans l'ensemble de résultats de prétraitement actuel. Cette propriété est très utile pour les scénarios où les requêtes SQL sont générées dynamiquement ou où des champs indéfinis sont nécessaires. Utilisez-le pour lier dynamiquement la variable de résultat sans connaître le nom de champ à l'avance.
Exemple:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, email FROM users WHERE status = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$status</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// Obtenez le nombre de champs</span></span><span>
</span><span><span class="hljs-variable">$fieldCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>->field_count;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Il y a un total de cette requête <span class="hljs-subst">$fieldCount</span></span></span><span> Champs。";
</span></span>
Avec $ field_count , nous pouvons traiter dynamiquement l'ensemble de résultats sans connaître le nom du champ, améliorant ainsi l'universalité du code.
Normalement, nous lierons manuellement chaque champ à l'aide de bind_result :
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_result</span></span><span>(</span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>);
</span></span>
Si le nombre de champs est important ou si les champs peuvent changer, cette méthode est inefficace et sujette aux erreurs. Combiné avec $ field_count , nous pouvons implémenter la liaison dynamique:
<span><span><span class="hljs-comment">// Obtenez les métadonnées du résultat</span></span><span>
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">result_metadata</span></span><span>();
</span><span><span class="hljs-variable">$fields</span></span><span> = [];
</span><span><span class="hljs-variable">$bindVars</span></span><span> = [];
</span><span><span class="hljs-comment">// Générer dynamiquement des variables en fonction du nombre de champs</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$field</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_field</span></span><span>()) {
</span><span><span class="hljs-variable">$fields</span></span><span>[] = </span><span><span class="hljs-variable">$field</span></span><span>->name;
</span><span><span class="hljs-variable">$bindVars</span></span><span>[] = &${</span><span><span class="hljs-variable">$field</span></span><span>->name}; </span><span><span class="hljs-comment">// Faites attention aux citations</span></span><span>
}
</span><span><span class="hljs-comment">// Résultats de liaison dynamique</span></span><span>
</span><span><span class="hljs-title function_ invoke__">call_user_func_array</span></span><span>([</span><span><span class="hljs-variable">$stmt</span></span><span>, </span><span><span class="hljs-string">'bind_result'</span></span><span>], </span><span><span class="hljs-variable">$bindVars</span></span><span>);
</span><span><span class="hljs-comment">// Obtenir des données</span></span><span>
</span><span><span class="hljs-variable">$results</span></span><span> = [];
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>()) {
</span><span><span class="hljs-variable">$row</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$field</span></span><span>) {
</span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-variable">$field</span></span><span>] = ${</span><span><span class="hljs-variable">$field</span></span><span>};
}
</span><span><span class="hljs-variable">$results</span></span><span>[] = </span><span><span class="hljs-variable">$row</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$results</span></span><span>);
</span></span>
De cette façon, peu importe le nombre de champs que la requête renvoie, les résultats peuvent être stockés efficacement dans le tableau, en évitant la modification manuelle du code de liaison et en améliorant la maintenance et les performances.
Réduisez le code en double : il n'est pas nécessaire d'écrire manuellement bind_result pour chaque requête, en particulier adapté aux scénarios où les champs changent fréquemment.
Améliorez l'efficacité : évitez l'utilisation répétée des tableaux associatifs et fetch_assoc () et obtenez directement des données via des variables de liaison.
Très universel : il peut être utilisé pour générer dynamiquement des requêtes SQL, ou pour obtenir automatiquement des noms de champ à partir de tables de base de données.
Lorsque vous utilisez une liaison dynamique, vous devez faire attention aux références de variables ( & ), sinon la valeur ne peut pas être obtenue correctement.
Pour les grandes requêtes de données, Bind_result enregistrera plus de mémoire que fetch_assoc , car il lie directement les données aux variables au lieu de générer un tableau complet.
Si vous interrogez seulement un petit nombre de champs, Bind_result manuel n'aura pas de différences de performance évidentes, mais la liaison dynamique aura des avantages évidents dans les scénarios où les champs sont incertains ou les changements de requête fréquemment.
Combinant mysqli_stmt :: $ field_count et mysqli_stmt :: bind_result peut réaliser des solutions de requête de déclaration de prétraitement efficaces, générales et maintenables. Il réduit non seulement la quantité de code, mais améliore également les performances du volume de données important et des scénarios de requête dynamique. C'est une compétence qui mérite d'être maîtrisée dans le développement de PHP.