Heim > Datenbank > MySQL-Tutorial > Der Unterschied zwischen MySQL und MySQLi in PHP

Der Unterschied zwischen MySQL und MySQLi in PHP

巴扎黑
Freigeben: 2016-11-23 15:05:39
Original
855 Leute haben es durchsucht

1:
PHP-MySQL ist die originellste Erweiterung für PHP zum Betrieb der MySQL-Datenbank. Das i in PHP-MySQLi steht für Improvement, was relativ erweiterte Funktionen betrifft erhöht die Sicherheit. PDO (PHP Data Object) bietet eine Abstraktionsschicht zum Betreiben der Datenbank. Tatsächlich kann man den Unterschied nicht erkennen, also schauen wir uns einfach das Programm an...
Schauen wir uns zunächst einen Absatz mit PHP-Programm an In MySQL geschriebener Code, dieser Beispieltyp wird weltweit häufig verwendet:
Der Code lautet wie folgt:

mysql_connect($db_host, $db_user, $db_password);
mysql_select_db ($dn_name);
$result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'");
while ($row = mysql_fetch_array($result , MYSQL_ASSOC))
{
echo $row['name'];
}
mysql_free_result($result);
?>

Auf den ersten Blick gibt es das Nichts Falsches, aber tatsächlich steckt etwas Wissen dahinter ...
Diese Methode kann keine Spalte binden. In der vorherigen SQL-Beschreibung ist $location beispielsweise anfällig für SQL-Injection. Später wurden mysql_escape_string() (Hinweis: nach 5.3.0 veraltet) und mysql_real_escape_string() entwickelt, um dieses Problem zu lösen. Die gesamte Erzählung wird jedoch kompliziert und hässlich, und wenn es zu viele Felder gibt, können Sie sich vorstellen, was es wäre sei wie...
Der Code lautet wie folgt:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s ' ",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
mysql_query($query);
?>

Es gibt kein Problem in PHP- MySQLi Weniger Fortschritte: Zusätzlich zur Lösung der oben genannten Probleme durch Bind Column unterstützt es auch Transaktionen und Mehrfachabfragen und bietet außerdem einen objektorientierten Stil (die Schreibmethode des PHP-MySQLi-Beispiels unten) und einen prozeduralen Stil (das PHP-MySQL-Beispiel). oben) Schreibmethode) Zwei Schreibweisen ... und so weiter.
Der Code lautet wie folgt:

$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
$sql = "INSERT INTO „Benutzer“ (ID, Name, Geschlecht, Standort) WERTE (?, ?, ?, ?)“;
$stmt = $mysqli->prepare($sql);
$stmt->bind_param ('dsss ', $source_id, $source_name, $source_gender, $source_location);
$stmt->execute();
$stmt->bind_result($id, $name, $gender, $ location);
while ($stmt->fetch())
{
echo $name ;
}$mysqli->close();
?>

