Rolf B: Zusatz zu funktionen

Beitrag lesen

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