MySQLI :: real_query () ist eine von der MySQLI- Erweiterung in PHP bereitgestellte Funktion mit niedriger Ebene, mit der eine SQL-Abfrageanweisung an den MySQL-Server gesendet wird, ohne das Ergebnis sofort zu erhalten. Das Kerndesign wird mit Store_Result () und Use_Result () verwendet, sodass Entwickler vor der Verarbeitung der Ergebnisse eine feinkörnige Kontrolle des Verhaltens erhalten und sogar einen klaren Ausführungsprozess beibehalten können, wenn mehrere Abfragen ausgeführt werden.
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users";
$mysqli->real_query($sql);
$result = $mysqli->store_result();
real_query () selbst unterstützt die Ausführung mehrerer Abfrageanweisungen gleichzeitig (durch Semikolons getrennt). Sie können dieses Verhalten jedoch simulieren, indem Sie den Aufruf in die Funktion mehrmals kontrollieren oder Kombinationsabfragen in Kombination mit Multi_query () implementieren. Wenn mehrere Aussagen einzeln ausgeführt werden müssen, ist Folgendes eine praktikable und sichere Möglichkeit, damit umzugehen:
$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();
}
}
Während der Verwendung von Real_query () zur Ausführung mehrerer Abfragen kann eine komplexe Geschäftslogik in Kombination mit Transaktionsmechanismen implementiert werden.
$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());
}
Obwohl real_query () eine zugrunde liegende Funktion ist, sollte sie auch in Verbindung mit dem Vorverarbeitungsmechanismus verwendet werden. Verwenden Sie in Situationen, in denen die Vorverarbeitung nicht durchgeführt werden kann, real_escape_string (), um den Benutzereingaben zu entkommen.
$name = $mysqli->real_escape_string($_GET['name']);
$sql = "SELECT * FROM users WHERE name = '$name'";
$mysqli->real_query($sql);
$result = $mysqli->store_result();
Um Entwicklern zu helfen, den Ausführungsprozess von SQL klarer zu verstehen, können sie nach jedem Aufruf an real_query () die aktuelle Ausführungsanweisung und Ausführungszeit aufzeichnen:
$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);
Manchmal verwenden Sie real_query () für einige generative SQL, z. B. strukturierte Daten von einer Schnittstelle zurückzugeben und sie dann in SQL zu konvertieren:
$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')");
}
Obwohl Real_query () eine detailliertere Kontrolle bietet, ist es aufgrund seiner zugrunde liegenden Funktionen auch anfälliger für Fehler. Entwickler sollten es verwenden:
Um zu verdeutlichen, ob die Abfrage das Ergebnis zurückgibt;
Manuell verwalten Ergebnisressourcen;
Achten Sie auf die Logik der Fehlerbehandlung;
Vermeiden Sie Missbrauch, um den ausführlichen Code zu verursachen.
Insgesamt ist Real_query () ein leistungsstarkes Tool, wenn Sie eine tiefere Steueranforderungen für die SQL-Ausführung haben und besonders für die Datenverarbeitung mit mittlerer und hoher Komplexität oder Datenbank-Middleware-Implementierungen geeignet sind. In Kombination mit Transaktionen, Ergebnisverarbeitung und Protokollierungsmechanismus können seine Vorteile extrem gebracht werden.
Verwandte Tags:
SQL