Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MySQL auf MySQLi
#1
Autor: Dave Smith Aktualisiert am: 2022-01-05 Deutsche Übersetzung 30.05.2022

Alternative zu PHP MySQLi Connect auf PHP7 mysql_connect vs. mysqli_connect:
Verwendung einer von PHP zurückgegebenen Ressource mysqli_connect vs. neues mysqli-Objekt

Als erstes müssen wir uns ansehen, dass MySQL eine Ressource und MySQLi ein Objekt ist.
Um unseren Code zu migrieren, müssen wir den technischen Unterschied wirklich nicht verstehen, aber wir müssen verstehen, dass sie unterschiedlich sind.
Das erste, was wir normalerweise mit MySQL tun, ist, uns mit einer Datenbank zu verbinden und sie auszuwählen, also werfen wir einen Blick auf mysql_connect und mysql_select_db.
Code:
$connection = mysql_connect( 'host', 'username', 'password', new_link,flags);
$database = mysql_select_db( 'database', $link);
$connection ist eine MySQL-Link-ID zur Ressource und $database ist nur eine boolesche Variable, die bei Erfolg wahr oder bei Fehler falsch enthält. In den meisten Situationen ist Ihr Host localhost und Sie haben nur Ihren Benutzernamen und Ihr Passwort angegeben.

mysqli_connect in PHP
Werfen wir nun einen Blick auf das Gegenstück in MySQLi, mysqli_connect.
Code:
$connection = mysqli_connect( 'host', 'username', 'password', 'database', 'port', 'socket');

Was müssen Sie ändern, um die PHP-Funktion mysqli_connect zu verwenden?
$connection ist ein Link zum MySQLi-Objekt für diese Verbindung. Wenn Ihre Verbindung mit mysql nur den Host, den Benutzernamen und das Passwort verwendet, ist die Aktualisierung Ihres Codes so einfach wie das Ändern von mysql_connect in mysqli_connect.
Sie könnten auch fortfahren und die Datenbank, zu der eine Verbindung hergestellt werden soll, direkt dort in den mysqli_connect-Parametern hinzufügen und mysql_select_db entfernen. Dies ist in Ordnung, wenn keine Variable zum Speichern des Ergebnisses vorhanden ist. Wenn jedoch eine Variable verwendet wurde, ist es möglich, dass irgendwo tief im Code Logik vorhanden ist, die diese Variable verwendet, um die gültige Verbindung zur Datenbank zu überprüfen. In diesen Fällen empfehle ich die Verwendung von mysqli_select_db.
Code:
$database = mysqli_select_db($link, 'database');
Bei MySQL mussten Sie keinen Link angeben, es wurde die zuletzt geöffnete Verbindung verwendet, wenn der Link nicht angegeben wurde. Bei der Verwendung von MySQLi ist der Link erforderlich und wie Sie sehen können, ist dies jetzt der erste Parameter.
In unseren Beispielen ist dieser $link eine Verbindung und unser Datenbankname würde unverändert bleiben. $database ist immer noch eine boolesche Variable. Wenn also an einer anderen Stelle im Code darauf verwiesen wird, funktioniert sie wie erwartet.
Falls Ihre Verbindung nicht die einfache Standardverbindung ist, die wir gerade durchgegangen sind, müssen wir zurückgehen und uns mysql_connect erneut ansehen. Der Parameter host kann eine Portnummer, localhost:3307, oder einen Socket, localhost:/path/to/mysql.sock, enthalten. Wenn Sie diese zu mysqli_connect migrieren, würden Sie einfach den Port oder Socket zu den Port- und Socket-Parametern verschieben.
Möglicherweise haben Sie das Flag new_link gesetzt, wodurch MySQL eine neue Verbindung öffnen konnte, anstatt die zuvor geöffnete zu verwenden. Dann würde der verwendete Link als Link-Parameter benannt. Wenn wir diese migrieren, erstellen wir einfach ein neues MySQLi-Objekt mit demselben Linknamen. Um dies zu veranschaulichen...
$connection2 = mysql_connect( 'host', 'username', 'password', true);
würde werden
$connection2 = mysqli_connect( 'host', 'username', 'password');
Möglicherweise haben Sie auch Client-Flags gesetzt, MySQLi verwendet diese nicht und sie können beim Generieren der MySQLi Verbindung sicher entfernt werden.
Möglicherweise haben Sie eine Variation von mysql_connect, um eine dauerhafte Verbindung herzustellen, nämlich mysql_pconnect. Um dieselbe dauerhafte Verbindung in MySQLi herzustellen, stellen Sie dem Host einfach das Präfix ap: voran, sodass localhost zu p:localhost wird.
In MySQL könnten wir mysql_error und mysql_errno verwenden, um festzustellen, ob beim Verbinden ein Fehler aufgetreten ist. Da die MySQLi-Ersetzungen für diese den Link zum Objekt verwenden und selbst wenn es ein Problem beim Verbinden eines Objekts gab, zurückgegeben wird, müssen wir mysqli_connect_error und mysql_connect_errno verwenden.
Bei beiden stellen Sie keinen Link zur Verfügung, mit dessen Hilfe der letzte Verbindungsversuch überprüft werden kann.
OK, ich habe versprochen, dass dies einfach sein würde, und jetzt, da wir eine richtige MySQLi-Verbindung haben, haben wir den schwierigsten Teil aus dem Weg geräumt.

