PHP Migration von MySQL nach MySQLi

Jeder Web Hosting Dienstleister stellt seinen Kunden heute das bewährte Duo PHP und MySQL zur Verfügung. Mit der Server seitigen Programmiersprache PHP lassen kleine wie auch komplexe Webanwendungen recht einfach erstellen. Als Datenbankplattform bietet sich MySQL an.

Der Zugriff von PHP auf eine MySQL Datenbank erfolgt über die MySQL Erweiterung. Unterschieden wird MySQL und MySQLi.

MySQLi steht für MySQL Improvement und ist seit PHP 5 verfügbar. Die alten Funktionen wie mysql_connect wurden mit PHP 7 abgeschaltet. Jede PHP Anwendung muss somit früher oder später auf MySQLi umgestellt werden.

Je nach Art und Komplexität der Anwendung, kann diese Umstellung zu einem recht umfangreichen Projekt führen.

Im nachfolgend skizzierten Projektbeispiel möchte ich einige Anregungen und Hilfestellungen für vergleichbar gelagerte Projekte geben.

Projektbeispiel

PHP Migration von MySQL nach MySQLiMitgliederverwaltung eines Segelvereins mit mehreren hundert Mitgliedern.

Die seit mehr als 15 Jahren gewachsene Extranet Anwendung umfasst im wesentlichen folgenden Funktionen:

  • Mitgliederverwaltung
  • Mitgliederportal
  • Self-Service Funktionen
  • Buchung der Clubboote
  • Veranstaltungsplanung
  • Teilnehmerverwaltung
  • Führerscheinveraltung
  • Meilenbuch
  • Törnbörse
  • Terminkalender
  • Gästebuch

Projektansatz

Nachfolgend werden die einzelnen Schritte erläutert.

Entwicklungsumgebung

Unabdingbar ist der Aufbau einer Entwicklungsumgebung mit der entsprechenden PHP und MySQL Version. Auf keinen Fall darf auf der Produktivumgebung ohne vorherige Tests auf eine neue PHP Version umgestellt werden.

Im konkreten Fall war der Umzug von Strato zu 1&1 geplant. Somit bot es sich an im 1&1 Webspace die Testumgebung mit den entsprechenden Versionen einzurichten.

  • PHP 7.2
  • MySQL 5.5

Wie zu erwarten hagelte es beim Aufruf der Anwendungen Fehlermeldungen.

Analyse

Bei der Analyse ging es darum zu verstehen welche MySQL Funktionen im PHP Code verwendet wurden. Im Detail galt es zu analysieren wie häufig in welcher Datei welche Funktionen aufgerufen wurden. Eine erste Analyse zeigte die Verwendung der nachfolgenden MySQL Funktionen auf:

$link = mysql_connect(server,user,password)
boolean = mysql_select_db(database)
mixed mysql_query ( string $query [, resource $link_identifier = NULL ] )
array mysql_fetch_row ( resource $result )
bool mysql_free_result ( resource $result )
int mysql_num_rows ( resource $result )
string mysql_error ([ resource $link_identifier = NULL ] )
string mysql_field_type ( resource $result , int $field_offset )
int mysql_field_len ( resource $result , int $field_offset )
bool mysql_data_seek ( resource $result , int $row_number )
string mysql_field_table ( resource $result , int $field_offset )
int mysql_num_fields( resource $result)
string mysql_field_name ( resource $result , int $field_offset )
object mysql_fetch_object ( resource $result [, string $class_name [, array $params ]] )
array mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] )
int mysql_insert_id ([ resource $link_identifier = NULL ] )
bool mysql_close ([ resource $link_identifier = NULL ] )
int mysql_errno([ resource $link_identifier = NULL] )

Die Analyse ergab ferner, dass die oben aufgeführten Funktionen insgesamt 1500 Mal in den unterschiedlichsten Programmteilen zum Einsatz kamen.

Unterschiede MySQL und MySQLi Funktionsaufrufe

In diesem Projektschritt wurden die Analogien bzw. Unterschiede zwischen MySQL und MySQLi erarbeitet.

Dabei konnten die MySQL Funktionen in 3 Kategorien unterschieden werden.

Kategorie 1

Lediglich der Name der Funktion hat sich geändert. Anzahl und Art der Parameter sowie des Rückgabewerts bleiben unverändert.

Beispiel:

mysql_num_rows() und mysqli_num_rows()

Beide Funktionen erwarten als Parameter das Ergebnis der MySQL Abfrage und liefern die Anzahl der Datensätze als Rückgabewert.

Für die Umsetzung im PHP Code ist lediglich der Funktionsaufruf von mysql_num_rows auf mysqli_num_rows zu ändern.

Kategorie 2

Wie in Kategorie 1 gibt es in diesem Fall eine bei MySQL und MySQLi eine entsprechende Funktion jedoch mit geänderter Anzahl an Parametern.

Beispiel:

mysql_connect() und mysqli_connect()

mysql_connect() erwartet die Parameter Server, User und Password. Bei mysqli_connect () wird zusätzlich als Paramter der Datenbankname übergeben. Als Rückgabewert liefern beide Funktionen den Zeiger auf die Datenbank bzw. False im Fehlerfall.

Im Fall der Kategorie 2 Funktionen ist eine Code Anpassung unumgänglich. Im speziellen Fall des Datenbank Connect ist die Anpassung recht simpel und vereinfacht den Code sogar. Anstelle der Aufrufe mysql_connect und dem anschliessenden mysql_select_db reicht bei MySQLi der Funktionsaufruf mysqli_connect um die Verbindung zum Server und der gewünschten Datenbank herzustellen.

Kategorie 3

In dieser Kategorie finden sich die Funktionen ohne direktes Pendant wieder.

Beispiel:

mysql_field_len

Zu dieser Funktion gibt es in MySQLi keinen direkten Ersatz. Als Art verwandte Funktion bietet sich mysqli_fetch_field_direct() an.

Diese Funktion liefert u.a. auch die Länge des Felds zurück.

 

Umsetzung

Schreibe einen Kommentar