Umstellung mysql auf mysqli

Mit PHP 5.5.0 werden die alten mysql-Funktionen als deprecated markiert und in einer künftigeren – mit dem heutigen Stand jedoch nicht näher spezifizierten Version – gänzlich entfernt. Daher sollte eine Umstellung dessen in den eigenen Projekten mittelfristig eingeplant werden. Dafür habe ich an dieser Stelle eine Umfängliche Schritt-für-Schritt Anleitung zusammengestellt.

MySQL: Das umfassende HandbuchDie Umstellung der mysql_*-Funktionen auf mysqli_*-Funktionen geht relativ reibungslos vonstatten, sofern man eine zentrale Verarbeitung der Datenbankabfragen implementiert hat. Ist dies nicht der Fall so wird sich der hier aufgeführte Aufwand um die Anzahl der zu behandelnden Stellen zuzüglich der notwendigen Tests in ungefähr multiplizieren.

Umsetzung

Für die Umstellung des eigenen Adapters muss man sich den nachfolgenden Punkten in jedem Einzelfall gesondert widmen und kann dazu wie folgt vorgehen:

  1. Im ersten Schritt ersetzt man alle mysql_ Funktionsaufrufe mit einem mysqli_. Das nachfolgende Suchpattern eignet sich hierfür sehr gut:
    /mysql_([a-z_]+)\(/
  2. In der Funktion mysqli_connect() werden ab dem vierten Parameter Port und Socket erwartet anstelle von link und clients. Sofern diese angegeben wurden müssen diese zunächst entfernt werden. Haben diese Angaben bisher darüber hinaus noch Relevanz gehabt so müssen jene an dieser Stelle gesondert behandelt werden.
  3. Die Funktionen mysqli_query(), mysqli_error(), mysqli_escape_string() und mysqli_real_escape_string() benötigen nun zusätzlich die Angabe der Ressource. Dies kann für die beiden zuletzt genannten Funktionen an den Stellen problematisch werden, an denen eine Verbindung möglicherweise noch nicht hergestellt wurde oder die Ressource gar nicht erst verfügbar ist. Hier muss sichergestellt sein, dass diese vor dem ersten Aufruf aufgebaut wurde.
  4. In der Methode mysqli_select_db() sind von nun an die beiden Parameter für Ressource und DB-Name vertauscht.
  5. Die Funktionen mysqli_fetch_assoc()mysqli_fetch_row()mysqli_fetch_object() und mysqli_fetch_array() liefern im Fall eines leeren Ergebnisses nun NULL wo hingegen ihre mysql-Pendants bisher FALSE zurückgegeben haben.
  6. Andersherum jedoch liefert die Methode mysqli_stat() fortan FALSE anstelle von NULL sofern die Datenermittlung erfolglos stattgefunden hat.
  7. Prüfungen auf is_resource() sind nicht mehr möglich da der mysqli-Adapter keine PHP Ressourcen mehr darstellen sondern interne Klassenrepräsentationen.
    Konstrukte dieser Art:

    if( is_resource( $this->_link ) {
        // ...
    }

    müssen überarbeitet und ersetzt werden gegen folgende Logik:

    if( $this->_link instanceof mysqli ) {
        // ...
    }
  8. Die Funktion mysql_field_name() kann nicht ersetzt werden, da das entsprechende Pendant nicht existiert. Man muss es um nachfolgendem Schnipsel – Umsetzung in einer Klasse vorausgesetzt – ergänzen:
    private function field_name( $offset )
    {
      $properties = mysqli_fetch_field_direct( $this->result, $offset );
      return is_object( $properties ) ? $properties->name : null;
    }

    Anstelle von mysql_field_name( $resource, $offset ) erfolgt der Aufruf nun mit $this->field_name( $offset ).

  9. Der Abruf der Methoden mysqli_stat() und mysql_error() ohne Parameter ist nun nicht mehr zulässig und es muss die Ressource künftig mit angegeben werden.

Fazit

Ich stelle fest, dass eine Umstellung auf mysqli keine zeitaufwändige Angelegenheit ist und mit den wenigen notwendigen Tests innerhalb eines halben Arbeitstages nahezu mühelos erledigt werden kann.

Weiterführende Literatur

Veröffentlicht von

Sebastian

Als erfahrener Softwarentwickler entwickelt Sebastian in einer Softwareschmiede in Bonn Individualsoftware mit den Schwerpunkten in PHP und MySQL. Er hat eine pfiffige Frau sowie drei quirlige Söhne, fährt gerne Auto und liebt handwerkliche Arbeiten die im häuslichen Umfeld so anfallen.