Aber ich habe hier einige Mängel festgestellt, wie zum Beispiel Bind Result, das etwas überflüssig ist, aber tatsächlich nicht Es spielt keine Rolle. Das größte Problem besteht darin, dass es sich nicht um eine Abstraktionsmethode handelt. Wenn also das Backend die Datenbank ändert, beginnt der Schmerz...
Also tauchte PDO auf (Hinweis: Derzeit ist dies für Ubuntu und Debian nicht der Fall Es muss ein direktes Paket installiert werden, die Installation muss jedoch über PECL erfolgen.

Der Code lautet wie folgt:

roga@carlisten-lx:~$ pecl search pdo
================== === ================
Paket stabil/(neueste) lokale
PDO 1.0.3 (stabil) PHP Data Objects Interface.
PDO_4D 0.3 (Beta) PDO-Treiber für 4D-SQL-Datenbank
PDO_DBLIB 1.0 (stabil) FreeTDS/Sybase/MSSQL-Treiber für PDO
PDO_FIREBIRD 0.2 (Beta) Firebird/InterBase 6-Treiber für PDO
PDO_IBM 1.3.2 ( stabil) PDO-Treiber für IBM-Datenbanken
PDO_INFORMIX 1.2.6 (stabil) PDO-Treiber für IBM Informix INFORMIX-Datenbanken
PDO_MYSQL 1.0.2 (stabil) MySQL-Treiber für PDO
PDO_OCI 1.0 (stabil) Oracle Call Interface-Treiber für PDO
PDO_ODBC 1.0.1 (stabil) ODBC v3-Schnittstellentreiber für PDO
PDO_PGSQL 1.0.2 (stabil) PostgreSQL-Treiber für PDO
PDO_SQLITE 1.0.1 (stabil) SQLite v3-Schnittstellentreiber für PDO
pdo_user 0.3 .0 (Beta) Userspace-Treiber für PDO

Nach der Installation über PECL können Sie die Datenbank auf folgende Weise bedienen:
Der Code lautet wie folgt:

< ? php
$dsn = "mysql:host=$db_host;dbname=$db_name";
$dbh = new PDO($dsn, $db_user, $db_password);
$sql = "SELECT ` name `, `location` FROM `users` WHERE `location` = ? , `name` = ?";
$sth = $dbh->prepare($sql);
$sth->execute ( array($location, $name));
$result = $sth->fetch(PDO::FETCH_OBJ);
echo $result->name . $result->location;
$dbh = NULL;
?>

Auf den ersten Blick scheint der PDO-Code nicht kürzer zu sein, was sind also die Vorteile?
1. Wenn PDO eine Verbindung zu einer Datenbank herstellt, verwendet es die Verbindungszeichenfolge, um zu bestimmen, mit welcher Datenbank eine Verbindung hergestellt werden soll.
2. PDO kann PDO::setAttribute verwenden, um die Verbindungseinstellungen, wie z. B. dauerhafte Verbindung, und die Art und Weise zu bestimmen, wie Fehler zurückgegeben werden (Ausnahme, E_WARNING, NULL). Sogar der Fall des zurückgegebenen Feldnamens usw.
2. PDO unterstützt die Funktion „Spalte binden“ Zusätzlich zu den grundlegenden Funktionen „Vorbereiten“ und „Ausführen“ können Sie auch eine einzelne Spalte binden und den Spaltentyp angeben.
4. PDO ist eine Abstraktionsschicht, daher ist der Aufwand im Vergleich dazu minimal, wenn Sie das Speichermedium wechseln.
Obwohl es diese Dinge schon lange gibt, sind sie leider immer noch nicht populär genug. Ich denke, das liegt vielleicht daran, dass die Leute es gewohnt sind, Bücher auf dem Markt zu lesen, aber diese Bücher stellen oft nur die einfachsten und traditionellsten Methoden vor. Aus diesem Grund verwenden viele Menschen immer noch MySQL, um eine direkte Verbindung zur Datenbank herzustellen.
Derzeit stelle ich persönlich jedoch immer noch gerne eine Verbindung zur Datenbank über DBI her, beispielsweise ActiveRecord und Propel ORM (Object-Relational Mapping).
Wenn Sie beispielsweise ActiveRecord als Beispiel nehmen und eine solche SQL-Anweisung implementieren möchten...
INSERT INTO `users` (id, name, gender, location) VALUES(1, 'roga', ' male', 'tpe' )
Geschrieben in PDO:
Der Code lautet wie folgt:

$sql = "INSERT INTO `users` (id, name, Geschlecht, Ort) VALUES(? , ?, ?, ?)";
$sth = $dbh->prepare($sql);
$sth->execute(array(1, 'roga' , 'männlich', 'tpe '));
?>

Aber in Bezug auf ActiveRecord ist es:
Der Code lautet wie folgt:

$user = new User ();
$user->id = 1;
$user->name = 'roga';
$user->gender = 'male ';
$user-> ;location = 'tpe';
$user->save();
?>

Letzteres ist viel einfacher in der Syntax und es Reduziert auch die Notwendigkeit einer SQL-Sprachabhängigkeit erheblich! (Bei Fragen zu SQL-Implementierungen in verschiedenen Datenbanken lesen Sie bitte den Abschnitt Vergleich verschiedener SQL-Implementierungen.)
Das Obige ist eine kurze Einführung. Wenn es Auslassungen und Irrtümer gibt, können Sie diese gerne hinzufügen.



MySQL ist eine nicht persistente Verbindungsfunktion und MySQL ist eine permanente Verbindungsfunktion. Das heißt
MySQL öffnet jedes Mal einen Verbindungsprozess, wenn eine Verbindung hergestellt wird, und wenn MySQL mehrmals ausgeführt wird, wird derselbe Verbindungsprozess verwendet, wodurch der Server-Overhead verringert wird
Einige Freunde verwenden neues MySQL('localhost beim Programmieren ' , usenamer', 'password', 'databasename'); meldet immer
Fehler, Schwerwiegender Fehler: Klasse 'mysqli' nicht gefunden in d:...
Ist die mysqli-Klasse nicht in PHP integriert?
Unter Win ist es nicht aktiviert, Sie müssen php.ini ändern und die Datei „;“ entfernen. Unter Linux muss mysqli darin kompiliert werden.
1: Mysqli.dll ermöglicht den Betrieb der Datenbank in einem Objekt oder Prozess und ist zudem sehr einfach zu verwenden. Hier ist ein Vergleich zwischen mehreren gängigen Vorgängen und mysql.dll.
 1: mysql.dll (kann als funktionale Methode verstanden werden):
Der Code lautet wie folgt:

 $conn = mysql_connect('localhost', 'user', 'password') ; // Mit MySQL-Datenbank verbinden
mysql_select_db('data_base'); //Datenbank auswählen

$result = mysql_query('select * from data_base'); //Hier gibt es einen zweiten optionalen Parameter Geben Sie die offene Verbindung an
 $row = mysql_fetch_row($result)) //Der Einfachheit halber wird hier nur eine Datenzeile verwendet
 echo $row[0] //Gib den Wert des ersten Feldes aus

Mysqli hat auch Die prozedurale Methode verwendet am Anfang nur das MySQLi-Präfix, und alles andere ist fast gleich. Wenn mysqli prozedural arbeitet, müssen einige Funktionen Ressourcen angeben, z. B. mysqli_query (Ressourcenkennung, SQL-Anweisung), und der Parameter der Ressourcenkennung wird vorangestellt, während der Parameter von mysql_query (SQL-Anweisung, „optional“) Die Ressourcenkennung wird am Ende platziert und muss nicht angegeben werden. Standardmäßig wird die zuletzt geöffnete Verbindung oder Ressource verwendet.
 2mysqli.dll (Objektmodus):
Der Code lautet wie folgt:

 $conn = new mysqli('localhost', 'user', 'password','data_base');
 / /Die Verbindung hier ist neu und der letzte Parameter besteht darin, die Datenbank direkt anzugeben, mysql_select_db() ist nicht erforderlich
 //Sie können sie auch beim Erstellen nicht angeben, dann $conn -> data_base')
 $ result = $conn -> query( 'select * from data_base' );
$row = $fetch_row(); //Eine Zeile mit Daten abrufen
echo row[0]; //Die erste Zeile ausgeben Der Wert eines Feldes

Zwei: mysql_fetch_row(), mysql_fetch_array()
Diese beiden Funktionen geben ein Array zurück. Der Unterschied besteht darin, dass das Array von zurückgegeben wird Die erste Funktion enthält nur Werte. Wir können nur $row[0],
$row[1] zum Lesen von Daten mithilfe von Array-Indizes verwenden, und das von mysql_fetch_array() zurückgegebene Array enthält sowohl den ersten Typ als auch den Schlüsselwert
Paarform. Wir können die Daten wie folgt lesen (wenn die Datenbankfelder Benutzername, Passwort sind):
$row['username'], $row['passwd']
Darüber hinaus, wenn Wenn Sie ($row as $kay => $value) verwenden, können Sie auch direkt den Feldnamen der Datenbank erhalten.
Wichtiger ist, dass mysqli eine neue Funktionsbibliothek ist, die von PHP5 (i) bereitgestellt wird und eine schnellere Ausführungsgeschwindigkeit darstellt

Verwandte Etiketten:
php
Quelle:php.cn
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