Zusatz zu funktionen
bearbeitet von Rolf BHallo Pit,
> str_replace('mysql_query(', "mysqli_query(\$mydb,")
Also wenn du dafür ein Script schreiben musst, hast Du den falschen Editor. Search and Replace über alle Dateien im Projekt / in einem Ordner sollte eine Standardfunktion sein.
Aber wenn Du es selbst machen willst - geht natürlich. Durch Verwendung einfacher statt doppelter Anführungszeichen kannst Du übrigens das Escapen von $ vermeiden.
Mir ist gerade noch was eingefallen, was die Bereitstellung des globalen DB-Objekts angeht. Verwende eine statische Klasse!
~~~php
class DB {
private static $connection;
public static function getConnection() {
if (self::$connection === null)
self::$connection = new mysqli(...);
return self::$connection;
}
public static function query($sql) {
return self::getConnection()->query($connection, $sql);
}
public static function prepare($sql) {
return self::getConnection()->prepare($connection, $sql);
}
public static function errno() {
if (self::$connection === null) return 0;
return self::$$connection->errno;
}
public static function error() {
return self::$connection === null "" : self::$$connection->error;
}
}
~~~
Diese Klasse enthält das Connection-Objekt und stellt bei der ersten Query automatisch eine Verbindung her. Du kannst sie also in dein Konfigurations-Include einbauen, im new mysqli stehen dann die Verbindungsdaten.
Deine DB-Zugriffe ändern sich damit von
~~~php
$result = mysql_query("SELECT bla bla bla");
~~~
in
~~~php
$result = DB::query("SELECT bla bla bla");
~~~
D.h. dein Replace müsste 'mysql_query' durch 'DB::query' ersetzen, was ein guter Editor oder auch dein eigenes Scriptchen problemlos kann. Klassennamen sind immer global sichtbar, d.h. du hast keine Probleme mehr mit einer global $db Zeile.
Falls Du Namespaces verwendest, musst Du natürlich \DB oder \mynamespace\DB einsetzen, je nach deinem Namespace-Layout. Wenn Du nicht weißt, wovon ich rede, vergiss diesen Absatz oder lies Dich bei php.net ein 😉. Namespaces sind in großen Projekten eine gute Hilfe, aber sie in einem Altprojekt nachzurüsten kann viel Arbeit machen (jeder Aufruf einer PHP-Standardfunktion braucht auf einmal ein \ vorneweg).
Weitere Funktionen, die DB-spezifisch sind, kannst Du genauso in der DB-Klasse kapseln. Pro Funktion musst Du dann überlegen, ob sie automatisch eine Verbindung herstellen sollte oder nicht.
Ich habe das mal exemplarisch für prepare, errno und error gemacht, die machen nur Sinn wenn das mysqli-Objekt schon da ist, darum stellen sie nicht automatisch eine Connection her. Die errno() und error() Methoden sind unterschiedlich implementiert; eine mit direktem if, eine mit dem ?: Operator. Nimm das was Du magst und verstehst.
_Rolf_
--
sumpsi - posui - clusi
Zusatz zu funktionen
bearbeitet von Rolf BHallo Pit,
> str_replace('mysql_query(', "mysqli_query(\$mydb,")
Also wenn du dafür ein Script schreiben musst, hast Du den falschen Editor. Search and Replace über alle Dateien im Projekt / in einem Ordner sollte eine Standardfunktion sein.
Aber wenn Du es selbst machen willst - geht natürlich. Durch Verwendung einfacher statt doppelter Anführungszeichen kannst Du übrigens das Escapen von $ vermeiden.
Mir ist gerade noch was eingefallen, was die Bereitstellung des globalen DB-Objekts angeht. Verwende eine statische Klasse!
~~~php
class DB {
private static $connection;
public static function getConnection() {
if (!self::$connection === null)
self::$connection = new mysqli(...);
return self::$connection;
}
public static function query($sql) {
return self::getConnection()->query($connection, $sql);
}
public static function prepare($sql) {
return self::getConnection()->prepare($connection, $sql);
}
public static function errno() {
if (self::$connection === null) return 0;
return self::$$connection->errno;
}
public static function error() {
return self::$connection === null "" : self::$$connection->error;
}
}
~~~
Diese Klasse enthält das Connection-Objekt und stellt bei der ersten Query automatisch eine Verbindung her. Du kannst sie also in dein Konfigurations-Include einbauen, im new mysqli stehen dann die Verbindungsdaten.
Deine DB-Zugriffe ändern sich damit von
~~~php
$result = mysql_query("SELECT bla bla bla");
~~~
in
~~~php
$result = DB::query("SELECT bla bla bla");
~~~
D.h. dein Replace müsste 'mysql_query' durch 'DB::query' ersetzen, was ein guter Editor oder auch dein eigenes Scriptchen problemlos kann. Klassennamen sind immer global sichtbar, d.h. du hast keine Probleme mehr mit einer global $db Zeile.
Falls Du Namespaces verwendest, musst Du natürlich \DB oder \mynamespace\DB einsetzen, je nach deinem Namespace-Layout. Wenn Du nicht weißt, wovon ich rede, vergiss diesen Absatz oder lies Dich bei php.net ein 😉. Namespaces sind in großen Projekten eine gute Hilfe, aber sie in einem Altprojekt nachzurüsten kann viel Arbeit machen (jeder Aufruf einer PHP-Standardfunktion braucht auf einmal ein \ vorneweg).
Weitere Funktionen, die DB-spezifisch sind, kannst Du genauso in der DB-Klasse kapseln. Pro Funktion musst Du dann überlegen, ob sie automatisch eine Verbindung herstellen sollte oder nicht.
Ich habe das mal exemplarisch für prepare, errno und error gemacht, die machen nur Sinn wenn das mysqli-Objekt schon da ist, darum stellen sie nicht automatisch eine Connection her. Die errno() und error() Methoden sind unterschiedlich implementiert; eine mit direktem if, eine mit dem ?: Operator. Nimm das was Du magst und verstehst.
_Rolf_
--
sumpsi - posui - clusi