PHPPDO-Studiennotizen lib.culog.cn 13. November 2007 09:36 Autor: Liu Shui Meng Chun [Groß, Mittel, Klein]
■Was ist PDO?
Die POD-Erweiterung (PHP Data Object) wurde in PHP5 hinzugefügt. In PHP6 wird standardmäßig PDO für die Verbindung zur Datenbank verwendet. Alle Nicht-PDO-Erweiterungen werden aus der Erweiterung in PHP6 entfernt. Diese Erweiterung bietet eine in PHP integrierte Klasse PDO für den Zugriff auf die Datenbank. Verschiedene Datenbanken verwenden denselben Methodennamen, um das Problem inkonsistenter Datenbankverbindungen zu lösen.
Ich habe es für die Entwicklung unter Windows konfiguriert.
Das Ziel von ■PDO besteht darin, eine leichte, klare und praktische API bereitzustellen, die die gemeinsamen Funktionen verschiedener RDBMS-Bibliotheken vereinheitlicht, jedoch erweiterte Funktionen nicht ausschließt. Bietet optional einen höheren Grad an Abstraktion/Kompatibilität über PHP-Skripte.
■Merkmale von PDO:
Leistung. PDO erfuhr von Anfang an von den Erfolgen und Misserfolgen der Skalierung bestehender Datenbanken. Da der Code von PDO brandneu ist, haben wir die Möglichkeit, die Leistung von Grund auf neu zu gestalten, um die neuesten Funktionen von PHP 5 zu nutzen. Fähigkeit. PDO wurde entwickelt, um allgemeine Datenbankfunktionen als Grundlage bereitzustellen und gleichzeitig einen einfachen Zugriff auf die einzigartigen Funktionen eines RDBMS zu ermöglichen. Einfach. PDO wurde entwickelt, um Ihnen die Arbeit mit Datenbanken zu erleichtern. Die API dringt nicht mit Gewalt in Ihren Code ein und macht deutlich, was jeder Funktionsaufruf bewirkt. Zur Laufzeit erweiterbar. Die PDO-Erweiterung ist modular aufgebaut und ermöglicht es Ihnen, Treiber für Ihr Datenbank-Backend zur Laufzeit zu laden, ohne das gesamte PHP-Programm neu kompilieren oder installieren zu müssen. Beispielsweise implementiert die PDO_OCI-Erweiterung die Oracle-Datenbank-API anstelle der PDO-Erweiterung. Es gibt auch Treiber für MySQL, PostgreSQL, ODBC und Firebird, weitere sind in der Entwicklung.
■PDO installieren
Was ich hier habe, ist eine PDO-Erweiterung für die Entwicklung unter WINDOWS. Wenn Sie sie unter Linux installieren und konfigurieren möchten, schauen Sie sich bitte woanders um.
Versionsanforderungen:
Es ist bereits im Programmpaket von php5.1 und späteren Versionen enthalten;
Für php5.0.x müssen Sie es von pecl.php.net herunterladen und in Ihre Erweiterungsbibliothek einfügen, das ist der ext-Ordner des Ordners, in dem sich PHP befindet;
Im Handbuch heißt es, dass Versionen vor 5.0 keine PDO-Erweiterungen ausführen können.
Konfiguration:
Ändern Sie Ihre php.ini-Konfigurationsdatei so, dass sie pdo unterstützt (Wenn Sie php.ini nicht verstehen, stellen Sie zunächst fest, dass Sie die php.ini ändern müssen, die beim Aufruf Ihrer phpinfo()-Funktion angezeigt wird.)
Bündeln
Entfernen Sie das Semikolon vor extension=php_pdo.dll. Das Semikolon ist das Kommentarsymbol der PHP-Konfiguration.
Es gibt noch mehr
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
Die jeder Erweiterung entsprechende Datenbank ist:
TreibernameUnterstützte DatenbankenPDO_DBLIBFreeTDS / Microsoft SQL Server / SybasePDO_FIREBIRDFirebird/Interbase 6PDO_INFORMIXIBM Informix Dynamic ServerPDO_MYSQLMySQL 3.x/4.xPDO_OCIOracle Call InterfacePDO_ODBCODBC v3 (IBM DB2, unixODBC und win32 ODBC)PDO_PGSQLPostgreSQLPDO_SQLITESQLite 3 und SQLite. 2
Welche Datenbank Sie verwenden möchten, geben Sie einfach die entsprechende ein Entfernen Sie einfach das Kommentarsymbol „;“ vor der Erweiterung.
■Verwendung von PDO
Ich gehe davon aus, dass Sie MySQL installiert haben. Wenn nicht, finden Sie bitte zuerst eine Möglichkeit, es zu installieren. Meins ist MySQL5.0.22, und andere, die MySQL 4.0.26 verwenden, können es auch verwenden.
★Datenbankverbindung:
Wir verwenden das folgende Beispiel, um die PDO-Verbindungsdatenbank zu analysieren:
<?php
$dbms='mysql'; //Datenbanktyp Oracle verwendet ODI. Wenn Sie verschiedene Datenbanken verwenden, müssen Sie dies nur ändern und müssen sich nicht so viele Funktionen merken.
$host='localhost';//Datenbank-Hostname
$dbName='test'; //Verwendete Datenbank
$user='root'; //Benutzername der Datenbankverbindung
$pass=''; //Entsprechendes Passwort
$dsn="$dbms:host=$host;dbname=$dbName";
//
versuchen{
$dbh=newPDO($dsn,$user,$pass);//Das Initialisieren eines PDO-Objekts bedeutet das Erstellen des Datenbankverbindungsobjekts $dbh
echo „Verbindung erfolgreich<br/>“;
/*Sie können auch einen Suchvorgang ausführen
foreach($dbh->query('SELECT * from FOO')as$row){
print_r($row);//Sie können echo($GLOBAL); verwenden, um diese Werte anzuzeigen
}
*/
$dbh=null;
}catch(PDOException$e){
die("Fehler!: ".$e->getMessage()."<br/>");
}
//Standardmäßig ist dies keine lange Verbindung zur Datenbank, Sie müssen am Ende einen Parameter hinzufügen: array(PDO::ATTR_PERSISTENT => true).
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>true))
;
★Datenbankabfrage:
Wir haben oben bereits eine Abfrage durchgeführt und können auch die folgende Abfrage verwenden:
<?php
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); //Attribute setzen
$rs=$db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr=$rs->fetchAll();
print_r($result_arr);
?>
Da oben die Methode setAttribute() verwendet wird, werden die beiden Parameter eingegeben, um zu erzwingen, dass der Feldname in Großbuchstaben geschrieben wird.
Im Folgenden sind die Parameter vonPDO
::setAttribute() aufgeführt:
PDO::ATTR_CASE: Erzwingt, dass der Spaltenname ein Format hat, wie unten beschrieben (zweiter Parameter):
PDO::CASE_LOWER: Erzwingt, dass der Spaltenname Kleinbuchstaben ist
: :CASE_NATURAL: Spaltennamen folgen der ursprünglichen Methode
. PDO::CASE_UPPER: Erzwingt, dass Spaltennamen in Großbuchstaben geschrieben werden.
PDO::ATTR_ERRMODE: Fehlermeldung
PDO::ERRMODE_SILENT: Zeigt keine Fehlerinformationen an, nur Fehlercode.
PDO
::ERRMODE_EXCEPTION: Löst eine Ausnahme aus.
PDO::ATTR_ORACLE_NULLS (gültig nicht nur für ORACLE, sondern auch für andere Datenbanken): ) gibt den entsprechenden Wert in PHP für den von der Datenbank zurückgegebenen NULL-Wert an.
PDO::NULL_NATURAL: unverändert.
PDO::NULL_EMPTY_STRING: Leere Zeichenfolge wird in NULL umgewandelt.
PDO::NULL_TO_STRING: NULL wird in eine leere Zeichenfolge umgewandelt.
PDO::ATTR_STRINGIFY_FETCHES: Konvertieren Sie numerische Werte beim Abrufen in Zeichenfolgen. Erfordert bool::
Vom Benutzer bereitgestellte Anweisungsklasse, die nicht mit persistenten PDO-Instanzen verwendet werden kann )) .
PDO::ATTR_AUTOCOMMIT (verfügbar in OCI, Firebird und MySQL): Ob jede einzelne Anweisung automatisch festgeschrieben werden soll.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (verfügbar in MySQL): Gepufferte Abfragen verwenden.
$rs->setFetchMode(PDO::FETCH_ASSOC); im Beispiel ist PDOStatement::setFetchMode() eine Deklaration des Rückgabetyps.
Es gibt folgende:
PDO::FETCH_ASSOC – assoziative Array-Form
PDO::FETCH_NUM – Numerisches Index-Array-Format
PDO::FETCH_BOTH – Beide sind in Array-Form verfügbar, was die Standardeinstellung ist
PDO::FETCH_OBJ – in Form eines Objekts, ähnlich dem vorherigen mysql_fetch_object().
Weitere Rückgabetypdeklarationen (PDOStatement::method-Name) finden Sie im Handbuch.
★Daten einfügen, aktualisieren, löschen,
$db->exec("DELETE FROM `xxxx_menu` where mid=43");
Um die oben genannten Vorgänge kurz zusammenzufassen:
Abfrageoperationen sind hauptsächlich PDO::query(), PDO::exec(), PDO::prepare().
PDO::query() wird hauptsächlich für Operationen verwendet, die aufgezeichnete Ergebnisse zurückgeben, insbesondere für SELECT-Operationen.
PDO::exec() ist hauptsächlich für Operationen gedacht, die keine Ergebnismenge zurückgeben, wie z. B. INSERT, UPDATE, DELETE und andere Operationen. Das zurückgegebene Ergebnis ist die Anzahl der von der aktuellen Operation betroffenen Spalten.
PDO::prepare() ist hauptsächlich eine Vorverarbeitungsoperation. Sie müssen $rs->execute() verwenden, um die SQL-Anweisung in der Vorverarbeitung auszuführen. Sie kann in diesem Artikel nicht einfach erklärt werden . Jeder kann auf Handbücher und andere Dokumentationen zurückgreifen.
Die Hauptoperationen zum Erhalten der Ergebnismenge sind: PDOStatement::fetchColumn(), PDOStatement::fetch(), PDOStatement::fetchALL().
PDOStatement::fetchColumn() ist ein Feld des ersten im Abrufergebnis angegebenen Datensatzes. Der Standardwert ist das erste Feld.
PDOStatement::fetch() wird verwendet, um einen Datensatz abzurufen.
PDOStatement::fetchAll() dient dazu, alle Datensatzsätze in einem zusammenzufassen. Um die Ergebnisse zu erhalten, können Sie den Typ des erforderlichen Ergebnissatzes über PDOStatement::setFetchMode festlegen.
Es gibt auch zwei umgebende Operationen: PDO::lastInsertId() und PDOStatement::rowCount(). PDO::lastInsertId() gibt den letzten Einfügevorgang zurück und der Typ der Primärschlüsselspalte ist die letzte Auto-Inkrement-ID.
PDOStatement::rowCount() wird hauptsächlich für die Ergebnismenge verwendet, die von den DELETE-, INSERT- und UPDATE-Operationen von PDO::query() und PDO::prepare() betroffen ist, und ist für die Methode PDO::exec() ungültig und SELECT-Operationen.
★Transaktionen und automatische Übermittlung
An diesem Punkt haben Sie über PDO eine Verbindung zu MySQL hergestellt. Bevor Sie Abfragen ausgeben, sollten Sie verstehen, wie PDO Transaktionen verwaltet. Wenn Sie noch nie mit Transaktionen in Berührung gekommen sind, müssen Sie zunächst die vier Merkmale von Transaktionen kennen: Atomarität, Konsistenz, Isolation und Haltbarkeit, also ACID. Laienhaft ausgedrückt: Für jede im Rahmen einer Transaktion ausgeführte Arbeit, auch wenn sie in Etappen ausgeführt wird, gibt es eine Garantie dafür, dass die Arbeit sicher in die Datenbank übernommen wird und während der Übermittlung der Arbeit nicht durch Anfragen von anderen Verbindungen beeinträchtigt wird . beeinflussen. Transaktionale Arbeiten können auf Anfrage automatisch rückgängig gemacht werden (vorausgesetzt, Sie haben sie noch nicht festgeschrieben), was die Fehlerbehandlung in Skripten erheblich vereinfacht.
Transaktionen werden in der Regel dadurch umgesetzt, dass eine Reihe von Änderungen gesammelt und gleichzeitig wirksam werden. Dies hat den Vorteil, dass die Effizienz dieser Updates erheblich verbessert werden kann. Mit anderen Worten: Transaktionen können Skripte schneller und möglicherweise robuster machen (obwohl Transaktionen korrekt verwendet werden müssen, um solche Vorteile zu erzielen).
Leider unterstützt nicht jede Datenbank Transaktionen (Mysql5 unterstützt Transaktionen, MySQL4 weiß ich nicht), daher muss PDO beim ersten Öffnen der Verbindung im sogenannten „Auto-Commit“-Modus ausgeführt werden. Der Autocommit-Modus bedeutet, dass, wenn die Datenbank Transaktionen unterstützt, jede von Ihnen ausgeführte Abfrage über eine eigene implizite Transaktion verfügt. Wenn die Datenbank keine Transaktionen unterstützt, verfügt nicht jede Abfrage über eine solche Transaktion. Wenn Sie eine Transaktion benötigen, müssen Sie die Methode PDO::beginTransaction() verwenden, um eine Transaktion zu starten. Wenn der zugrunde liegende Treiber keine Transaktionen unterstützt, wird eine PDOException ausgelöst (unabhängig von den Fehlerbehandlungseinstellungen: Dies ist immer ein schwerwiegender Fehlerzustand). Innerhalb einer Transaktion können Sie PDO::commit() oder PDO::rollBack() verwenden, um die Transaktion zu beenden, abhängig davon, ob der in der Transaktion ausgeführte Code erfolgreich war.
Wenn das Skript endet oder eine Verbindung geschlossen werden soll und eine ausstehende Transaktion vorliegt, setzt PDO die Transaktion automatisch zurück. Dies ist eine Sicherheitsmaßnahme, um Inkonsistenzen zu vermeiden, wenn das Skript abnormal endet. Wenn die Transaktion nicht explizit festgeschrieben wird, wird davon ausgegangen, dass irgendwo eine Inkonsistenz vorliegt, sodass ein Rollback durchgeführt wird, um die Datensicherheit zu gewährleisten.
//Beispiel von http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html
versuchen{
$dbh=neues PDO('odbc:SAMPLE','db2inst1','ibmdb2',
array(PDO_ATTR_PERSISTENT=>true));
echo"Verbundenn";
$dbh->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("In Personal einfügen (id, erster, letzter) Werte (23, 'Joe', 'Bloggs')");
$dbh->exec("in Gehaltsänderung einfügen (ID, Betrag, Änderungsdatum)
Werte (23, 50000, NOW())");
$dbh->commit();
}catch(Ausnahme $e){
$dbh->rollBack();
echo"Fehlgeschlagen: ".$e->getMessage();
}
Nehmen wir im obigen Beispiel an, dass wir eine Reihe von Einträgen für einen neuen Mitarbeiter mit der ID-Nummer 23 erstellen. Neben der Eingabe der Stammdaten der Person müssen wir auch das Gehalt des Mitarbeiters erfassen. Es ist einfach, beide Aktualisierungen separat durchzuführen, aber indem Sie beide Aktualisierungen in die Aufrufe beginTransaction() und commit() einschließen, stellen Sie sicher, dass niemand anderes die Änderungen sehen kann, bis sie abgeschlossen sind. Tritt ein Fehler auf, kann der Catch-Block alle seit dem Start der Transaktion vorgenommenen Änderungen rückgängig machen und eine Fehlermeldung ausgeben.
Aktualisierungen müssen nicht innerhalb einer Transaktion vorgenommen werden. Sie können auch komplexe Abfragen durchführen, um Daten zu extrahieren und anhand dieser Informationen weitere Aktualisierungen und Abfragen zu erstellen. Wenn eine Transaktion aktiv ist, ist gewährleistet, dass andere während der Arbeit keine Änderungen vornehmen können. Eigentlich ist das nicht 100 % richtig, aber es ist eine gute Einführung, wenn Sie noch nie von Transaktionen gehört haben.
★Vorbereitete Anweisungen und gespeicherte Prozeduren Viele ausgereiftere Datenbanken unterstützen das Konzept vorbereiteter Anweisungen. Was sind vorbereitete Aussagen? Sie können sich vorbereitete Anweisungen als eine kompilierte Vorlage der SQL vorstellen, die Sie ausführen möchten, die mithilfe variabler Parameter angepasst werden kann. Vorbereitete Anweisungen bieten zwei große Vorteile:
Die Abfrage muss nur einmal analysiert (oder vorbereitet) werden, kann aber mehrmals mit denselben oder unterschiedlichen Parametern ausgeführt werden. Wenn eine Abfrage bereit ist, analysiert, kompiliert und optimiert die Datenbank den Plan zur Ausführung der Abfrage. Dieser Vorgang dauert bei komplexen Abfragen länger und kann Ihre Anwendung erheblich verlangsamen, wenn Sie dieselbe Abfrage mehrmals mit unterschiedlichen Parametern wiederholen müssen. Durch die Verwendung vorbereiteter Anweisungen können Sie wiederholte Analyse-/Kompilierungs-/Optimierungszyklen vermeiden. Einfach ausgedrückt verbrauchen vorbereitete Anweisungen weniger Ressourcen und werden daher schneller ausgeführt.
Für vorbereitete Anweisungen bereitgestellte Parameter müssen nicht in Anführungszeichen gesetzt werden. Wenn Ihre Anwendung ausschließlich vorbereitete Anweisungen verwendet, können Sie sicher sein, dass keine SQL-Eingriffe auftreten können. (Es besteht jedoch immer noch ein Risiko, wenn Sie andere Teile der Abfrage immer noch auf nicht vertrauenswürdigen Eingaben basieren.)
Vorbereitete Anweisungen sind so nützlich, dass PDO tatsächlich gegen die in Ziel 4 festgelegte Regel verstößt: Wenn der Treiber vorbereitete Anweisungen nicht unterstützt, emuliert PDO vorbereitete Anweisungen.
Beispiel: PDO-Anwendungsbeispiel:
<?php
$
dbms='mysql';//Datenbanktyp Oracle verwendet ODI. Für Entwickler, die unterschiedliche Datenbanken verwenden, müssen Sie sich nicht so viele Funktionen merken
Hostname
$dbName='test';//Verwendete Datenbank
$user='root';//Benutzername der Datenbankverbindung
$pass='';//Entsprechendes Passwort
$dsn="$dbms:host=$host;dbname= $dbName";
classdbextendsPDO{
publicfunction__construct(){
versuchen{
parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']);
}catch(PDOException$e){
die("Fehler: ".$e->__toString()."<br/>");
}
}
publicfinalfunctionquery($sql){
versuchen{
returnparent::query($this->setString($sql));
}catch(PDOException$e){
die("Fehler: ".$e->__toString()."<br/>");
}
}
privatefinalfunctionsetString($sql){
echo „Ich möchte $sql verarbeiten“;
return$sql;
}
}
$db=newdb();
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);
foreach($db->query('SELECT * from xxxx_menu')as$row){
print_r($row);
}
$db->exec('DELETE FROM `xxxx_menu` where mid=43');
?>