Migrieren von mysql_select_db, mysql_query, mysql_fetch_array, mysql_list_fields und anderen prozeduralen Methoden zu MySQLi
Prozedurale MySQLi-Methoden verwenden einen Parameter, der entweder auf einen Objektlink oder ein Ergebnisobjekt verweist. Wir haben den Verweis auf den Objektlink gesehen, als wir uns mit mysqli_select_db befasst haben. Das Ergebnisobjekt ähnelt beispielsweise einem MySQL-Ergebnis, das von einer Abfrage zurückgegeben wird.
Viele der Methoden in MySQL haben sehr ähnliche prozedurale Methoden in MySQLi und sind so einfach zu migrieren wie das Hinzufügen des i zu mysql und das Hinzufügen oder Verschieben des Links oder Ergebnisses zum ersten Parameter. Denken Sie daran, dass MySQLi den Link für die Methoden benötigt, die auf einen Link verweisen. In der folgenden Liste folgt auf die MySQL-Anweisung die prozedurale Methode des Ersatzes MySQLi.

Code:
mysql_affected_rows -> mysqli_affected_rows($link)
mysql_close -> mysqli_close($link)
mysql_data_seek -> mysqli_data_seek( $result, $offset)
mysql_errno -> mysqli_errno( $link)
mysql_error -> mysqli_error( $link)
mysql_fetch_array -> mysqli_fetch_array( $result, $type)
mysql_fetch_assoc -> mysqli_fetch_assoc( $result)
mysql_fetch_lengths -> mysqli_fetch_lengths( $result )
mysql_fetch_object -> mysqli_fetch_object( $result, $class, $params)
mysql_fetch_row -> mysqli_fetch_row( $result)
mysql_field_seek -> mysqli_field_seek( $result, $number)
mysql_free_result -> mysqli_free_result(result)
mysql_get_client_info -> mysqli_get_client_info( $link)
mysql_get_host_info -> mysqli_get_host_info( $link)
mysql_get_proto_info -> mysqli_get_proto_info( $link)
mysql_get_server_info -> mysqli_get_server_info( $link)
mysql_info -> mysqli_info( $link)
mysql_insert_id -> mysqli_insert_id( $link)
mysql_num_rows ->  mysqli_num_rows( $result)
mysql_ping -> mysqli_ping( $link)
mysql_query -> mysqli_query( $link, $query)
mysql_real_escape_string -> mysqli_real_escape_string( $link)
mysql_select_db - > mysqli_select_db( $link, $database)
mysql_set_charset -> mysqli_set_charset( $link, $charset)
mysql_stat -> mysqli_stat( $link)
mysql_thread_id -> mysqli_thread_id( $link)


Umgang mit den schwierigeren Methoden
Die schlechte Nachricht ist, dass nicht alle Methoden so einfach zu migrieren sind wie die oben aufgeführten. Die gute Nachricht ist, dass diese Methoden nicht so verbreitet sind, sodass Sie sich möglicherweise nicht einmal damit befassen müssen. Diese schwierigeren Methoden erfordern einige Diskussionen, daher werden wir sie einzeln durchgehen.
mysql_client_encoding -> mysqli_character_set_name( $link)
Dies ist eine einfache Namensänderung.
mysql_create_db
Diese Anweisung wird durch die mysqli_query-Methode ersetzt, die die CREATE DATABASE sql...
$result = mysqli_query( $link, 'CREATE DATABASE database_name' );
mysql_db_name
Diese Anweisung wird in Verbindung mit der mysql_list_dbs-Anweisung verwendet, um die angeforderte Zeile aus einem bestimmten Ergebnis zu erhalten. Um es zu MySQLi zu migrieren, müssen wir die Methode mysqli_data_seek verwenden, um die angeforderte Zeile zu finden, und dann mysqli_fetch_row, um die angeforderte Zeile zurückzugeben.
Code:
$data = mysql_db_name( $result, $row);
wird
Code:
mysqli_data_seek( $result, $row);
$fetch = mysql_fetch_row( $result );
$data = $fetch[0];

