Heim > Backend-Entwicklung > PHP-Problem > Was sind die grundlegenden Operationen von MySQL in PHP?

Was sind die grundlegenden Operationen von MySQL in PHP?

醉折花枝作酒筹
Freigeben: 2023-03-10 21:12:02
nach vorne
2221 Leute haben es durchsucht

Die Erweiterung von MySQLi ist funktionaler als die von PDO, daher werden wir während des Lernprozesses immer noch verschiedene interessante Methoden und Funktionen in MySQLi einstreuen. Der heutige Protagonist ist jedoch die Ausführung von SQL-Anweisungen und die Ausführung mehrerer SQL-Anweisungen in MySQLi.

Was sind die grundlegenden Operationen von MySQL in PHP?

Verbinden und Auswählen der Datenbank

Zuerst ein kleiner Lerninhaltsaustausch, immer noch eine Verbindung zur Datenbank, aber dieses Mal verwenden wir eine andere Art der Verbindung.

$mysqli = new mysqli();
$mysqli->real_connect("localhost", "root", "", "blog_test");

var_dump($mysqli); 
// ["thread_id"]=>
// int(163)

$mysqli->real_connect("localhost", "root2", "123", "blog_test");
var_dump($mysqli);
// ["thread_id"]=>
// int(164)
Nach dem Login kopieren

Zuerst instanziieren wir ein MySQLi-Objekt. Während des Instanziierungsprozesses haben wir keine Parameter an den MySQLi-Konstruktor übergeben, sondern die Methode real_connect() verwendet, um die Datenbankserverinformationen zu übergeben und die Verbindung herzustellen.

Ich glaube, viele Freunde können anhand des Codes erkennen, dass wir real_connect() verwenden, um verschiedene Datenbankverbindungen in einer MySQL-Instanz zu wechseln. Durch Drucken des Inhalts des MySQLI-Objekts können wir sehen, dass die Thread-IDs der beiden Verbindungen unterschiedlich sind, das heißt, es handelt sich um zwei verschiedene Verbindungen, sie verwenden jedoch das oben initialisierte MySQLI-Objekt.

Die Verbindung kann umgeschaltet werden. Was ist also mit der Datenbank, mit der wir eine Verbindung herstellen möchten? Natürlich ist auch ein einfacher Wechsel möglich.

$mysqli->select_db('mysql');
Nach dem Login kopieren

Es ist eine so einfache Methode select_db(), die uns dabei helfen kann, die verbundene Datenbank während der Codeausführung dynamisch zu ändern.

SQL-Anweisungen ausführen

Wenn es sich bei PDO um eine Abfrageanweisung handelt, müssen wir die Methode query() verwenden. Wenn es sich um andere Anweisungen wie Hinzufügen, Löschen und Ändern handelt, müssen wir exec() verwenden. . Durch diese beiden Methoden führt jede Methode jeweils unterschiedliche SQL-Anweisungen aus. Aber in MySQLi können wir nur die Methode query() verwenden.

$mysqli->query("insert into zyblog_test_user(username, password, salt) values('3a', '3a', '3a')");
var_dump($mysqli->affected_rows);
var_dump($mysqli->insert_id);

$mysqli->query("update zyblog_test_user set password='3aa' where username='3a'");
var_dump($mysqli->affected_rows);

$mysqli->query("delete from zyblog_test_user where id = 60");
var_dump($mysqli->affected_rows);

$res = $mysqli->query("select * from zyblog_test_user where username='3a'");
print_r($res);
// mysqli_result Object
// (
//     [current_field] => 0
//     [field_count] => 4
//     [lengths] =>
//     [num_rows] => 3
//     [type] => 0
// )

print_r($res->fetch_assoc());
// Array
// (
//     [id] => 61
//     [username] => 3a
//     [password] => 3aa
//     [salt] => 3a
// )

while ($row = $res->fetch_assoc()) {
    print_r($row);
}
// Array
// (
//     [id] => 62
//     [username] => 3a
//     [password] => 3aa
//     [salt] => 3a
// )
// Array
// (
//     [id] => 63
//     [username] => 3a
//     [password] => 3aa
//     [salt] => 3a
// )
// ……
Nach dem Login kopieren

