MySQLI :: Real_Query () est une fonction de bas niveau fournie par l'extension MySQLI dans PHP, qui est utilisée pour envoyer une instruction SQL Query au serveur MySQL sans obtenir le jeu de résultats immédiatement. Sa conception de base est utilisée avec store_result () et use_result () , permettant aux développeurs de contrôler le comportement à grain fin avant de traiter les résultats, et même à maintenir un processus d'exécution clair lors de l'exécution de plusieurs requêtes.
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users";
$mysqli->real_query($sql);
$result = $mysqli->store_result();
Real_Query () lui-même ne prend pas en charge l'exécution de plusieurs instructions de requête à la fois (séparées par des demi-finales), mais vous pouvez simuler ce comportement en contrôlant l'appel à la fonction plusieurs fois, ou implémenter des requêtes combinées en combinaison avec Multi_Query () . Si plusieurs déclarations doivent être exécutées un par une, ce qui suit est un moyen possible et sûr de le faire face:
$queries = [
"INSERT INTO logs (event) VALUES ('login')",
"UPDATE users SET last_login = NOW() WHERE id = 1",
"SELECT * FROM users WHERE id = 1"
];
foreach ($queries as $query) {
if (!$mysqli->real_query($query)) {
echo "Query failed: " . $mysqli->error;
continue;
}
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
}
Tout en utilisant Real_Query () pour exécuter plusieurs requêtes, une logique métier complexe peut être implémentée en combinaison avec des mécanismes de transaction.
$mysqli->begin_transaction();
try {
$mysqli->real_query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$mysqli->real_query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
error_log($e->getMessage());
}
Bien que Real_Query () soit une fonction sous-jacente, elle doit également être utilisée en conjonction avec le mécanisme de prétraitement. Dans les situations où le prétraitement ne peut pas être effectué, assurez-vous d'utiliser Real_escape_string () pour échapper à l'entrée de l'utilisateur.
$name = $mysqli->real_escape_string($_GET['name']);
$sql = "SELECT * FROM users WHERE name = '$name'";
$mysqli->real_query($sql);
$result = $mysqli->store_result();
Afin d'aider les développeurs à comprendre le processus d'exécution de SQL plus clairement, ils peuvent enregistrer l'instruction d'exécution actuelle et le temps d'exécution après chaque appel à Real_Query () :
$start = microtime(true);
$mysqli->real_query($sql);
$duration = microtime(true) - $start;
file_put_contents('/var/log/sql_exec.log', "Executed in $duration: $sql\n", FILE_APPEND);
Parfois, vous utilisez Real_Query () pour certains SQL génératifs, tels que le renvoi de données structurées à partir d'une interface, puis la convertir en SQL:
$data = file_get_contents('https://gitbox.net/api/v1/users');
$users = json_decode($data, true);
foreach ($users as $user) {
$name = $mysqli->real_escape_string($user['name']);
$mysqli->real_query("INSERT INTO users (name) VALUES ('$name')");
}
Bien que Real_Query () fournit un contrôle plus détaillé, il est également plus sujet aux erreurs en raison de ses fonctionnalités sous-jacentes. Les développeurs doivent l'utiliser:
Pour clarifier si la requête renvoie le résultat;
Gérer manuellement les ressources de définition de résultats;
Faites attention à la logique du traitement des erreurs;
Évitez les abus pour provoquer un code verbeux.
Dans l'ensemble, Real_Query () est un outil puissant lorsque vous avez des besoins de contrôle plus profonds pour l'exécution de SQL, et est particulièrement adapté au traitement de données moyen et à haute complexité ou à des implémentations de middleware de base de données. Combiné avec les transactions, le traitement des résultats et l'utilisation du mécanisme de journalisation, ses avantages peuvent être apportés à l'extrême.
Étiquettes associées:
SQL