mysql_db_query
In MySQL wählt diese Anweisung eine Datenbank aus und führt die Abfrage aus. Um es zu MySQLi zu migrieren, verwenden wir die Methode mysqli_select_db, um die Datenbank auszuwählen, und dann die Methode mysqli_query, um die Abfrage auszuführen und das Ergebnis zurückzugeben.
Code:
$result = mysql_db_query( 'database', 'query');
wird
Code:
mysqli_select_db( 'database' );
$result = mysqli_query( 'query' );

mysql_drop_db
Diese Anweisung wird durch die mysqli_query-Methode ersetzt, die die DROP DATABASE sql...
Code:
$result = mysqli_query( $link, 'DROP DATABASE database_name');
Code:
mysql_escape_string -> mysql_real_escape_string( $link, 'string')
Dies ist eine einfache Namensänderung.
Code:
mysql_fetch_field -> mysqli_fetch_field( $result )
Wenn diese Anweisung den optionalen Offset-Parameter nicht enthält, handelt es sich um eine einfache Namensersetzung für die Migration. Wenn der Offset-Parameter enthalten ist, müssen wir das Ergebnis durchlaufen, bis wir den angeforderten Offset finden.
Code:
$fetch = mysql_fetch_field( $result, 5);
wird
Code:
for(x=0; x<5; x++) {
  mysqli_fetch_field( $result );
}
$fetch = mysqli_fetch_field( $result );
mysql_field_len
mysql_field_name
mysql_field_table
In MySQL geben diese Anweisungen die Länge, den Namen oder die Tabelle des angegebenen Felds zurück. Um es zu migrieren, verwenden wir die MySQLi-Methode mysqli_fetch_field_direct, um ein Objekt zurückzugeben, das die Felddaten enthält, und geben dann die Feldlänge, den Namen oder die Tabelle von diesem Objekt zurück.
Code:
$length = mysql_field_len( $result, 5);
$name = mysql_field_name( $result, 5);
$table = mysql_field_table( $result, 5)
wird
Code:
$fieldInfo = mysqli_fetch_field_direct( $result, 5);
$length = $fieldInfo->length;
$name = $fieldInfo->name;
$table = $fieldInfo->table;

mysql_list_dbs
Diese Anweisung wird durch die mysqli_query-Methode ersetzt, die SHOW DATABASES sql...
Code:
$result = mysqli_query( $link, 'SHOW DATABASES');

mysql_list_fields
Diese Anweisung wird durch die mysqli_query-Methode ersetzt, die SHOW COLUMNS FROM sql...
Code:
$result = mysqli_query( $link, 'SHOW COLUMNS FROM table_name' );
mysql_list_processes -> mysqli_thread_id( $link )
Dies ist eine einfache Namensänderung.

mysql_list_tables
Diese Anweisung wird durch die mysqli_query-Methode ersetzt, die SHOW TABLES FROM sql...
Code:
$result = mysqli_query( $link, 'SHOW TABLES FROM database_name');
mysql_num_fields -> mysqli_field_count( $link )
Diese Anweisung verweist auf das Ergebnis in MySQL und wird durch die Methode mysql_field_count ersetzt, die auf den Link verweist.

mysql_result
In MySQL ruft diese Anweisung eine bestimmte Zeile und ein optionales Feld aus einem bestimmten Ergebnis ab. Um es zu migrieren, verwenden wir mysqli_data_seek, um die Zeile zu lokalisieren, und durchlaufen die Felder mit mysqli_fetch_field, um das Feld zurückzugeben.
Code:
$fetch = mysql_result( $result, 3, 'field');
wird
Code:
mysql_data_seek($result, 3);
if( !empty($field) ) {
  while($finfo = mysqli_fetch_field( $result )) {
    if( $field == $finfo->name ) {
      $f = mysqli_fetch_assoc( $result );
      $fetch =  $f[ $field ];
    }
  }
} else {
  $f = mysqli_fetch_array( $result );
  $fetch = $f[0];
}

mysql_tablename
In MySQL gibt diese Anweisung den Tabellennamen in der Zeile eines angegebenen Ergebnisses zurück. Um es zu migrieren, verwenden wir die mysqli_data_seek Methode, um die angegebene Zeile zu lokalisieren und den Namen mit der mysqli_fetch_array Methode abzurufen.
Code:
$name = mysql_tablename( $result, 3 );
wird
Code:
mysqli_data_seek( $result, 3 );
$f = mysql_fetch_array( $result );
$fetch = $f[0];

mysql_unbuffered_query
Diese Anweisung wird durch die mysqli_query-Methode ersetzt, wobei der Ergebnismodus auf MYSQLI_USE_RESULT...
Code:
$result = mysqli_query($link, 'query', MYSQLI_USE_RESULT);

