Die russische Dokumentation ist hier
Sie können es als Archiv herunterladen, von dieser Website klonen oder über Composer herunterladen (Link zu packagist.org):
composer require krugozor/database
krugozor/database ? krugozor/database ist eine PHP >= 8.0-Klassenbibliothek für einfaches, bequemes, schnelles und sicheres Arbeiten mit der MySql-Datenbank unter Verwendung der PHP-Erweiterung mysqli.
Die Hauptnachteile aller Bibliotheken für die Arbeit mit der MySQL-Datenbank in PHP sind:
int und float .krugozor/database ist eine Klasse für die Arbeit mit MySqlmysqli und mysqli_result verwenden, um die Methoden zu erstellen, mit denen Sie arbeiten müssen.krugozor/database ?Die meisten Wrapper für verschiedene Datenbanktreiber sind ein Haufen nutzloser Codes mit einer widerlichen Architektur. Ihre Autoren verstehen den praktischen Zweck ihrer Wrapper selbst nicht und verwandeln sie in eine Art Abfrage-Builder (SQL-Builder), ActiveRecord-Bibliotheken und andere ORM-Lösungen.
Die Bibliothek krugozor/database ist keines der oben genannten. Dies ist lediglich ein praktisches Tool für die Arbeit mit regulärem SQL innerhalb des MySQL DBMS-Frameworks – und nicht mehr!
Platzhalter – spezielle typisierte Markierungen , die anstelle expliziter Werte (Abfrageparameter) in die SQL-Abfragezeichenfolge geschrieben werden . Und die Werte selbst werden „später“ als nachfolgende Argumente an die Hauptmethode übergeben, die eine SQL-Abfrage ausführt:
$ result = $ db -> query (
" SELECT * FROM `users` WHERE `name` = '?s' AND `age` = ?i " ,
" d'Artagnan " , 41
); SQL-Abfrageparameter, die über das Platzhaltersystem übergeben werden, werden abhängig von der Art der Platzhalter durch spezielle Escape-Mechanismen verarbeitet. Diese. Sie müssen Variablen nicht mehr in Escape-Funktionen vom Typ mysqli_real_escape_string() einschließen oder sie wie zuvor in einen numerischen Typ umwandeln:
<?php
// Previously, before each request to the DBMS, we did
// something like this (and many people still don't do it):
$ id = ( int ) $ _POST [ ' id ' ];
$ value = mysqli_real_escape_string ( $ mysql , $ _POST [ ' value ' ]);
$ result = mysqli_query ( $ mysql , " SELECT * FROM `t` WHERE `f1` = ' $ value ' AND `f2` = $ id " ); Jetzt ist es einfach geworden, Abfragen schnell zu schreiben, und was am wichtigsten ist: Die Bibliothek krugozor/database verhindert vollständig mögliche SQL-Injections.
Die Arten von Füllstoffen und ihre Verwendungszwecke werden im Folgenden beschrieben. Bevor Sie sich mit den Arten von Füllstoffen vertraut machen, müssen Sie verstehen, wie der Bibliotheksmechanismus funktioniert.
PHP ist eine schwach typisierte Sprache und bei der Entwicklung dieser Bibliothek entstand ein ideologisches Dilemma. Stellen wir uns vor, wir hätten eine Tabelle mit folgender Struktur:
` name ` varchar not null
` flag ` tinyint not nullund die Bibliothek MUSS (aus irgendeinem Grund, möglicherweise außerhalb der Kontrolle des Entwicklers) die folgende Anfrage ausführen:
$ db -> query (
" INSERT INTO `t` SET `name` = '?s', `flag` = ?i " ,
null , false
); In diesem Beispiel wird versucht, einen null in das not null -Textfeld name und einen false booleschen Typ in das numerische flag -Feld zu schreiben. Was sollen wir in dieser Situation tun?
false für die Spalte tinyint als den Wert 0 und null als leere Zeichenfolge für die Spalte name behandeln?Angesichts der aufgeworfenen Fragen wurde beschlossen, in dieser Bibliothek zwei Betriebsmodi zu implementieren.
Mysql::MODE_STRICT -Modus muss der Argumenttyp mit dem Platzhaltertyp übereinstimmen . Beispielsweise führt der Versuch, den Wert 55.5 oder '55.5' als Argument für einen ganzzahligen Platzhalter ?i zu übergeben, dazu, dass eine Ausnahme ausgelöst wird: // set strict mode
$ db -> setTypeMode (Mysql:: MODE_STRICT );
// this expression will not be executed, an exception will be thrown:
// attempt to specify a value of type "integer" for placeholder of type "double" in query template "SELECT ?i"
$ db -> query ( ' SELECT ?i ' , 55.5 );Mysql::MODE_TRANSFORM -Modus ist standardmäßig eingestellt und ein „toleranter“ Modus – wenn der Platzhaltertyp und der Argumenttyp nicht übereinstimmen, wird keine Ausnahme ausgelöst, sondern versucht, das Argument mithilfe von in den gewünschten Platzhaltertyp zu konvertieren PHP-Sprache selbst . Übrigens verwende ich als Autor der Bibliothek immer diesen speziellen Modus. Ich habe den strikten Modus ( Mysql::MODE_STRICT ) noch nie in der Praxis verwendet, aber vielleicht benötigen Sie ihn speziell. Die folgenden Transformationen sind in Mysql::MODE_TRANSFORM zulässig:
int umwandeln (Platzhalter ?i )string als auch im double -Typ dargestellt werdenbool TRUE wird in int(1) konvertiert, FALSE wird in int(0) konvertiertnull wird in int(0) konvertiertdouble umwandeln (Platzhalter ?d )string als auch im int -Typ dargestellt werdenbool TRUE wird zu float(1) , FALSE wird zu float(0)null wird in float(0) konvertiertstring umwandeln (Platzhalter ?s )bool TRUE wird in string(1) "1" konvertiert, FALSE wird in string(1) "0" konvertiert. Dieses Verhalten unterscheidet sich von der Umwandlung bool in int in PHP, da in der Praxis der boolesche Typ in MySql häufig als Zahl geschrieben wird.numeric Wert wird gemäß den Konvertierungsregeln von PHP in eine Zeichenfolge konvertiertnull wird in string(0) "" konvertiert.null umwandeln (Platzhalter ?n )krugozor/database bereitgestellt? ?i – Ganzzahl-Platzhalter $ db -> query (
' SELECT * FROM `users` WHERE `id` = ?i ' , 123
);SQL-Abfrage nach Vorlagenkonvertierung:
SELECT * FROM ` users ` WHERE ` id ` = 123 AUFMERKSAMKEIT! Wenn Sie mit Zahlen arbeiten, die außerhalb der Grenzen von PHP_INT_MAX liegen, dann:
?s (siehe unten). Der Punkt ist, dass Zahlen außerhalb der Grenzen von PHP_INT_MAX von PHP als Gleitkommazahlen interpretiert werden. Der Bibliotheksparser versucht, den Parameter in den Typ int umzuwandeln, was zur Folge hat, dass das Ergebnis undefiniert ist, da die Gleitkommazahl nicht ausreichend präzise ist, um das korrekte Ergebnis zurückzugeben. In diesem Fall wird weder eine Warnung noch ein Kommentar angezeigt ! “ – php.net. ?d – Gleitkomma-Platzhalter $ db -> query (
' SELECT * FROM `prices` WHERE `cost` IN (?d, ?d) ' ,
12.56 , ' 12.33 '
);SQL-Abfrage nach Vorlagenkonvertierung:
SELECT * FROM ` prices ` WHERE ` cost ` IN ( 12 . 56 , 12 . 33 ) AUFMERKSAMKEIT! Wenn Sie eine Bibliothek verwenden, um mit dem double Datentyp zu arbeiten, legen Sie das entsprechende Gebietsschema so fest, dass das Trennzeichen der Ganzzahl- und Bruchteile sowohl auf PHP-Ebene als auch auf DBMS-Ebene gleich ist.
?s – Platzhalter für den String-Typ Die Argumentwerte werden mit der Methode mysqli::real_escape_string() maskiert:
$ db -> query (
' SELECT "?s" ' ,
" You are all fools, and I am d'Artagnan! "
);SQL-Abfrage nach Vorlagenkonvertierung:
SELECT " You are all fools, and I am d'Artagnan! " ?S – Platzhalter vom Typ Zeichenfolge für die Ersetzung im SQL-LIKE-Operator Argumentwerte werden mithilfe der mysqli::real_escape_string() -Methode + der im LIKE-Operator verwendeten Sonderzeichen ( % und _ ) maskiert:
$ db -> query ( ' SELECT "?S" ' , ' % _ ' );SQL-Abfrage nach Vorlagenkonvertierung:
SELECT " % _ " ?n – Platzhalter NULL Typ Der Wert aller Argumente wird ignoriert, Platzhalter werden in der SQL-Abfrage durch die Zeichenfolge NULL ersetzt:
$ db -> query ( ' SELECT ?n ' , 123 );SQL-Abfrage nach Vorlagenkonvertierung:
SELECT NULL ?A* – assoziativer Satzplatzhalter aus einem assoziativen Array, der eine Folge von Paaren der Form key = value generiert wobei das Zeichen * einer der Platzhalter ist:
i (Integer-Platzhalter)d (Float-Platzhalter)s (Platzhalter vom Typ String)Die Regeln für die Konvertierung und das Escapen sind dieselben wie für die oben beschriebenen einzelnen Skalartypen. Beispiel:
$ db -> query (
' INSERT INTO `test` SET ?Ai ' ,
[ ' first ' => ' 123 ' , ' second ' => 456 ]
);SQL-Abfrage nach Vorlagenkonvertierung:
INSERT INTO ` test ` SET ` first ` = " 123 " , ` second ` = " 456 " ?a* – Platzhalter aus einem einfachen (oder auch assoziativen) Array setzen, wodurch eine Folge von Werten generiert wird wobei * einer der Typen ist:
i (Integer-Platzhalter)d (Float-Platzhalter)s (Platzhalter vom Typ String)Die Konvertierungs- und Escape-Regeln sind dieselben wie für die oben beschriebenen einzelnen Skalartypen. Beispiel:
$ db -> query (
' SELECT * FROM `test` WHERE `id` IN (?ai) ' ,
[ 123 , 456 ]
);SQL-Abfrage nach Vorlagenkonvertierung:
SELECT * FROM ` test ` WHERE ` id ` IN ( " 123 " , " 456 " )?A[?n, ?s, ?i, ...] – assoziativer Mengenplatzhalter mit expliziter Angabe des Typs und der Anzahl der Argumente, der eine Folge von key = value -Paaren generiertBeispiel:
$ db -> query (
' INSERT INTO `users` SET ?A[?i, "?s"] ' ,
[ ' age ' => 41 , ' name ' => " d'Artagnan " ]
);SQL-Abfrage nach Vorlagenkonvertierung:
INSERT INTO ` users ` SET ` age ` = 41 , ` name ` = " d'Artagnan " ?a[?n, ?s, ?i, ...] – Platzhalter mit einer expliziten Angabe des Typs und der Anzahl der Argumente festlegen, wodurch eine Folge von Werten generiert wirdBeispiel:
$ db -> query (
' SELECT * FROM `users` WHERE `name` IN (?a["?s", "?s"]) ' ,
[ ' Daniel O"Neill ' , " d'Artagnan " ]
);SQL-Abfrage nach Vorlagenkonvertierung:
SELECT * FROM ` users ` WHERE ` name ` IN ( " Daniel O " Neill " , " d ' Artagnan") ?f – Platzhalter für Tabellen- oder FeldnamenDieser Platzhalter ist für Fälle gedacht, in denen der Name einer Tabelle oder eines Feldes in der Abfrage als Parameter übergeben wird. Feld- und Tabellennamen werden mit einem Apostroph umrahmt:
$ db -> query (
' SELECT ?f FROM ?f ' ,
' name ' ,
' database.table_name '
);SQL-Abfrage nach Vorlagenkonvertierung:
SELECT ` name ` FROM ` database ` . ` table_name `Die Bibliothek erfordert, dass der Programmierer die SQL-Syntax befolgt. Das bedeutet, dass die folgende Abfrage nicht funktioniert:
$ db -> query (
' SELECT CONCAT("Hello, ", ?s, "!") ' ,
' world '
); — Platzhalter ?s müssen in einfache oder doppelte Anführungszeichen gesetzt werden:
$ db -> query (
' SELECT concat("Hello, ", "?s", "!") ' ,
' world '
);SQL-Abfrage nach Vorlagenkonvertierung:
SELECT concat( " Hello, " , " world " , " ! " )Für diejenigen, die es gewohnt sind, mit PDO zu arbeiten, wird dies seltsam erscheinen, aber die Implementierung eines Mechanismus, der bestimmt, ob es notwendig ist, den Platzhalterwert in einem Fall in Anführungszeichen zu setzen oder nicht, ist eine sehr nicht triviale Aufgabe, die das Schreiben eines ganzen Parsers erfordert .
Siehe in der Datei ./console/tests.php