Lorsque vous utilisez des extensions MySQLI pour PHP, les développeurs doivent souvent interagir avec les bases de données. MySQLI fournit une variété de fonctions pour exécuter des requêtes SQL, où MySQLI_STMT :: STORE_RESULT est une fonction importante pour récupérer les ensembles de résultats de requête. Cet article analysera en détail les scénarios d'utilisation, les nécessités et lorsque MySQLI_STMT :: STORE_RESULT doit être appelé.
Dans MySQLI, après avoir exécuté des requêtes SQL, les résultats peuvent être obtenus via l'objet MySQLI_STMT . Plus précisément, une fois la requête exécutée, les résultats sont stockés dans la mémoire du serveur. Par défaut, MySQLI utilise la mise en mémoire tampon côté client pour stocker les résultats de la requête. Cependant, cette approche convient aux requêtes simples qui ne demandent qu'une seule fois les résultats. Si vous devez accéder aux données à plusieurs reprises ou lorsque vous travaillez avec des ensembles de données plus importants, MySQLI fournit la méthode Store_Result pour mettre explicitement en cache le jeu de résultats sur la mémoire du client.
mysqli_stmt :: store_result est une fonction fournie par mysqli pour cache les résultats de requête exécutés du serveur au client. Cela signifie qu'après avoir appelé cette fonction, les développeurs peuvent lire les résultats ligne par ligne sans s'appuyer sur le mécanisme du curseur du serveur, mais peuvent fonctionner localement et ne plus être restreint par le serveur.
Après avoir appelé Store_Result , toutes les lignes de résultat seront stockées en mémoire et les développeurs peuvent accéder, traiter et traverser les résultats de la requête plusieurs fois.
Dans les scénarios suivants, appeler mysqli_stmt :: store_result est nécessaire:
Lorsque vous exécutez une requête et que vous devez accéder plusieurs fois à l'ensemble de résultats, l'utilisation de Store_Result est essentielle. Sans appeler Store_Result , vous comptez sur le serveur pour obtenir une ligne de données par ligne chaque fois que vous accédez à l'ensemble de résultats, ce qui affectera l'efficacité, en particulier lors du traitement de grandes quantités de données.
Par exemple, lorsque les résultats de la requête doivent être traités plusieurs fois dans une boucle, appeler Store_Result garantit que toutes les données ont été chargées en mémoire et sont accessibles plusieurs fois.
<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 FROM users"</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">store_result</span></span><span>(); </span><span><span class="hljs-comment">// Doit appeler store_result</span></span><span>
</span><span><span class="hljs-comment">// Maintenant un accès multiple à l'ensemble de résultats</span></span><span>
</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-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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: <span class="hljs-subst">$id</span></span></span><span>, Name: </span><span><span class="hljs-subst">$name</span></span><span>\n";
}
</span></span>Lorsqu'une requête renvoie plusieurs lignes ou colonnes, l'utilisation de Store_Result garantit que toutes les données ont été mises en cache et peuvent être traitées efficacement localement. Si Store_Result n'est pas appelé, les données ne peuvent être obtenues que ligne par ligne et le processus de traitement devient lent et complexe.
Lorsque vous utilisez la clause limite ou décalage pour la pagination de la requête, l'appel Store_Result stockera toutes les lignes de résultat en mémoire. De cette façon, même si vous devez effectuer plusieurs opérations sur la requête (comme l'affichage de pagination), l'ensemble de résultats peut être facilement accessible et traité.
<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 FROM users LIMIT 10 OFFSET 20"</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">store_result</span></span><span>();
</span></span>Dans certains cas, si l'ensemble de résultats de requête est très important, le serveur de base de données peut stocker certaines des données dans un fichier temporaire au lieu de tout charger en mémoire. En appelant Store_Result, vous vous assurez que tous les résultats sont chargés dans la mémoire, évitant ainsi les restrictions de cache côté serveur.
MySQLI utilise le mécanisme du curseur par défaut pour obtenir des résultats de requête ROW par ligne. Si Store_Result n'est pas appelé et que les connexions de requête sont fermées pendant le processus de traversée de l'ensemble de résultats, une perte de données peut se produire. Par conséquent, l'appel Store_Result est une étape clé pour s'assurer que les résultats de la requête sont terminés et que les données ne sont pas perdues.
Certaines configurations MySQL (telles que la désactivation de la mise en mémoire tampon du client) peuvent affecter le traitement des résultats de requête par défaut. Dans ce cas, l'appel Store_Result garantit la compatibilité et la portabilité du code, en évitant le comportement de requête incohérent en raison de différentes configurations de serveur.
Bien que Store_Result soit importante, il n'est pas nécessaire de s'appeler chaque requête. Si vous exécutez une requête une seule fois et que vous devez lire une ligne ou un petit nombre de résultats, vous pouvez complètement ignorer cette étape. Par exemple, si vous exécutez une requête sélectionnée et que vous vous concentrez uniquement sur les résultats unique renvoyés, ou obtenez une ligne de données par ligne via bind_result et fetch , vous n'avez pas à appeler Store_result .
<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 name FROM users WHERE id = ?"</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">"i"</span></span><span>, </span><span><span class="hljs-variable">$user_id</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_result</span></span><span>(</span><span><span class="hljs-variable">$name</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-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$name</span></span><span>;
</span></span>Dans ce cas, MySQLI traite automatiquement l'ensemble de résultats sans appeler manuellement Store_Result .
L'appel Store_Result chargera tous les résultats dans la mémoire du client à la fois, donc pour les grands ensembles de données, cela peut conduire à une consommation de mémoire plus élevée. Si votre requête renvoie une très grande quantité de données, l'utilisation de Store_Result peut entraîner une dégradation des performances ou même un débordement de mémoire. Dans ce cas, il est recommandé d'utiliser le streaming pour récupérer des données (telles que MySQLI_STMT :: bind_result et récupérer ) au lieu de cache l'ensemble de résultats.
mysqli_stmt :: store_result est une fonction très utile dans l'extension mysqli, principalement utilisée pour mettre en cache les résultats de la requête du serveur au client. Il joue un rôle crucial dans des scénarios tels que l'accès multiple aux résultats de la requête, y compris plusieurs lignes ou colonnes, et les requêtes paginées. Néanmoins, les développeurs doivent décider de l'appeler en fonction de la situation réelle, car pour les ensembles de données plus petits ou les requêtes uniques, MySQLI traitera automatiquement l'ensemble de résultats, et appeler Store_Result n'est pas toujours nécessaire. Comprendre quand utiliser cette fonction et son impact sur les performances aide à rédiger un code d'accès à la base de données efficace et maintenable.
Étiquettes associées:
mysqli_stmt