Die rothaarigen Stiefkinder
Zunächst möchte ich darauf hinweisen, dass ich nichts gegen Rothaarige oder Stiefkinder im Allgemeinen habe. In den Vereinigten Staaten ist dies ein Ausdruck, der sich auf ein Problem bezieht, mit dem sich niemand befassen möchte, und ich weiß einfach nicht, was ein politisch korrekter Ersatz wäre, also bleiben wir dabei.
Es gibt 2 MySQL-Anweisungen, mit denen man sehr mühsam umgehen muss, da sie Flags und Typen verwenden, die in MySQLi nicht unterstützt werden, genauso wie in MySQL. Damit diese funktionieren, müssen wir unsere eigenen erstellen.

mysql_field_flags
Code:
$resultFlags = mysql_field_flags( $result, 3);
wird
Code:
$flags = array();
$constants = get_defined_constants( true );
foreach ($constants['mysqli'] as $c => $n)
{
if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m))
  if (!array_key_exists($n, $flags))
   $flags[$n] = $m[1];
  $flags_num = mysqli_fetch_field_direct( $result, $field_offset )->flags;
  $result = array();
  foreach ($flags as $n => $t)
   if ($flags_num & $n)
    $result[] = $t;
  $returnFlags = implode(' ', $result);
  $returnFlags = str_replace( 'PRI_KEY', 'PRIMARY_KEY', $returnFlags);
  $returnFlags = strtolower($returnFlags);
}

mysql_field_type
Code:
$resultType = mysql_field_type( $result, 4);
wird
Code:
$type_id = mysqli_fetch_field_direct( $result, $field_offset)->type;
$types = array();
$constants = get_defined_constants(true);
foreach ($constants['mysqli'] as $c => $n)
if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m))
  $types[$n] = $m[1];
$resultType = array_key_exists( $type_id, $types ) ? $types[$type_id] : NULL;

Verwenden des PHP-MySQL-zu-MySQLi-Migrationspakets
PHP MySQL to MySQLi ist ein Paket, das die mysql-Erweiterungsfunktionen mit der mysqli-Erweiterung emuliert.
Es verwendet diese Ersatzcodelösungen und kann als Lückenbüßer fungieren, während Sie an der Migration Ihres Codes arbeiten. Es bietet eine schnelle alternative Lösung für Projekte, die sofort zu mysqli migriert werden müssen, aber Sie sollten es als vorübergehende Lösung betrachten, während Ihre eigentliche mysqli Migration noch nicht abgeschlossen ist.

Laden Sie das MySQL to MySQLi Migration Package herunter und installieren Sie es
Halten Sie Ihren Code auf dem neuesten Stand, um Ihren treuen Benutzern zu zeigen, dass es Ihnen wichtig ist, was mit ihnen passiert. Wenn die Server mit dem Upgrade auf die neue PHP 7-Version beginnen, wird viel Open-Source-Code über Nacht veraltet sein und einfach nicht mehr funktionieren.
Meine Empfehlung Nummer eins ist, in den sauren Apfel zu beißen und dort einzusteigen und diesen Code zu reparieren. Sobald Sie anfangen, werden Sie feststellen, dass es nicht so schlimm ist, wie es zunächst scheinen mag.
Sie können das Paket herunterladen, indem Sie auf die Registerkarte „Download“ der PHP-MySQL-zu-MySQL-Seite gehen und das ZIP-Archiv herunterladen. Sie können es auch mit dem PHP-Composer-Tool installieren, indem Sie die Anweisungen auf dieser Seite befolgen.
Wenn Sie Fragen oder bessere Lösungen als die hier bereitgestellten haben, kommentieren Sie diese bitte.

https://www.phpclasses.org/blog/package/...ySQLi.html
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



Zitieren
#2
Um solche Webinterface wie OpenSim Webinterface redux von MySQL nach MySQLi zu übersetzen,
muss man auch wissen das sich die OpenSim Datenbank im laufe der zeit geändert hat.
Hier muss etwas mehr aufwand betrieben werden
und geschaut werden ob die Namen der Datenbankbereiche sich geändert haben
und wie sie heute heißen.

Download OpenSim Webinterface redux:
https://sourceforge.net/projects/opensimwiredux/
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  max_allowed_packet in MySQL (MariaDB) Pius Noel 2 6.337 15.01.2019, 17:30
Letzter Beitrag: Anachron
  Umstellung auf mysql Raul Gonzales 13 11.349 20.02.2018, 20:28
Letzter Beitrag: Raul Gonzales
  IAR Import nach Umstellung auf MySQL Pharcide 2 5.246 09.06.2016, 21:42
Letzter Beitrag: Pharcide
  Arriba miniGrid MySQL stoppt nach wenigen Sekunden Zabl 4 7.324 30.04.2015, 16:07
Letzter Beitrag: Zabl
  Komisches Problem mit Mysql? Catie Chiung 19 32.950 16.06.2013, 11:02
Letzter Beitrag: LyAvain

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste