Hallo 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!
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
$result = mysql_query("SELECT bla bla bla");
in
$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 err-Abfragen sind nur sinnvoll 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.
Eventuell kannst Du auf diesem Weg auch das Fehler-Reporting bei SQL Fehlern direkt wegkapseln, indem Du in der query-Methode das Ergebnis von $connection->query erstmal inspizierst. Ist es FALSE, hau gleich eine Meldung ins Log oder ins echo.
Rolf
sumpsi - posui - clusi