Bei Anweisungen wie „add“, „delete“ und „modify“ gibt die Methode query() nur einen booleschen Wert zurück, d. h. ob die Anweisung erfolgreich ausgeführt wurde. Beachten Sie, dass die Anzahl der betroffenen Zeilen nicht zurückgegeben wird. Dies ist wichtig zu beachten. Wenn wir die Anzahl der betroffenen Zeilen ermitteln müssen, müssen wir das MySQLi-Attribut Affect_rows verwenden. Bei Einfügeanweisungen wird das Attribut insert_id verwendet, um die zuletzt eingefügte Daten-ID abzurufen.

Wenn eine SELECT-Anweisung ausgeführt wird, gibt query() ein mysqli_result-Objekt zurück, das den aus einer Datenbankabfrage erhaltenen Ergebnissatz darstellt. Den Inhalt dieses Objekts werden wir in einem späteren Artikel ausführlich erläutern.

Mehrere SQL-Anweisungen ausführen

Die Möglichkeit, mehrere SQL-Anweisungen auszuführen, ist mit PDO nicht möglich. Es heißt jedoch, dass PDO dies unterstützt und die Anweisungen normal ausgeführt werden können, wir können jedoch nicht das vollständige Rückgabeergebnis erhalten.

$sql = "insert into zyblog_test_user(username, password, salt) values('3bb', '3bb', '3bb');"
        . "update zyblog_test_user set password='3aa' where username='3a';"
        . "select * from zyblog_test_user where username='3b';"
        . "select now()";

