Pdoone. Es ist ein einfacher Wrapper für die PDO -Bibliothek von PHP, die mit SQL Server (2008 R2 oder höher), MySQL (5,7 oder höher) und Oracle (12,1 oder höher) kompatibel ist.
Diese Bibliothek versucht so schnell wie möglich zu arbeiten . Die meisten Operationen sind einfache String/Array -Managements und arbeiten im bloßen Metall der PDO -Bibliothek, ermöglicht jedoch auch eine ORM mithilfe der Erweiterung EFTEC/PDOOneOrM.
Drehen Sie das
$ stmt = $ pdo -> prepare ( " SELECT * FROM myTable WHERE name = ? " );
$ stmt -> bindParam ( 1 , $ _POST [ ' name ' ], PDO :: PARAM_STR );
$ stmt -> execute ();
$ result = $ stmt -> get_result ();
$ products =[];
while ( $ row = $ result -> fetch_assoc ()) {
$ product []= $ row ;
}
$ stmt -> close ();in das
$ products = $ pdoOne
-> select ( " * " )
-> from ( " myTable " )
-> where ( " name = ? " ,[ $ _POST [ ' name ' ]])
-> toList ();oder Verwenden der ORM (mit der EFTEC/PDOoneORMORM -Bibliothek)
ProductRepo // this class was generated with echo $pdoOne()->generateCodeClass(['Product']); or using the cli.
:: where ( " name = ? " ,[ $ _POST [ ' name ' ]])
:: toList ();| BeispielePleticketPhp | Beispiel Cupcakes | Beispielsuche | Beispiel unterschiedliche Methode |
|---|---|---|---|
![]() | ![]() | ![]() |
Weitere Beispiele:
Beispiel MySQL PHP und PDO mit PDOONE
Diese Bibliothek erfordert Php 7.1 und höher und benötigt die Erweiterung PDO und die Erweiterung PDO-MYSQL (MySQL), PDO-SQLSRV (SQL Server) oder PDO-OCI (Oracle)
Bearbeiten Sie Composer.json die nächste Anforderung und aktualisieren Sie den Komponisten.
{
"require" : {
"eftec/PdoOne" : " ^4.0.1 "
}
}oder installieren Sie es über CLI verwenden
Der Komponist benötigt EFTEC/PDOONE
Laden Sie einfach den Ordner LIB aus der Bibliothek herunter und geben Sie Ihr Ordnerprojekt ein. Dann müssen Sie alle darauf enthaltenen Dateien einfügen.
Erstellen Sie eine Instanz der Klasse Pdoone wie folgt. Anschließend können Sie die Verbindung mithilfe der Methode Connect () oder öffnen () öffnen.
use eftec PdoOne ;
// mysql
$ dao = new PdoOne ( " mysql " , " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// sql server 10.0.0.1instance or (local)instance or machinenameinstance or machine (default instance)
$ dao = new PdoOne ( " sqlsrv " , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// test (mockup)
$ dao = new PdoOne ( " test " , " anyy " , " any " , " any " , " any " , "" );
$ dao -> connect ();
// oci (oracle) ez-connect. Remember that you must have installed Oracle Instant client and added to the path.
$ cs = ' (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = instancia1))) ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// oci (oracle) tsnnames (the environment variables TNS_ADMIN and PATH must be correctly configured), also tnsnames.ora must exists.
$ cs = ' instancia1 ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();Wo
$ dao = new pdoone ("mySQL", "127.0.0.1", "root", "abc.123", "sakila", "");
Oracle ist schwierig zu installieren. In Windows müssen Sie aus dem Ordner des Bin des Oracle -Starts alle DLL in den Ordner PHP und Apache kopieren.
Mit der Methode RunRawQuery () können wir einen Befehl direkt mit oder ohne Parameter in PDO ausführen. Und es könnte eine Pdostatement oder ein Array zurückgeben. Es ist nützlich, wenn wir Geschwindigkeit wollen.
RunRawQuery ($ Rawsql, $ param, $ returnArray, $ fetchMode, $ fetchargument)
String $ RAWSQL Die Abfrage zum Ausführen von Array | null $ param [type1, value1, type2, value2] oder [name1 => value, name2 = value2] bool $ returnArray Wenn True (Standard) dann wird ein Array zurückgegeben. Wenn Falsch ist, gibt es ein pdostatement int $ fetchMode zurück, der den Modus zum Abrufen angibt. Beispiel: pdo :: fetch_assoc null $ fetchargument Das Argument des FetchMode.
$ sql = ' select * from table where id=1 ' ;
$ pdoStatement = $ pdoOne -> runRawQuery ( $ sql ,[], false ); // [] are the parametersAber wir könnten es ändern, um ein Array zurückzugeben
$ sql = ' select * from table where id=1 ' ;
$ values = $ pdoOne -> runRawQuery ( $ sql ); // [] are the parametersWir könnten auch Parameter übergeben.
$ values = $ con -> runRawQuery ( ' select * from table where id=? ' ,[ 20 ]); // with parameter
$ values = $ con -> runRawQuery ( ' select * from table where id=:name ' ,[ ' name ' => 20 ]); // with named parameter
$ values = $ con -> runRawQuery ( ' select * from table ' ,[]); // without parameter.Beachten Sie, dass diese Bibliothek vorbereitete Aussagen verwendet, sodass sie frei von SQL -Injektion ist (wenn Sie Parameter verwenden)
$ name = " O'hara " ;
$ values = $ con -> runRawQuery ( " select * from table where name=:name " ,[ ' name ' => $ name ]); // it works.✅
$ values = $ con -> runRawQuery ( " select * from table where name=? " ,[ $ name ]); // it works ok.✅
$ values = $ con -> runRawQuery ( " select * from table where name=' $ name ' " ); // it will crash.Mit der Methode RunQuery () konnten wir eine vorbereitete Anweisung in PDO ausführen. Es ist nützlich, wenn wir Argumente an diese weitergeben wollen. RunQuery () erfordert eine PDO -Vorbereitung .
Diese Methode wird nicht empfohlen, es sei denn, Sie arbeiten bereits mit PDO -Anweisungen und möchten nicht alle Ihren Code anpassen.
$ sql = " insert into `product`(name) values(?) " ;
$ stmt = $ pdoOne -> prepare ( $ sql );
$ productName = " Cocacola " ;
$ stmt -> bind_param ( " s " , $ productName ); // s stand for a string. Also i =integer, d = double and b=blob
$ rows = $ pdoOne -> runQuery ( $ stmt );
$ allRows = $ rows -> fetch_all ( PDO :: FETCH_ASSOC );Sie können den Abfragebauer verwenden, um Ihren Befehl zu erstellen. Sie können das Kapitel über Query Builder (DQL) für weitere Informationen überprüfen.
// query builder
$ pdoOne -> set ([ ' name ' => ' cocacola ' ])
-> from ( ' product ' )
-> insert ();Mit der Bibliothek EFTEC pdooneOrorm ermöglicht es, eine [ORM] (#ORM) Ihrer Tabellen zu erstellen. Wenn Sie ein ORM generiert werden, können Sie den nächsten Code verwenden
ProductRepo:: toList ([ ' category ' => ' drink ' ]);Wobei ProductTrepo eine Dienstklasse ist, die mit dem ORM generiert wird.
Standardmäßig führt Pdoone die Abfragen im Modus PDO :: Fetch_assoc aus, indem Sie die Abfragen als:
$ pdo -> setFechMode ( PDO :: FETCH_CLASS , ' stdClass ' )-> runRawQuery ( $ query );
// or you can run as
$ pdo -> runRawQuery ( $ query , null , true , false , null , PDO :: FETCH_CLASS , ' stdClass ' )Pdoone ermöglicht 5 Arten von Daten.
SQL -Format Es ist das Format, wie das Datum in der Datenbank gespeichert wird. Es hängt vom Typ der Datenbank ab. Zum Beispiel könnte MySQL das Format YMD verwenden.
Humanes Format Es ist das Format, wie der Endbenutzer unser Datum aussieht.
ISO -Datumsformat . Es ist das Format, wie der Wert transportiert und serialisiert werden kann.
Zeitstempel : Es zählt die Anzahl der Sekunden nach 1-1-1970
Klasse / PHP -Klasse : Es ist ein DateTime -Objekt.
Es gibt 3 Methoden zum Ausführen einer Transaktion:
| Verfahren | Beschreibung |
|---|---|
| starttransaction () | Es startet eine Transaktion. Abhängig von der Typdatenbank kann sie gestapelt werden oder nicht. |
| begehen() | Eine Transaktion begehen (und schließt) |
| Rollback () | Rollback (und schließt) eine Transaktion |
Beispiel:
try {
$ sql = " insert into `product`(name) values(?) " ;
$ pdoOne -> startTransaction ();
$ result = $ pdoOne -> runRawQuery ( $ sql ,[ ' Fanta ' => $ productName ], false );
$ pdoOne -> commit (); // transaction ok
} catch ( Exception $ e ) {
$ pdoOne -> rollback ( false ); // error, transaction cancelled, the false means that it doesn't throw an exception if we want rollback.
}Gibt true zurück, wenn die Tabelle vorhanden ist (aktuelle Datenbank/Schema)
Gibt die Statistik (als Array) einer Spalte einer Tabelle zurück.
$ stats = $ pdoOne -> statValue ( ' actor ' , ' actor_id ' );| min | Max | avg | Summe | zählen |
|---|---|---|---|---|
| 1 | 205 | 103.0000 | 21115 | 205 |
Gibt alle Spalten einer Tabelle zurück
$ result = $ pdoOne -> columnTable ( ' actor ' );| Colname | COLTYPE | colsize | Colpres | Colscale | Iskey | Identität |
|---|---|---|---|---|---|---|
| Actor_id | Smallint | 5 | 0 | 1 | 1 | |
| First_Name | varchar | 45 | 0 | 0 | ||
| last_name | varchar | 45 | 0 | 0 | ||
| last_update | Zeitstempel | 0 | 0 |
Gibt alle Fremdschlüsse einer Tabelle (Quelltabelle) zurück
Erstellt eine Tabelle mit einer Definition und einem Primärschlüssel.
Hinweis: Sie können einen Code generieren, um eine Tabelle mithilfe einer vorhandenen Tabelle zu erstellen, indem Sie CLI ausführen (Ausgabeklassiker).
PHP pdoone.php -database MySQL -Server 127.0.0.1 -User Root -pwd ABC.123 -db sakila -Input Film -output Classcode
Beispiel: (MySQL)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
],[
" film_id " => " PRIMARY KEY " ,
" title " => " KEY " ,
" language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE " ,
" original_language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE "
]); $ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
], ' film_id ' ); Beispiel (SQLSRV)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " int NOT NULL IDENTITY(1,1) " ,
" title " => " varchar(255) NOT NULL " ,
" description " => " text(2147483647) DEFAULT (NULL) " ,
" release_year " => " varchar(4) " ,
" language_id " => " tinyint NOT NULL " ,
" original_language_id " => " tinyint DEFAULT (NULL) " ,
" rental_duration " => " tinyint NOT NULL DEFAULT ((3)) " ,
" rental_rate " => " decimal(4,2) NOT NULL DEFAULT ((4.99)) " ,
" length " => " smallint DEFAULT (NULL) " ,
" replacement_cost " => " decimal(5,2) NOT NULL DEFAULT ((19.99)) " ,
" rating " => " varchar(10) DEFAULT ('G') " ,
" special_features " => " varchar(255) DEFAULT (NULL) " ,
" last_update " => " datetime NOT NULL DEFAULT (getdate()) "
],[
" language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" original_language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" film_id " => " PRIMARY KEY "
]);Es gibt eine Liste von Tabellen zurück, die nach Abhängigkeit bestellt wurden (ohne abhängiger von mehr abhängiger)
Hinweis : Dieser Vorgang ist nicht narrensicher, da die Tabellen kreisförmige Referenzen haben können.
$ dao = new PdoOne ( ' sqlsrv ' , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " );
$ dao -> open ();
echo " <pre> " ;
var_dump ( $ dao -> tableSorted ( 3 , false , true )); // it returns the tables sortered
var_dump ( $ dao -> tableSorted ( 3 , true , true )); // it returns all the tables that can't be sortered
echo " </pre> " ;Es validiert eine Tabelle, wenn die Tabelle mit der von Werten verbundenen Definition übereinstimmt.
$def=[
"film_id" => "int NOT NULL IDENTITY(1,1)",
"title" => "varchar(255) NOT NULL",
"description" => "text(2147483647) DEFAULT (NULL)",
"release_year" => "varchar(4)",
"language_id" => "tinyint NOT NULL",
"original_language_id" => "tinyint DEFAULT (NULL)",
"rental_duration" => "tinyint NOT NULL DEFAULT ((3))",
"rental_rate" => "decimal(4,2) NOT NULL DEFAULT ((4.99))",
"length" => "smallint DEFAULT (NULL)",
"replacement_cost" => "decimal(5,2) NOT NULL DEFAULT ((19.99))",
"rating" => "varchar(10) DEFAULT ('G')",
"special_features" => "varchar(255) DEFAULT (NULL)",
"last_update" => "datetime NOT NULL DEFAULT (getdate())"
];
$keys=[
"language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"original_language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"film_id" => "PRIMARY KEY"
];
var_dump(PdoOne::validateDefTable(self::getPdoOne(),self::TABLE,$def,$keys));
Es gibt alle fremden Schlüssel eines Tisches zurück.
$ result = $ pdoOne -> foreignKeyTable ( ' actor ' );| kollokal | Tablerem | Colrem |
|---|---|---|
| customer_id | Kunde | customer_id |
| Rental_id | Miete | Rental_id |
| Staff_Id | Personal | Staff_Id |
Sie können auch eine prozedurale Anfrage erstellen.
Beispiel:
$ results = $ pdoOne -> select ( " * " )-> from ( " producttype " )
-> where ( ' name=? ' , [ ' Cocacola ' ])
-> where ( ' idproducttype=? ' , [ 1 ])
-> toList (); Zeigt die zur Rückgabe der Spalten an. Das Argument ist ein SQL -Befehl und ermöglicht daher jedem Vorgang, den die Datenbank unterstützt, einschließlich Funktionen, Konstanten, Operatoren, Alias und so.
$ results = $ pdoOne -> select ( " col1,col2 " ); //...Erzeugt die Abfrage: Wählen Sie Col1, Col2 ....
$ results = $ pdoOne -> select ( " select * from table " ); //->...Generiert die Abfrage: Select * aus Tabelle ....
Generiert eine Abfrage, die eine Wertezahl zurückgibt. Es ist ein Makro der Methode Select ()
$ result = $ pdoOne -> count ( ' from table where condition=1 ' ); // select count(*) from table where c..
$ result = $ pdoOne -> count ()-> from ( ' table ' )-> where ( ' condition=? ' ,[ 1 ]); // select count(*) from table where c..
$ result = $ pdoOne -> count ( ' from table ' , ' col1 ' ); // select count(col1) from table
$ result = $ pdoOne -> count ()-> from ( ' table ' ); // select count(*) from tableGeneriert eine Abfrage, die den Mindestwert einer Spalte zurückgibt. Wenn $ arg leer ist, verwendet es $ SQL für den Namen der Spalte, es handelt sich um ein Makro der Methode Select ()
$ result = $ pdoOne -> min ( ' from table where condition=1 ' , ' col ' ); // select min(col) from table where c..
$ result = $ pdoOne -> min ( ' from table ' , ' col1 ' ); // select min(col1) from table
$ result = $ pdoOne -> min ( '' , ' col1 ' )-> from ( ' table ' ); // select min(col1) from table
$ result = $ pdoOne -> min ( ' col1 ' )-> from ( ' table ' ); // select min(col1) from tableErzeugt eine Abfrage, die den Maximalwert einer Spalte zurückgibt. Wenn $ arg leer ist, verwendet es $ SQL für den Namen der Spalte, es handelt sich um ein Makro der Methode Select ()
$ result = $ pdoOne -> max ( ' from table where condition=1 ' , ' col ' ); // select max(col) from table where c..
$ result = $ pdoOne -> max ( ' from table ' , ' col1 ' ); // select max(col1) from tableGeneriert eine Abfrage, die den Summenwert einer Spalte zurückgibt. Wenn $ arg leer ist, verwendet es $ SQL für den Namen der Spalte, es handelt sich um ein Makro der Methode Select ()
$ result = $ pdoOne -> sum ( ' from table where condition=1 ' , ' col ' ); // select sum(col) from table where c..
$ result = $ pdoOne -> sum ( ' from table ' , ' col1 ' ); // select sum(col1) from tableGeneriert eine Abfrage, die den Durchschnittswert einer Spalte zurückgibt. Wenn $ arg leer ist, verwendet es $ SQL für den Namen der Spalte, es handelt sich um ein Makro der Methode Select ()
$ result = $ pdoOne -> avg ( ' from table where condition=1 ' , ' col ' ); // select avg(col) from table where c..
$ result = $ pdoOne -> avg ( ' from table ' , ' col1 ' ); // select avg(col1) from tableGeneriert einen SELECT -Befehl.
$ results = $ pdoOne -> select ( " col1,col2 " )-> distinct (); //...Erzeugt die Abfrage: Wählen Sie bestimmte Col1, Col2 ....
HINWEIS: -> DISEIST ('eindeutig') Rücksende Wählen Sie eindeutig aus.
Generiert einen "From" SQL -Befehl.
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' ); //...Generiert die Abfrage: Select * aus der Tabelle
$ Tabellen können eine einzelne Tabelle oder eine SQL -Konstruktion sein. Für Examp ist der nächste Befehl gültig:
$ results = $ pdoOne -> select ( " * " )-> from ( ' table t1 inner join t2 on t1.c1=t2.c2 ' ); //...Generiert einen wo befehlenden Befehl.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=1 ' ); //...Das Wohin könnte auf unterschiedliche Weise ausgedrückt werden.
Es ist möglich, das Wo ohne Parameter wie folgt zu schreiben:
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=1 and p2>2.5 or p3 like '%aa%' " ); $ aa = ' aa ' ;
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=? and p2>? or p3 like ? " ,[ 1
, 2.5
, " % $ aa % " ]);Es funktioniert auch
// (if there is only a single argument without a type)
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=? " ,[ 1 ]); // = where("p1=?",[1]);
// (if we don't define to where to put the value)
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1 " ,[ 1 ]); // = where("p1=?",[1]); Es handelt sich um eine Abkürzungsdefinition einer Abfrage unter Verwendung eines assoziativen Arrays, wobei der Schlüssel der Name der Spalte ist und der Wert der Wert ist, der zu vergleichen ist
Es funktioniert nur mit Gleichheit (=) und dem Logikoperator 'und' (der Typ wird automatisch definiert)
// select * from table where p1='1' and p2='2.5' and p3='aa'
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ([ ' p1 ' => 1
, ' p2 ' => 2.5
, ' p3 ' => ' aa ' ]); Außerdem ist es möglich, den Parametertyp anzugeben.
// select * from table where p1=1 and p2='2.5' and p3='aa'
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ([ ' p1 ' =>[ 1 ]
, ' p2 ' =>[ 2.5 ]
, ' p3 ' =>[ ' aa ' ]]); Sie können auch ein assoziatives Array als Argument und benannte Parameter in der Abfrage verwenden
$ results = $ pdoOne -> select ( " * " )-> from ( " table " )
-> where ( ' condition=:p1 and condition2=:p2 ' ,[ ' p1 ' => ' Coca-Cola ' , ' p2 ' => 1 ])
-> toList ();Erzeugt die Abfrage: Wählen Sie * aus der Tabelle aus , wo Condition =? (Coca-Cola) und Condition2 =? (1)
Erzeugt die Abfrage: Wählen Sie * aus der Tabelle aus, wobei p1 = 1
Hinweis: ArrayParameters ist wie folgt ein Array: Typ, Wert.
Wobei der Typ i = Integer ist, d = double, s = String oder B = Blob. Verwenden Sie im Zweifelsfall "S" (siehe Tabelle unten)
Beispiel für ArrayParameter:
[1, 'Hallo', 20,3, 'Welt']
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ 1 ]); //...Generiert die Abfrage: Wählen Sie * aus der Tabelle aus , in der p1 =? (1)
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? and p2=? ' ,[ 1 , ' hello ' ]); //...Erzeugt die Abfrage: Wählen Sie * aus der Tabelle aus , wo p1 =? (1) und p2 =? ('Hallo').
Notiz. Wo könnte verschachtelt werden.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ 1 ])
-> where ( ' p2=? ' ,[ ' hello ' ]); //...Erzeugt die Abfrage: Wählen Sie * aus der Tabelle aus , wo p1 =? (1) und p2 =? ('Hallo').
Sie könnten auch verwenden:
$ results = $ pdoOne -> select ( " * " )-> from ( " table " )
-> where ([ ' p1 ' => ' Coca-Cola ' , ' p2 ' => 1 ])
-> toList ();Erzeugt die Abfrage: Wählen Sie * aus der Tabelle aus , wo p1 =? (Coca-Cola) und P2 =? (1)
Generiert einen Auftragsbefehl.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> order ( ' p1 desc ' ); //...Erzeugt die Abfrage: Wählen Sie * aus Tabelle Order by P1 Desc
Generiert einen Gruppenbefehl.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' ); //...Erzeugt die Abfrage: Select * aus der Tabellengruppe by P1
Generiert einen Befehl.
Hinweis: Es verwendet die gleichen Parameter wie wo ()
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' )
-> having ( ' p1>? ' , array ( 1 )); //...Erzeugt die Abfrage: Wählen Sie * aus der Tabellengruppe durch P1 mit P1>? (1)
Hinweis: Das könnte verschachtelt werden ()-> haben ()
HINWEIS: Es könnte ohne Parameter mit ('col> 10') sein.
Führen Sie die Abfrage aus.
Beachten Sie, ob ReturnArray wahr ist, dann gibt es ein assoziatives Array zurück. Wenn ReturnArray falsch ist, gibt es ein mySQLi_Result zurück
HINWEIS: Es setzt die aktuellen Parameter zurück (z. B. aktuelle Auswahl, von, wo usw.).
Es ist ein Makro von RUNGEN () . Es gibt ein assoziatives Array oder false zurück, wenn die Operation fehlschlägt.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toList (); Es gibt eine Pdostatement aus der aktuellen Abfrage zurück
Hinweis: Wenn Sie die Anweisung schaufeln möchten, können Sie Fetchloop () verwenden.
Beispiel :
$ stmt = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toPdoStatement ();
while ( $ row = $ stmt -> fetch ()) {
// do something
} Es holt eine Anfrage für jede Zeile.
Diese Methode kann verwendet werden, wenn wir nicht alle Informationen gleichzeitig lesen möchten, damit Sie jede Zeile separat lesen und verarbeiten können
Beispiel :
$ this -> select ( ' select id,name from table ' )
-> fetchLoop ( static function ( $ row ) { return ( $ row );}, PDO :: FETCH_ASSOC )Es gibt einen Metacode (Definitionen) jeder Spalte einer Abfrage zurück.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toMeta (); oder
$ results = $ pdoOne -> toMeta ( ' select * from table ' ); Ergebnis:
array(3) {
[0]=>
array(7) {
["native_type"]=>
string(4) "LONG"
["pdo_type"]=>
int(2)
["flags"]=>
array(2) {
[0]=>
string(8) "not_null"
[1]=>
string(11) "primary_key"
}
["table"]=>
string(11) "producttype"
["name"]=>
string(13) "idproducttype"
["len"]=>
int(11)
["precision"]=>
int(0)
}
[1]=>
array(7) {
["native_type"]=>
string(10) "VAR_STRING"
["pdo_type"]=>
int(2)
["flags"]=>
array(0) {
}
["table"]=>
string(11) "producttype"
["name"]=>
string(4) "name"
["len"]=>
int(135)
["precision"]=>
int(0)
}
}
Es ist ein Makro von Rungen. Es gibt ein indiziertes Array aus der ersten Spalte zurück
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toListSimple (); // ['1','2','3','4'] Es gibt ein assoziatives Array zurück, in dem der erste Wert der Schlüssel und der zweite der Wert ist.
Wenn der zweite Wert nicht vorhanden ist, verwendet er den Index als Wert (erster Wert).
$ results = $ pdoOne -> select ( " cod,name " )
-> from ( ' table ' )
-> toListKeyValue (); // ['cod1'=>'name1','cod2'=>'name2'] Es ist ein Makro von Rungen. Es gibt einen MySQLi_Result oder NULL zurück.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toResult (); // Es gibt den ersten Skalar (ein Wert) einer Abfrage zurück. Wenn $ colname null ist, wird die erste Spalte verwendet.
$ count = $ this -> count ( ' from product_category ' )-> firstScalar ();Es ist ein Makro von Rungen. Es gibt die erste Zeile zurück, falls vorhanden, wenn nicht, als assoziatives Array zurückgegeben.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> first (); Es ist ein Makro von Rungen. Es gibt die letzte Zeile zurück (falls vorhanden, wenn nicht, falsch zurück) als assoziatives Array.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> last (); Manchmal ist es effizienter, order () und first () auszuführen, weil last () alle Werte liest.
Es gibt den SQL -Befehl und die Zeichenfolge zurück.
$ sql = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> sqlGen ();
echo $ sql ; // returns select * from table
$ results = $ pdoOne -> toList (); // executes the queryHinweis: Es setzt die Abfrage nicht zurück.
Es gibt vier Möglichkeiten, jeden Befehl auszuführen.
Nehmen wir an, wir möchten eine Ganzzahl in die Spalte COL1 mit dem Wert 20 hinzufügen
Schema und Werte unter Verwendung einer Werteliste : wobei der erste Wert die Spalte ist, der zweite der Werttyp (i = Integer, d = double, s = String, B = Blob) und das zweite Array enthält die Werte.
$ pdoOne -> insert ( " table "
,[ ' col1 ' ]
,[ 20 ]);Schema und Werte in derselben Liste : wobei der erste Wert die Spalte ist, ist der zweite der Werttyp (i = Integer, d = double, s = String, B = Blob) und der dritte ist der Wert.
$ pdoOne -> insert ( " table "
,[ ' col1 ' , 20 ]);Schema und Werte unter Verwendung von zwei assoziativen Arrays :
$ pdoOne -> insert ( " table "
,[ ' col1 ' ]
,[ ' col1 ' => 20 ]);Schema und Werte unter Verwendung eines einzelnen assoziativen Arrays : Der Typ wird automatisch berechnet.
$ pdoOne -> insert ( " table "
,[ ' col1 ' => 20 ]);Generiert einen Befehl Einfügen.
$ pdoOne -> insert ( " producttype "
,[ ' idproducttype ' , ' name ' , ' type ' ]
,[ 1 , ' cocacola ' , 1 ]);Verwenden von verschachtelter Kette (Einzelarray)
$ pdoOne -> from ( " producttype " )
-> set ([ ' idproducttype ' , 0 , ' name ' , ' Pepsi ' , ' type ' , 1 ])
-> insert ();Mit verschachtelten Ketten -Mehrfachsatz
$ pdoOne -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ 101 ])
-> set ( ' name=? ' ,[ ' Pepsi ' ])
-> set ( ' type=? ' ,[ 1 ])
-> insert ();oder (der Typ wird im möglichen automatisch von MySQL definiert)
$ pdoOne -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ 101 ])
-> set ( ' name=? ' , ' Pepsi ' )
-> set ( ' type=? ' , 1 )
-> insert (); $ pdoOne -> insertObject ( ' table ' ,[ ' Id ' => 1 , ' Name ' => ' CocaCola ' ]);Verwenden von verschachtelten Ketten -deklarativen Set
$ pdoOne -> from ( " producttype " )
-> set ( ' (idproducttype,name,type) values (?,?,?) ' ,[ 100 , ' Pepsi ' , 1 ])
-> insert ();Generiert die Abfrage: In ProducType (Idproductype, Name, Typ) Werte (?,?,?) Einfügen .
Generiert einen Befehl Einfügen.
$ pdoOne -> update ( " producttype "
,[ ' name ' , ' type ' ] //set
,[ 6 , ' Captain-Crunch ' , 2 ] //set
,[ ' idproducttype ' ] // where
,[ 6 ]); // where $ pdoOne -> update ( " producttype "
,[ ' name ' => ' Captain-Crunch ' , ' type ' => 2 ] // set
,[ ' idproducttype ' => 6 ]); // where $ pdoOne -> from ( " producttype " )
-> set ( " name=? " ,[ ' Captain-Crunch ' ]) //set
-> set ( " type=? " ,[ 6 ]) //set
-> where ( ' idproducttype=? ' ,[ 6 ]) // where
-> update (); // updateoder
$ pdoOne -> from ( " producttype " )
-> set ( " name=? " , ' Captain-Crunch ' ) //set
-> set ( " type=? " , 6 ) //set
-> where ( ' idproducttype=? ' ,[ 6 ]) // where
-> update (); // updateGeneriert die Abfrage: Aktualisieren Sie ProductType Set
name=?,type=? Woidproducttype=? ....
Generiert einen Befehl Löschen.
$ pdoOne -> delete ( " producttype "
,[ ' idproducttype ' ] // where
,[ 7 ]); // where $ pdoOne -> delete ( " producttype "
,[ ' idproducttype ' => 7 ]); // whereErzeugt die Abfrage: Löschen Sie aus ProductType, wo
idproducttype=? ....
Sie können auch über eine DQL Builder -Kette löschen.
$ pdoOne -> from ( " producttype " )
-> where ( ' idproducttype=? ' ,[ 7 ]) // where
-> delete (); $ pdoOne -> from ( " producttype " )
-> where ([ ' idproducttype ' => 7 ]) // where
-> delete (); Erzeugt die Abfrage: Löschen Sie aus ProductType, wo
idproducttype=? ....
Es ist möglich, das Ergebnis der Abfragen optional zwischenzuspeichern. Die Dauer der Abfrage ist auch in der Abfrage definiert. Wenn das Ergebnis der Abfrage nicht zwischengespeichert wird, wird sie normal berechnet (die Abfrage in der Datenbank ausführen). Um eine eindeutige Abfrage zu identifizieren, generiert das System eine eindeutige ID (UID) mit Sitz in SHA256, die mit Abfrage, Parametern, Methoden und der Art des Betriebs erstellt wurde.
Die Bibliothek führt keinen Cache -Vorgang direkt durch, sondern ermöglicht es, die Ergebnisse mit einer externen Bibliothek zu leiten.
class CacheService implements eftec IPdoOneCache {
public $ cacheData =[];
public $ cacheCounter = 0 ; // for debug
public function getCache ( $ uid , $ family = '' ) {
if ( isset ( $ this -> cacheData [ $ uid ])) {
$ this -> cacheCounter ++;
echo " using cache n" ;
return $ this -> cacheData [ $ uid ];
}
return false ;
}
public function setCache ( $ uid , $ family = '' , $ data = null , $ ttl = null ) {
$ this -> cacheData [ $ uid ]= $ data ;
}
public function invalidateCache ( $ uid = '' , $ family = '' ) {
unset( $ this -> cacheData [ $ uid ]);
}
}
$ cache = new CacheService ();(2) Legt den Cache -Dienst fest
$ pdoOne = new PdoOne ( " mysql " , " 127.0.0.1 " , " travis " , "" , " travisdb " );
$ cache = new CacheService ();
$ $ pdoOne -> setCacheService ( $ cache );(3) Verwenden Sie den Cache wie folgt. Wir müssen die Methode Usecache () in einem Teil der Abfrage hinzufügen.
$ pdoOne -> select ( ' select * from table ' )
-> useCache ()-> toList (); // cache that never expires
$ pdoOne -> select ( ' select * from table ' )
-> useCache ( 1000 )-> toList (); // cache that lasts 1000ms. class CacheService implements eftec IPdoOneCache {
public function getCache ( $ uid , $ family = '' ) {
return apcu_fetch ( $ uid );
}
public function setCache ( $ uid , $ family = '' , $ data = null , $ ttl = null ) {
apcu_store ( $ uid , $ data , $ ttl );
}
public function invalidateCache ( $ uid = '' , $ family = '' ) {
// invalidate cache
apcu_delete ( $ uid );
}
}
$ cache = new CacheService ();Sequenz ist eine Alternative zum Feld auto_numerischer (Identität). Es hat zwei Methoden, um eine Sequenz zu erstellen: Schneeflocke und Sequenz . Es ist eine Alternative, um eine Richtlinie zu erstellen, hauptsächlich, weil es eine Zahl zurückgibt (eine Richtlinie ist normalerweise eine Zeichenfolge, dass es teurer ist, indexieren und zu speichern).
Das Ziel der Sequenz ist es, eine eindeutige Zahl zu erstellen, die sie nie wiederholt.
$ dao -> nodeId = 1 ; // optional
$ dao -> tableSequence = ' snowflake ' ; // optional
$ dao -> createSequence (); // it creates a table (and it could create a store procedure) called snowflake and a function called next_snowflake(). You could create it only once.Es ist möglich, eine neue Sequenz ohne Tabelle zu erstellen. Es ist schnell, aber es könnte Probleme bei Kollisionen haben.
Es stellt eine kollisionsfreie Nummer nur sicher, wenn wir nicht mehr als eine Operation pro 0,0001 Sekunden durchführen. Sie fügt jedoch auch eine Pseudo-Zufallszahl (0-4095 basierend in der Zeit) hinzu, sodass die Kollisionschancen 1/4095 (pro zwei Operationen alle 0,0001 Sekunden) betragen. Es basiert auf der Schneeflockennummer von Twitter. dh. Sie sicher sind Kollisionen, wenn Sie weniger als 1 Million Operationen pro Sekunde ausführen (technisch gesehen: 45 Millionen).
$ pdo-> getSequencePhp ([unvorhersehbar = Falsch]) gibt eine Sequenz zurück, ohne eine Tabelle zu verwenden. Diese Sequenz ist effizienter als $ dao-> GetSequence, verwendet jedoch einen zufälligen Wert, um mit Kollisionen zu versehen.
Wenn hochgeordnet ist, gibt es eine unvorhersehbare Zahl zurück (es dreht einige Ziffern)
$ pdo -> getSequencePHP () // string(19) "3639032938181434317" $ dao -> getSequencePHP ( true ) // string(19) "1739032938181434311" $ pdo ->getSequence() // string(19) "3639032938181434317"
$ pdo -> getSequencePHP () // string(19) "3639032938181434317" $ pdo -> getSequence ( true ) // returns a sequence by flipping some values.
$ pdo -> getSequencePHP ( true ) // string(19) "1739032938181434311" | Feld | Beschreibung | Beispiel |
|---|---|---|
| $ Präfixbase | Wenn wir jeder Tabelle ein Präfix hinzufügen müssen | $ this-> prefixbase = 'example_'; |
| $ internecAchecounter | Der Zähler der Hits des internen Cache. | $ this-> InternalcacheCounter =; |
| $ nodeid | Verwendet durch Sequenz (Schneeflocke). NODEID Es ist die Kennung des Knotens. Es muss zwischen 0..1023 sein | $ this-> nodeId = 3; |
| $ TableSequence | Der Name der Tabellensequenz (Schneeflocke) | $ this-> TableSequence = "TableSeSeq1"; |
| $ masken0 | Wenn wir eine unvorhersehbare Zahl erzeugen wollen (verwendet nach Sequenz) | $ this-> masken0 = [0,1,2,3,4]; |
| $ masken1 | Wenn wir eine unvorhersehbare Zahl erzeugen wollen (verwendet nach Sequenz) | $ this-> masken1 = [4,3,2,1,0]; |
| $ Databasetyp | Die aktuelle Art der Datenbank. Es wird über El Constructor eingestellt | echo $ this-> Databasetyp; |
| $ Server | Die aktuelle Servermaschine | echo $ this-> server; |
| $ Benutzer | Der aktuelle Benutzer | echo $ this-> Benutzer; |
| $ pwd | Das aktuelle Passwort | echo $ this-> pwd; |
| $ db | Die aktuelle Datenbank oder das aktuelle Schema (Oracle ignoriert diesen Wert) | echo $ this-> db; |
| $ charset | So setzen Sie das Standard -Zeichensatz. Es muss über Konstruktor eingestellt werden | echo $ this-> charset; |
| $ isopen | Es ist wahr, wenn die Datenbank ansonsten verbunden ist, ist sie falsch | if ($ this-> isopen) {…}; |
| $ throwonError | Wenn wahr (Standard), dann wirft es einen Fehler aus, wenn ein Fehler auftritt. Wenn falsch, wird die Ausführung fortgesetzt | $ this-> throwonError = false; |
| $ conn1 | Die Instanz von PDO. Sie können es festlegen oder direkt verwenden. | $ this-> conn1-> pdostatement (..); |
| $ transactionopen | Wahr, wenn die Transaktion offen ist | if ($ this-> transactionOpen) {…}; |
| $ readonly | Wenn sich die Datenbank im Les -Modus befindet oder nicht. Wenn wahr, müssen wir vermeiden, in die Datenbank zu schreiben | $ this-> readonly = true; |
| $ logfile | Vollständiger Dateiname der Protokolldatei. Wenn es leer ist, speichert es keine Protokolldatei. Die Protokolldatei ist auf 1 MB begrenzt | $ this-> logfile = "/order/file.log"; |
| $ errortext | Es speichert den letzten Fehler. Läufe und Starttry setzt es zurück | echo $ this-> errortext; |
| $ ishrow | Todo | $ this-> ishrow =; |
| $ loglevel | Es zeigt die aktuelle Protokollebene an. 0 = kein Protokoll (für die Produktion), 3 = volles Protokoll | $ this-> loglevel = 3; |
| $ lastQuery | Letzte Abfrage ausgeführt | echo $ this-> lastQuery; |
| $ lastParam | Die letzten Parameter. Es ist ein assoziatives Array | echo $ this-> lastParam; |
Diese Bibliothek ermöglicht die Verschlüsselung/Entschlüsselung der Informationen.
Um die Verschlüsselung festzulegen, können Sie den nächsten Befehl verwenden:
$ this -> setEncryption ( 12345678 , '' , ' INTEGER ' ); // the type of encryption is integer and it only works with integers. It doesn't use a salt value
$ this -> setEncryption ( ' password ' , ' some-salt ' , ' AES-256-CTR ' ); // the password, the salt and the type of encryption (aes-256-ctr), you can use other methods
$ this -> setEncryption ( ' passwrd ' , '' , ' SIMPLE ' ); // the type of encryption is simple and it only works with primitive values. It doesn't use a salt.Dann können Sie einen Wert mithilfe von Wert verschlüsseln und entschlüsseln
$ encrypted = $ this -> encrypt ( $ original ); // encrypt $original
$ original = $ this -> decrypt ( $ encrypted ); // decrypt $encryptedBeispiel:
$ this -> setEncryption ( ' 12345 ' , ' salt-1234 ' ); // it will use AES-256-CTR, the password and the salt must be secret.
// create user
$ this -> set ([ ' username ' => 1 , ' password ' => $ this -> encrypt ( $ password )])
-> from ( ' user ' )
-> insert ();
// validate user
$ user = $ this -> select ([ ' username ' , ' password ' ])
-> from ( ' user ' )
-> where ([ ' username ' , ' password ' ],[ 1 , $ this -> encrypt ( $ password )])
-> first ();
// $user= if false or null then the user does not exist or the password is incorrect. Sie können die Protokollebene auf 3 festlegen. Die Protokollebene funktioniert, wenn der Vorgang fehlschlägt. Je höher die Protokollebene ist, und dann werden die meisten Informationen angezeigt.
$ pdoOne -> logLevel = 3 ; // the highest for debug.Standardmäßig wirft PdoOne PHP -Fehler aus, aber wir könnten es vermeiden, indem wir das Feld $ throwOnError auf false einstellen.
$ pdoOne -> throwOnError = false ; // it could be used in production. var_dump ( $ pdoOne -> lastQuery ); // it shows the last query
var_dump ( $ pdoOne -> lastParam ); // and it shows the last parameters.Wenn es leer ist, generiert es keine Protokolldatei (mit der PHP -Protokolldatei) nicht)
$ pdoOne -> logFile = true ; PDOOne verfügt über einige Funktionen nur in CLI.

Führen Sie die nächste Zeile aus (im Lib -Ordner)
PHP PDOONECLI.PHP
(oder auf den richtigen Ordner zeigen)
PHP/VAR/Web/Vendor/eftec/lib/pdoonecli
Sie können das Flag "-i" verwenden, um in den interaktiven Modus einzugeben.
Sie können die Registerkartenschlüssel verwenden, um die Werte automatisch zu vervollständigen (falls vorhanden).

Hinweis: Sie können auch die Konfiguration speichern und laden.
Stellen Sie eine Verbindung zu MySQL her und generieren Sie einen CSV aus der Tabelle "Schauspieler"
# # via arguments
php pdoonecli --databasetype mysql --server 127.0.0.1 -u root -p abc.123 --database sakila -in actor -out csv
# # via user input (interactive)
php pdoonecli -i -in actor -out csvSpeichern Sie die Konfiguration in einer Datei
php pdoonecli --databasetype mysql --server 127.0.0.1 -u root -p abc.123 --database sakila --saveconfig myconfigLaden Sie die Konfiguration aus einer Datei
php pdoonecli --loadconfig myconfig -in actor -out csvSie können das Flag "-cli" verwenden, um die Repository-Klassen zu generieren

Die CLI ist interaktiv und ermöglicht das Laden und Speichern der Konfiguration.
Die Funktionalität erzeugt eine reparierte Repository-Klasse.
Sagen wir das nächste Beispiel
MySQL:
PHP pdoOne.php --Database MySQL --Server 127.0.0.1:3306 -Benutzer Root -p abc.123 -db sakila - -Input "Schauspieler" -Output Classcode
SQLSRV:
PHP PDOOne.php --Database SQLSRV --SERVER PCJC SQLEXPRESS --user SA -P ABC.123 -db sakila -Input "Schauspieler" -Output -Klassencode
Es wird eine Verbindung zu der Datenbank MySQL, IP: 127.0.0.1 und Datenbank Sakila hergestellt und die Tabelle "Schauspieler" lautet.
Es wird das nächste Ergebnis zurückgeben
/**
* Generated by PdoOne Version 1.28
* Class ActorRepo
*/
class ActorRepo
{
const TABLE = ' Actor ' ;
const PK = ' actor_id ' ;
/** @var PdoOne */
public static $ pdoOne = null ;
/**
* It creates a new table<br>
* If the table exists then the operation is ignored (and it returns false)
*
* @param array $definition
* @param null $extra
*
* @return array|bool|PDOStatement
* @throws Exception
*/
public static function createTable ( $ definition , $ extra = null ) {
if (! self :: getPdoOne ()-> tableExist ( self :: TABLE )) {
return self :: getPdoOne ()-> createTable ( self :: TABLE , $ definition , self :: PK , $ extra );
}
return false ; // table already exist
}
// .....
}Diese Funktionalität generiert eine neue Repository -Klasse mit den häufigsten Vorgängen
Warum müssen wir eine Klasse generieren? (Anstelle einer Erben) Diese Crud -Klasse ist nur ein Ausgangspunkt. Der Entwickler könnte den Code ändern, neue Methoden hinzufügen, die vorherige Methode ändern und so weiter.
Um die Klasse zu verwenden, könnten wir den nächsten Code schreiben:
// 1) option 1, inject an instance of $pdo
ActorRepo:: setPdoOne ( $ pdoOne ); // it inject the current connect to the database
// 2) option 2.
// If the global variable $pdoOne exists, then it is injected. (unless it is defined by using setPdoOne()
$ pdoOne = new PdoOne ( " mysql " , " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ pdoOne -> connect ();
// 3) option 3
// If the global function pdoOne() exists, then it is used for obtain the instance.
function pdoOne () {
global $ pdo ;
if ( $ pdo === null ) {
$ pdo = new PdoOne ( ' mysql ' , ' 127.0.0.1 ' , ' root ' , ' abc.123 ' , ' sakila ' );
}
return $ pdo ;
}
$ actorActorRepo :: get ( 2 ); // it will read the actor with the pk=2 and it will return as an array.
$ actors = $ actorArray =ActorRepo:: select (); // it returns all the rows.Alternativ können Sie die PHP -Datei automatisch wie folgt generieren:
PHP pdoOne.php -database mysql -server 127.0.0.1:3306 -User -Root -pwd abc.123 -db sakila -input "Schauspieler" -Output Classcode> actorrepo.php
HINWEIS: Der Code fehlen PHP-Tags, Namespace und Verwendung, aber alles andere ist hier.
Es wird eine Abfrage erfordern und einen PHP -Code mit dem formatierten Abfrage zurückgeben.
Beispiel:
PHP pdoone.php -database MySQL -Server 127.0.0.1:3306 -User -Root -pwd abc.123 -db sakila -input "SELECT * From Actor" -Output SelectCode
Es generiert den nächsten Code:
/** @var array $result=array(["actor_id"=>0,"first_name"=>'',"last_name"=>'',"last_update"=>'']) */
$ result = $ pdo
-> select ( " * " )
-> from ( " actor " )
-> toList ();Es generiert ein assoziatives Array (mit Standardwerten), das in der ausgewählten Abfrage oder Tabelle basiert.
PHP pdoone.php -database mysql -server 127.0.0.1:3306 -User -Root -pwd abc.123 -db sakila -input "Select * From Actor" -Output ArrayCode
Es wird zurückkehren:
// ["actor_id"=>0,"first_name"=>'',"last_name"=>'',"last_update"=>'']Es wird das Ergebnis der Abfrage als JSON zurückgeben
PHP pdoone.php -database MySQL -Server 127.0.0.1:3306 -User -Root -pwd ABC.123 -db sakila -input "Select * From Actor" -Output JSON
Es wird zurückkehren:
[{ "actor_id" : " 1 " , "first_name" : " PENELOPE " , "last_name" : " GUINESS " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 2 " , "first_name" : " NICK " , "last_name" : " WAHLBERG " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 3 " , "first_name" : " ED " , "last_name" : " CHASE " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 4 " , "first_name" : " JENNIFER " , "last_name" : " DAVIS " , " last_update " }]Es wird das Ergebnis der Abfrage als JSON zurückgeben
PHP pdoOne.php -database MySQL -Server 127.0.0.1:3306 -User -Root -pwd ABC.123 -db sakila -input "Select * From Actor" -Output CSV
Es wird zurückkehren:
actor_id,first_name,last_name,last_update
1,"PENELOPE","GUINESS","2006-02-15 01:34:33"
2,"NICK","WAHLBERG","2006-02-15 01:34:33"
3,"ED","CHASE","2006-02-15 01:34:33"
4,"JENNIFER","DAVIS","2006-02-15 01:34:33"
Alternativ zur CLI verfügt die Bibliothek über eine Schnittstelle visuell. Es erledigt den gesamten Betrieb der CLI.

Nennen Sie einfach die Methode Render ()
<?php
use eftec PdoOne ;
use mapache_commons Collection ;
include " ../vendor/autoload.php " ;
$ dao = new PdoOne ( " test " , " 127.0.0.1 " , " dummy " , " dummy " , " dummy " ); // we need any connection.
$ dao -> logLevel = 3 ;
$ dao -> render ();Es gibt ein Beispiel in den Ordner Beispielen/testui.php
Die nächsten Befehle werden normalerweise allein ausgeführt (nicht in einer Kette von Methoden)
| Verfahren | Beschreibung | Beispiel |
|---|---|---|
| CreateTable () | Erstellt die Tabelle und die Indizes mithilfe der Definition im Repo | Tabarentrepo :: CreateTable (); |
| CreateForeignkeys () | Erstellen Sie alle Fremdschlüssel des Tisches | Tabraparentrepo :: createForeigneys (); |
| DropTable () | Lassen Sie den Tisch fallen | Tabraparentrepo :: droptable (); |
| kürzen() | Den Tisch abschneiden | Tabarentrepo :: truncate (); |
| validTable () | Überprüfen Sie, ob sich die Tabelle nicht geändert hat | $ OK = tabraparentrepo :: validTable (); |
TablaParentRepo:: createTable ();
TablaParentRepo:: createForeignKeys ();
TablaParentRepo:: dropTable ();
TablaParentRepo:: truncate ();
// We don't have a method to alter a table.
$ ok =TablaParentRepo:: validTable (); // it returns true if the table matches with the definition stored into the clasDie verschachtelten Operatoren sind Methoden, die sich zwischen unserer Methodenkette befinden.
ClassRepo :: op () :: wo () :: finalop () ist ✅
ClassRepo :: op () :: op () :: wo () die Kette offen lassen
Zum Beispiel:
// select *
// from table
// inner join table2 on t1=t2
// where col=:arg
// and col2=:arg2
// group by col
// having col3=:arg3
// order by col
// limit 20,30
$ results = $ pdo -> select ( ' * ' )
-> from ( ' table ' )
-> innerjoin ( ' table2 on t1=t2 ' )
-> where ( ' col=:arg and col2:=arg2 ' ,[ 20 , 30 ])
// it also works with ->where('col=:arg',20)->where('col2'=>30)
// it also works with ->where('col=?',20)->where('col2=?'=>30)
-> group ( ' col ' )
-> having ( ' col3=:arg3 ' , 400 )
-> order ( ' col ' )
-> limit ( ' 20,30 ' )
-> toList (); // end of the chain| Verfahren | Beschreibung | Beispiel |
|---|---|---|
| Wo() | Es fügt der Kette ein Where hinzu | Tabarentrepo :: wo () |
| Befehl() | Es fügt der Kette eine Bestellung hinzu | Tabarentrepo :: Order () |
| Gruppe() | Es fügt der Kette eine Gruppe hinzu | Tabarentrepo :: Group () |
| Limit() | Es begrenzt die Ergebnisse | Tabarentrepo :: limit () |
| Seite() | Es ähnelt der Grenze, verwendet aber Seite | Tabraparentrepo :: page () |
| Innerjoin () | Es fügt der Abfrage eine innere Verbindung hinzu | Tabarentrepo :: Innerjoin () |
| links() | Es fügt eine linke Verbindung zur Abfrage hinzu | Tabarentrepo :: links () |
| Rechts() | Es fügt einen Rechtsanschluss zur Abfrage hinzu | Tabarentrepo :: Right () |
Wir haben unterschiedliche Methoden, um in unserer Datenbank einen DQL -Befehl (Query) zu generieren.
Wenn die Operation fehlschlägt, geben sie ein Falsch zurück und könnten eine Ausnahme auslösen.
Die nächsten Methoden sollten am Ende der Kette liegen. Beispiele:
ClassRepo :: op () :: op () :: tolist () ist ✅
ClassRepo :: op () :: tolist () :: op () löst eine Ausnahme aus
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| tolist () | Gibt eine Reihe von Elementen zurück | $ data = tablenamerepo :: tolist (); // aus tableRepo auswählen $ data = tablenamerepo :: wo ('a1 =?', [$ value]) :: tolist (); // Wählen Sie * aus TableReEpo, wobei a1 = $ value |
| Erste() | Gibt eine einfache Reihe zurück | $ data = tablenamerepo :: First ($ pk); // Wählen Sie * aus TableReEpo, wobei PK = $ PK (es gibt immer 1 oder Nullwerte zurück) $ data = tablenamerepo :: wo ('a1 =?', [$ value]) :: first (); // Es gibt den ersten Wert zurück (oder falsch, wenn nicht gefunden) |
| existieren() | Gibt true zurück, wenn ein Primärschlüssel existiert | $ data = tablenamerepo :: exist ($ pk); // Gibt true zurück, wenn das Objekt existiert. |
| zählen() | Gibt die Anzahl der Zeilen in einer Abfrage zurück | $ data = tablenamerepo :: count ($ Bedingungen); $ data = tablenamerepo :: wo ('a1 =?', [$ value]) :: count (); |
Die nächsten Methoden ermöglichen das Einsetzen, Aktualisieren oder Löschen von Werten in die Datenbank.
| Verfahren | Beschreibung | Beispiel |
|---|---|---|
| einfügen | Es fügt einen Wert in die Datenbank ein. Es könnte eine Identität zurückgeben | $ identity = tabaparentrepo :: Insert ($ obj); |
| aktualisieren | Es aktualisiert einen Wert in die Datenbank. | Tabraparentrepo :: update ($ obj); |
| löschen | Es löscht einen Wert aus der Datenbank. | Tabraparentrepo :: delete ($ obj); |
| DeleteById | Es löscht einen Wert (unter Verwendung der Primärschlüssel als Bedingung) aus der Datenbank. | Tabarentrepo :: DeleteById ($ pk); |
// where obj is an associative array or an object, where the keys are the name of the columns (case sensitive)
$ identity =TablaParentRepo:: insert ( $ obj );
TablaParentRepo:: update ( $ obj );
TablaParentRepo:: delete ( $ obj );
TablaParentRepo:: deleteById (id);Es ist möglich, das Modell zu validieren. Das Modell wird unter Verwendung der Informationen der Datenbank unter Verwendung des Typs der Spalte, der Länge, wenn der Wert NULL ermöglicht und wenn es sich um eine Identität handelt (automatisch), validiert.
$ obj =[ ' IdUser ' => 1 , ' Name ' ='John Doe'];
UserRepo:: validateModel ( $ obj , false ,[ ' _messages ' ]); // returns true if $obj is a valid User.Ein rekursives Array ist ein Array von Zeichenfolgen mit Werten, die gelesen oder erhalten oder verglichen werden können. Zum Beispiel, um eine Tabelle bedingt zu verbinden. PDOOne verwendet es nicht direkt, aber _BasepDoonerepo verwendet es (_basepdoonerepo ist eine Klasse, die verwendet wird, wenn wir eine Repository -Dienstklasse automatisch generieren).
Beispiel
$ this -> select ( ' * ' )-> from ( ' table ' )-> recursive ([ ' table1 ' , ' table1.table2 ' ]);
// some operations that involves recursive
if ( $ this -> hasRecursive ( ' table1 ' )) {
$ this -> innerJoin ( ' table1 on table.c=table1.c ' );
}
if ( $ this -> hasRecursive ( ' table1.table2 ' )) {
$ this -> innerJoin ( ' table1 on table1.c=table2.c ' );
}
$ r = $ this -> toList (); // recursive is resetted. Es setzt ein rekursives Array.
Dieser Wert wird jedes Mal zurückgesetzt, wenn eine Kettenmethode endet.
Es bekommt das rekursive Array.
Es gibt wahr, wenn rekursiv etwas Nadel hat.
Wenn $ this-> rekursiv ['*'] ist, dann kehrt es immer wahr zurück.
$ this -> select ( ' * ' )-> from ( ' table ' )-> recursive ([ ' * ' ]);
$ this -> hasRecursive ( ' anything ' ); // it always returns true. | Bibliothek | Einfügen | findpk | Hydrat | mit | Zeit |
|---|---|---|---|---|---|
| Pdo | 671 | 60 | 278 | 887 | 3,74 |
| Pdoone | 774 | 63 | 292 | 903 | 4,73 |
| WenigerQL | 1413 | 133 | 539 | 825 | 5,984 |
| Yiim | 2260 | 127 | 446 | 1516 | 8.415 |
| Yiimwithcache | 1925 | 122 | 421 | 1547 | 7.854 |
| Yii2m | 4344 | 208 | 632 | 1165 | 11.968 |
| Yii2Marrayhydrat | 4114 | 213 | 531 | 1073 | 11,22 |
| Yii2mscalarhydrat | 4150 | 198 | 421 | 516 | 9.537 |
| Propel20 | 2507 | 123 | 1373 | 1960 | 11.781 |
| Propel20Withcache | 1519 | 68 | 1045 | 1454 | 8,228 |
| Propel20Formatondemand | 1501 | 72 | 994 | 1423 | 8,228 |
| Doktrinem | 2119 | 250 | 1592 | 1258 | 18.139 |
| Doctrinemwithcache | 2084 | 243 | 1634 | 1155 | 17.952 |
| Doctrinemarrayhydrat | 2137 | 240 | 1230 | 877 | 16,83 |
| DoctrinemsCalarhydrat | 2084 | 392 | 1542 | 939 | 18.887 |
| Doctrinemwithoutproxies | 2119 | 252 | 1432 | 1960 | 19.822 |
| Beredt | 3691 | 228 | 708 | 1413 | 12,155 |
Pdoone fügt ein bisschen Ovehead über PDO hinzu, es ist jedoch einfach ein Wrapper zu PDO.
Dies bedeutet, dass Sie pdoone aktualisiert werden und eine vom ORM generierte Klasse verwenden. Diese Klasse muss neu generiert werden.
Kurzgesagt:
Jede Hauptversion bedeutet, dass sie den alten Code brechen könnte. Dh 1.0 -> 2.0
Jede Nebenversion bedeutet, dass sie eine neue Funktionalität hinzufügt, dh 1,5 -> 1.6 (neue Methoden)
Jede Dezimalversion bedeutet, dass sie eine frühere Funktionalität entfaltet/behebt/refactoriert, dh 1.5.0 -> 1.5.1 (Fix)
4.10 2024-09-06
4.9.2 2024-08-20
4.9.1 2024-08-20
4.9 2024-08-02
4.8 2024-07-06
4.7.1 2024-06-07
4.7 2024-06-07
4.6.2 2024-03-02
4.6.1 2024-03-02
4.6 2024-03-02
4.4 2023-12-12
4.3.3 2023-09-05
4.3.2 2023-09-05
4.3.1 2023-09-02
4.3 2023-07-01
4.2 2023-04-07
4.1.2 2023-03-21
4.1.1 2023-03-21
4.1 2023-03-20
4.0.1 2023-03-11
4.00 2023-11-03
3.16 2023-12-02
3.15 2023-02-03
3.14 2023-01-30
3.13 2023-01-26
3.12.2 2022-09-03
3.12.1 2022-08-26
3.12 2022-08-14
3.11.1 2022-07-30
3.11 2022-07-30
3.10 2022-07-30
3.9 2022-07-23
3.8.1 2022-07-23
3.8 2022-07-22
3.7 2022-07-16
3.6 2022-07-07
3.5 2022-07-06
3.3 2022-06-27
3.2 2022-06-27
3.1.6 2022-06-24
3.1.5 2022-06-23
3.1.4 2022-06-21
3.1.3 2022-06-18
3.1.2 2022-06-18
3.1.1 2022-06-17
3.1 2022-06-11
3.0 2022-06-1
2.32 2022-03-20
2.31 2022-03-04
2.30 2022-02-28
2.29 2022-02-20
2.27 2022-02-19
2.26 2022-02-19
2.25 2022-02-01
2.24.1 2022-02-06
2.24 2022-02-06
2.23 2022-02-04
2.22.2 2022-02-01
2.22.1 2022-01-03
2.22 2022-01-30
2.21 2022-01-28
However, it is far from perfect.
2.20 2022-01-04
2.19
2.18
2.16
2.15 2021-07-24
2.14.3 2021-06-15
2.14.2 2021-06-13
2.14.1 2021-06-09
2.14 2021-06-04
_BasePdoOneRepo now works more closely with the class PdoOneQuery , so each query is a different instance.
[fix] PdoOne dateConvertInput() does not crash when the value is not a date.
[fix] PdoOne throwError() does not stack errors but still triggers the last error (if any).
[changes] ❗ PdoOne aggregate functions (sum,min,max,avg) now returns a value instead of generating a query.
$result=$pdo->sum('xxx')->firstScalar(); // before $result=$pdo->sum('xxx'); // Jetzt
[fix] PdoOne generateCodeArray() used for the generation of classes, returns the correct name when it is set.
[changes] _BasePdoOneRepo : reset(),getQuery(),dropTable(),useCache(),limit(),newQuery(),order(),innerjoin(),left() ,right()
[changes] PdoOneQuery : Multiples changes.
2.13.1 2021-05-22
2.13 2021-04-17
2.12 2021-04-17
2.11.1 2021-04-17
2.11 2021-04-17
2.10.3 2021-04-14
2.10.2 2021-04-06
2.10.1 2021-04-05
2.10 2021-04-04
2.9.4 2021-03-22
2.9.3 2021-02-22
2.9.2 2021-02-18
2.9.1 2021-02-16
2.9 2021-02-16
2.8 2021-02-13
2.7.1 2021-01-21
2.7 2021-01-10
2.6.3 2020-10-16
2.6.2 2020-10-09
2.6.1 2020-09-24
2.6 2020-09-17
2.5 2020-09-13
2.4.1 2020-09-13
2.4 2020-09-06
2.3 2020-09-06
2.2.6 2020-09-03
2.2.5 2020-08-30
2.2.3 2020-08-23
2.2.2 2020-08-17
2.2.1 2020-08-16
2.2 2020-08-14
$ this -> setUseInternalCache ( true );
$ rows = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 1 ])-> toList (); // read from the database
// ...
$ rows2 = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 1 ])-> toList (); // read from memory
// ...
$ rows3 = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 2 ])-> toList (); // read from the database because the query is in
// memory but the parameters are different
echo $ this -> internalCacheCounter ; The internal cache is tested with runRawQuery (if returns an array), toList(), meta() and first()
2.0.1 2020-08-12
2.0 2020-08-11
1.55.1 2020-08-05
1.55 2020-8-05
1.54 2020-8-02
1.53 2020-7-27
1.52 2020-7-19
1.51 2020-7-18
1.50 2020-7-04
1.49 2020-6-19
1.48 2020-6-15
1.47 2020-6-14
1.46 2020-6-13
1.45.1 2020-6-11
1.45 2020-6-7
1.44.2 2020-6-3
1.44.1 2020-6-2
1.44 2020-5-31
1.43 2020-5-31
1.42 2020-5-29
1.41.2 2020-5-29
1.41.1 2020-5-28
1.41 2020-5-28
1.40.1 2020-5-27
1.40 2020-05-21
1.39 2020-05-12
1.38 2020-05-10
1.37 2020-05-03
1.36 2020-05-03
1.35.1 2020-04-30
1.35 2020-04-28
1.34.2 2020-04-27
1.34.1 2020-04-27
1.34 2020-04-27
1.33 2020-04-15
1.32.1 BasePdoOneRepo added version 2.0
1.32 2020-04-12
1.31.1 2020-04-11
1.31 2020-04-11
1.30 2020-04-10
1.29 2020-04-10
1.28.1 2020-04-06
1.28 2020-04-06
1.24 2020-03-26
1.23.1 2020-03-10
1.23 2020-03-10
1.22 2020-02-08
1.21 2020-02-07
1.20 2020-jan-25
1.19 2020-jan-15
1.16 2020-jan-14
1.15 2019-dec-29
1.14 2019-dec-26
1.13 2019-dec-26
1.12 2019-oct-20 Added argument (optional) ->toList($pdomodel) Added method ->toListSimple()
1.11 2019-oct-01 1.11 It is still compatible with php 5.6.Added to composer.json
1.10 2019-oct-01 1.10 Added method dateConvert(). Added trace to the throw.
1.9 2019-aug-10 1.8 republished
1.8 2019-aug-10 Added a date format. Methods dateSql2Text() and dateText2Sql()
1.7 2019-jun-23 Added some benchmark. It also solves a problem with the tags. Now: table.field=? is converted to table . field =?
1.6 2019-jun-22 affected_rows() returns a correct value.
1.5 2019-may-31 some cleanups. columnTable() returns if the column is nullable or not.
1.4 2019-may-30 insertobject()
1.3 2019-may-23 New changes
1.2 2019-may-22 New fixed.
1.1 2019-may-21 Some maintenance
1.0 2019-may-21 First version