$pdo = new PDO("mysql:dns=locahost;dbname=blog_test", 'root', '', [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
$res = $pdo->exec($sql);
var_dump($res); // int(1)
$stmt = $pdo->query($sql);
foreach ($stmt as $row) { //PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000]: General error in
    var_dump($row);
}
Nach dem Login kopieren

Wie Sie dem Code entnehmen können, wird bei Verwendung der exec()-Methode das Ergebnis der INSERT-Anweisung zurückgegeben. Wenn Sie die Methode query() verwenden, wird das PDOStatement-Objekt zwar zurückgegeben, es kann jedoch nicht durchlaufen werden.

Als nächstes werfen wir einen Blick darauf, wie MySQLi diese SQL-Anweisung ausführt, die aus mehreren zusammengefügten Anweisungen besteht.

$mysqli->multi_query($sql);
$i = 1;
do{
    echo '第' . $i . '条:', PHP_EOL;
    $i++;
    $result = $mysqli->use_result();
    var_dump($result);
    var_dump($mysqli->affected_rows);
    if(is_object($result)){
        var_dump($result->fetch_assoc());
    }
    var_dump($mysqli->next_result());
    echo '========', PHP_EOL;
} while($mysqli->more_results() );
// 第1条:
// bool(false)
// int(1)
// ========
// 第2条:
// bool(false)
// int(0)
// ========
// 第3条:
// object(mysqli_result)#2 (5) {
//   ["current_field"]=>
//   int(0)
//   ["field_count"]=>
//   int(4)
//   ["lengths"]=>
//   NULL
//   ["num_rows"]=>
//   int(0)
//   ["type"]=>
//   int(1)
// }
// int(-1)
// array(4) {
//   ["id"]=>
//   string(2) "67"
//   ["username"]=>
//   string(2) "3b"
//   ["password"]=>
//   string(2) "3b"
//   ["salt"]=>
//   string(2) "3b"
// }
// ========
// 第4条:
// bool(false)
// int(0)
// ========
Nach dem Login kopieren

multi_query() ist die von MySQLi bereitgestellte Methode zum Ausführen mehrerer SQL-Anweisungen. Nach der Ausführung ist das zurückgegebene Ergebnis ein boolescher Wert. Wenn bei der ersten Anweisung ein Problem auftritt, wird FALSE zurückgegeben. Wenn die nachfolgende Anweisung falsch ist, müssen wir next_result() aufrufen, um die Fehlerinformationen der nachfolgenden Anweisung zu erhalten.

Tatsächlich führt dies auch zur Rolle unserer next_result()-Methode. Dies entspricht der Vorbereitung auf den Vorgang zum Erhalten des nächsten Ergebnisses und kann auch als Bewegen des Cursors zur nächsten SQL-Anweisung angesehen werden. Die Methode more_results() dient dazu, festzustellen, ob weitere Anweisungen vorhanden sind, die nicht ausgeführt wurden.

use_result

Im obigen Testcode wird die Methode use_result() verwendet, um das Ausführungsergebnis jeder Anweisung zu erhalten. Seine Funktion besteht darin, den Abruf der Ergebnismenge zu initiieren. Mit anderen Worten: Wenn mutli_query() aufgerufen wird, werden diese Anweisungen nicht sofort ausgeführt, sondern die aktuelle Anweisung wird ausgeführt, wenn use_result() aufgerufen wird. Wir haben festgestellt, dass die von INSERT- und UPDATE-Anweisungen zurückgegebenen Ergebnisse FALSE sind. Und num_rows in der SELECT-Anweisung ist ebenfalls 0. Dies ist seine Besonderheit: Es speichert die Ergebnismengeninformationen nicht direkt im Speicher des Programms. Daher besteht der größte Vorteil der Methode use_result() darin, dass sie wenig Speicher beansprucht und sich zum Durchlaufen einer großen Anzahl von Abfragen eignet. Der Nachteil besteht darin, dass sie jedes Mal zur Abfrage in die Datenbank gehen muss, was langsam ist.

store_result

Zusätzlich zu use_result() gibt es auch eine store_result()-Methode, die uns helfen kann, die Ergebnismenge der Abfrage zu erhalten. Sie ist das Gegenteil der Methode use_result(), d. h. sie speichert die Ergebnismenge im Speicher, nachdem sie direkt ausgeführt wurde.

$mysqli = new mysqli("localhost", "root", "", "blog_test");

$mysqli->multi_query($sql);
$i = 1;
do{
    echo '第' . $i . '条:', PHP_EOL;
    $i++;
    $result = $mysqli->store_result();
    var_dump($result);
    var_dump($mysqli->affected_rows);
    if(is_object($result)){
        var_dump($result->fetch_assoc());
    }
    var_dump($mysqli->next_result());
    echo '========', PHP_EOL;
}
while($mysqli->more_results() );
// 第1条:
// bool(false)
// int(1)
// ========
// 第2条:
// bool(false)
// int(0)
// ========
// 第3条:
// object(mysqli_result)#1 (5) {
//   ["current_field"]=>
//   int(0)
//   ["field_count"]=>
//   int(4)
//   ["lengths"]=>
//   NULL
//   ["num_rows"]=>
//   int(7)
//   ["type"]=>
//   int(0)
// }
// int(7)
// array(4) {
//   ["id"]=>
//   string(2) "67"
//   ["username"]=>
//   string(2) "3b"
//   ["password"]=>
//   string(2) "3b"
//   ["salt"]=>
//   string(2) "3b"
// }
// ========
// 第4条:
// object(mysqli_result)#3 (5) {
//   ["current_field"]=>
//   int(0)
//   ["field_count"]=>
//   int(1)
//   ["lengths"]=>
//   NULL
//   ["num_rows"]=>
//   int(1)
//   ["type"]=>
//   int(0)
// }
// int(1)
// array(1) {
//   ["now()"]=>
//   string(19) "2020-09-14 10:31:37"
// }
Nach dem Login kopieren

Num_rows im Abfrageergebnis enthält nicht nur Daten, sondern die letzte SELECT now();-Anweisung wird auch erfolgreich zurückgegeben. Es ähnelt dem Ergebnis unserer täglichen Verwendung von query().

Zu beachten ist außerdem, dass Sie einen Blick darauf werfen können, wie wir die Schleifenbedingungen für die Ausführung dieser beiden Methoden zum Erhalten von Ergebnissen schreiben. more_results() und next_result() haben unterschiedliche Möglichkeiten, diese beiden Ergebnismengen zu erhalten. Sie können es selbst testen.

总结

光说不练假把式,虽说多语句执行看似很美好,但即使在这简单的测试代码中,也会出现各种问题,大家一定要自己多尝试一下。在日常的开发过程中,最好还是一条一条的语句来执行,避免出现各种无法查明的问题而影响我们正常的业务执行。至于到底要不要使用这个能力,还是大家仁者见仁智者见智了。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/6.PHP中的MySQLi扩展学习(三)mysqli的基本操作.php
Nach dem Login kopieren

推荐学习:php视频教程

Das obige ist der detaillierte Inhalt vonWas sind die grundlegenden Operationen von MySQL in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage