Wie ändere ich mysql auf mysqli?
Wie kann ich diesen Code, den ich für reguläres MySQL verwende, in MySQL konvertieren?
Ist es so einfach wie Ändern ** MySQL _query ($ sql) ; zu mysqli _query ($ sql) ; **
<?PHP //in my header file that is included on every page I have this $DB["dbName"] = "emails"; $DB["host"] = "localhost"; $DB["user"] = "root"; $DB["pass"] = ""; $link = mysql_connect($DB['host'], $DB['user'], $DB['pass']) or die("An Internal Error has Occured. Please report following error to the webmaster. "); mysql_select_db($DB['dbName']); // end header connection part // function from a functions file that I run a mysql query through in any page. function executeQuery($sql) { $result = mysql_query($sql); if (mysql_error()) { $error = '
".mysql_error()."'An Internal Error has Occured.
The error has been recorded for review
'; if ($_SESSION['auto_id'] == 1) { $sql_formatted = highlight_string(stripslashes($sql), true); $error .= 'The MySQL Syntax Used
' . $sql_formatted . '
The MySQL Error Returned
' . mysql_error(); } die($error); } return $result; } // example query ran on anypage of the site using executeQuery function $sql='SELECT auto_id FROM friend_reg_user WHERE auto_id=' .$info['auto_id']; $result_member=executequery($sql); if($line_member=mysql_fetch_array($result_member)){ extract($line_member); } else { header("location: index.php"); exit; } ?>
Das erste, was zu tun wäre, wäre wahrscheinlich, jeden mysql_*
Funktionsaufruf durch einen entsprechenden zu ersetzen mysqli_*
, zumindest wenn Sie bereit sind, die prozedurale API zu verwenden - was der einfachere Weg wäre, wenn Sie bereits einen Code auf der Basis der MySQL-API haben, die ist eine prozedurale.
Um dies zu unterstützen, ist die Zusammenfassung der MySQLi-Erweiterungsfunktionen auf jeden Fall hilfreich.
Zum Beispiel:
mysql_connect
wird ersetzt durchmysqli_connect
mysql_error
wird je nach Kontext durchmysqli_error
und / oder ersetztmysqli_connect_error
mysql_query
wird ersetzt durchmysqli_query
- und so weiter
Hinweis: Für einige Funktionen müssen Sie die Parameter möglicherweise sorgfältig prüfen: Vielleicht gibt es hier und da einige Unterschiede - aber nicht so viele, würde ich sagen: Sowohl mysql als auch mysqli basieren auf derselben Bibliothek (libmysql; mindestens für PHP <= 5.2)
Zum Beispiel:
- Mit MySQL müssen Sie die
mysql_select_db
Verbindung verwenden, um anzugeben, auf welcher Datenbank Sie Ihre Abfragen durchführen möchten - Auf der anderen Seite können Sie mit mysqli diesen Datenbanknamen als vierten Parameter für angeben
mysqli_connect
. - Es gibt aber auch eine
mysqli_select_db
Funktion, die Sie verwenden können, wenn Sie es vorziehen.
Wenn Sie damit fertig sind, versuchen Sie, die neue Version Ihres Skripts auszuführen ... und prüfen Sie, ob alles funktioniert. wenn nicht ... Zeit für die Fehlersuche ;-)
mysqli_*
prozeduralen Funktionen zuerst zwei Parameter umgeschaltet wurden. Alter Stil war mysql_*(q, link, ...)
und neuer Stil ist mysqli_*(link, q, ...)
.
(Mir ist klar, dass dies alt ist, aber es kommt immer noch ...)
Wenn Sie ersetzen Sie mysql_*
mit mysqli_*
tragen dann daran , dass eine ganze Menge von mysqli_*
Funktionen der Datenbankverbindung müssen weitergegeben werden.
Z.B:
mysql_query($query)
wird
mysqli_query($link, $query)
Das heißt, viele Überprüfungen erforderlich.
Am einfachsten gehe ich immer damit um
$con = mysqli_connect($serverName,$dbusername,$dbpassword);
Austausch in 3 Schritten in der folgenden Reihenfolge
- Alle " mysql_select_db ( " mit " mysqli_select_db ($ con, "
- Alle " mysql_query ( " mit " mysqli_query ($ con, " und "
- Alles " mysql_ " mit " mysqli_ ".
Das funktioniert bei mir immer
function
Zeichenfolgen gesucht wird und ein global $con;
über dem Funktionsinhalt platziert wird, da $con
die außerhalb der Funktion definierten Zeichen aufgrund des Gültigkeitsbereichs der Variablen in PHP standardmäßig nicht verfügbar sind.
Ich würde vorläufig empfehlen, PDO für Ihren SQL-Zugriff zu verwenden.
Dann muss nur noch der Treiber geändert und sichergestellt werden, dass SQL auf dem neuen Backend funktioniert. In der Theorie. Die Datenmigration ist ein anderes Thema.
Der Zugriff auf abstrakte Datenbanken ist großartig.
Bei großen Projekten müssen viele Dateien geändert werden und auch wenn die vorherige Projektversion von PHP 5.6 war und die neue Version 7.1 ist, können Sie eine neue Datei sql.php erstellen und diese in den Header einfügen oder an einer beliebigen Stelle verwenden Zeit und braucht SQL-Verbindung. Zum Beispiel:
//local
$sql_host = "localhost";
$sql_username = "root";
$sql_password = "";
$sql_database = "db";
$mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database );
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
// /* change character set to utf8 */
if (!$mysqli->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit();
} else {
// printf("Current character set: %s\n", $mysqli->character_set_name());
}
if (!function_exists('mysql_real_escape_string')) {
function mysql_real_escape_string($string){
global $mysqli;
if($string){
// $mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database );
$newString = $mysqli->real_escape_string($string);
return $newString;
}
}
}
// $mysqli->close();
$conn = null;
if (!function_exists('mysql_query')) {
function mysql_query($query) {
global $mysqli;
// echo "DAAAAA";
if($query) {
$result = $mysqli->query($query);
return $result;
}
}
}
else {
$conn=mysql_connect($sql_host,$sql_username, $sql_password);
mysql_set_charset("utf8", $conn);
mysql_select_db($sql_database);
}
if (!function_exists('mysql_fetch_array')) {
function mysql_fetch_array($result){
if($result){
$row = $result->fetch_assoc();
return $row;
}
}
}
if (!function_exists('mysql_num_rows')) {
function mysql_num_rows($result){
if($result){
$row_cnt = $result->num_rows;;
return $row_cnt;
}
}
}
if (!function_exists('mysql_free_result')) {
function mysql_free_result($result){
if($result){
global $mysqli;
$result->free();
}
}
}
if (!function_exists('mysql_data_seek')) {
function mysql_data_seek($result, $offset){
if($result){
global $mysqli;
return $result->data_seek($offset);
}
}
}
if (!function_exists('mysql_close')) {
function mysql_close(){
global $mysqli;
return $mysqli->close();
}
}
if (!function_exists('mysql_insert_id')) {
function mysql_insert_id(){
global $mysqli;
$lastInsertId = $mysqli->insert_id;
return $lastInsertId;
}
}
if (!function_exists('mysql_error')) {
function mysql_error(){
global $mysqli;
$error = $mysqli->error;
return $error;
}
}
Der ultimative Leitfaden zum Upgrade von mysql_*
Funktionen auf die MySQLi-API
Der Grund für die neue mysqli-Erweiterung bestand darin, die neuen Funktionen von MySQL-Systemen ab Version 4.1.3 zu nutzen. Wenn Sie Ihren vorhandenen Code von mysql_*
zur mysqli-API ändern, sollten Sie diese Verbesserungen nutzen, da sonst Ihre Upgrade-Bemühungen vergeblich werden könnten.
Die mysqli-Erweiterung bietet eine Reihe von Vorteilen. Die wichtigsten Verbesserungen gegenüber der mysql-Erweiterung sind:
- Objektorientierte Schnittstelle
- Unterstützung für vorbereitete Anweisungen
- Erweiterte Debugging-Funktionen
Beim Upgrade von mysql_*
Funktionen auf MySQLi müssen diese Funktionen sowie einige Änderungen in der Art und Weise, wie diese API verwendet werden soll, berücksichtigt werden.
1. Objektorientierte Schnittstelle versus prozedurale Funktionen.
Die neue objektorientierte Oberfläche von mysqli ist eine große Verbesserung gegenüber den älteren Funktionen und kann Ihren Code sauberer und weniger anfällig für Tippfehler machen. Es gibt auch die prozedurale Version dieser API, von deren Verwendung wird jedoch abgeraten, da sie zu weniger lesbarem Code führt, der fehleranfälliger ist.
Um mit MySQLi eine neue Verbindung zur Datenbank herzustellen, müssen Sie eine neue Instanz der MySQLi-Klasse erstellen.
$mysqli = new \mysqli($host, $user, $password, $dbName);
$mysqli->set_charset('utf8mb4');
Mit prozeduralem Stil würde es so aussehen:
$mysqli = mysqli_connect($host, $user, $password, $dbName);
mysqli_set_charset($mysqli, 'utf8mb4');
Beachten Sie, dass nur die ersten 3 Parameter mit denen in identisch sind mysql_connect
. Der gleiche Code in der alten API wäre:
$link = mysql_connect($host, $user, $password);
mysql_select_db($dbName, $link);
mysql_query('SET NAMES utf8');
Wenn Ihr PHP-Code auf einer impliziten Verbindung mit in php.ini definierten Standardparametern beruhte, müssen Sie jetzt die MySQLi-Verbindung öffnen, die die Parameter in Ihrem Code übergibt, und dann den Verbindungslink zu allen prozeduralen Funktionen bereitstellen oder den OOP-Stil verwenden.
Weitere Informationen finden Sie im Artikel: So stellen Sie mithilfe von mysqli eine ordnungsgemäße Verbindung her
2. Unterstützung für vorbereitete Anweisungen
Dies ist eine große. MySQL hat Unterstützung für native vorbereitete Anweisungen in MySQL 4.1 (2004) hinzugefügt. Vorbereitete Anweisungen sind der beste Weg, um SQL-Injection zu verhindern . Es war nur logisch, dass die Unterstützung für native vorbereitete Anweisungen zu PHP hinzugefügt wurde. Vorbereitete Anweisungen sollten verwendet werden , wenn Daten mit der SQL - Anweisung werden muss entlang geführt (dh WHERE
, INSERT
oder UPDATE
sind die üblichen Anwendungsfälle).
Die alte MySQL API hatte eine Funktion , um die Zeichenfolge in SQL verwendet zu entkommen genannt mysql_real_escape_string
, aber es wurde nie zum Schutz vor SQL - Injektionen gedacht und soll natürlich nicht für den Zweck verwendet werden.
Die neue MySQLi-API bietet eine Ersatzfunktion mysqli_real_escape_string
für die Abwärtskompatibilität, die dieselben Probleme wie die alte aufweist und daher nur verwendet werden sollte, wenn vorbereitete Anweisungen verfügbar sind.
Der alte mysql_ * Weg:
$login = mysql_real_escape_string($_POST['login']);
$result = mysql_query("SELECT * FROM users WHERE user='$login'");
Der vorbereitete Statement-Weg:
$stmt = $mysqli->prepare('SELECT * FROM users WHERE user=?');
$stmt->bind_param('s', $_POST['login']);
$stmt->execute();
$result = $stmt->get_result();
Vorbereitete Anweisungen in MySQLi können Anfängern etwas abschreckend wirken. Wenn Sie ein neues Projekt starten, ist es möglicherweise eine gute Idee, die leistungsfähigere und einfachere PDO- API zu verwenden.
3. Erweiterte Debugging-Funktionen
Einige PHP-Entwickler alter Schule sind es gewohnt, manuell nach SQL-Fehlern zu suchen und diese beim Debuggen direkt im Browser anzuzeigen. Eine solche Praxis erwies sich jedoch nicht nur als umständlich, sondern auch als Sicherheitsrisiko. Zum Glück hat MySQLi die Funktionen zur Fehlerberichterstattung verbessert.
MySQLi kann alle aufgetretenen Fehler als PHP-Ausnahmen melden. PHP-Ausnahmen sprudeln im Skript und werden sofort beendet, wenn sie nicht behandelt werden. Dies bedeutet, dass keine Anweisung nach der fehlerhaften jemals ausgeführt wird. Die Ausnahme löst einen schwerwiegenden PHP-Fehler aus und verhält sich wie ein Fehler, der vom PHP-Core ausgelöst wird, wenn die Einstellungen display_errors
und log_errors
beachtet werden. Um MySQLi-Ausnahmen zu aktivieren, verwenden Sie die Zeile mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
und fügen Sie sie ein, bevor Sie die DB-Verbindung öffnen.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli($host, $user, $password, $dbName);
$mysqli->set_charset('utf8mb4');
Wenn Sie es gewohnt wären, Code zu schreiben, wie zum Beispiel:
$result = mysql_query('SELECT * WHERE 1=1');
if (!$result) {
die('Invalid query: ' . mysql_error());
}
oder
$result = mysql_query('SELECT * WHERE 1=1') or die(mysql_error());
Sie müssen nicht mehr die()
in Ihrem Code.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli($host, $user, $password, $dbName);
$mysqli->set_charset('utf8mb4');
$result = $mysqli->query('SELECT * FROM non_existent_table');
// The following line will never be executed due to the mysqli_sql_exception being thrown above
foreach ($result as $row) {
// ...
}
Wenn Sie aus irgendeinem Grund keine Ausnahmen verwenden können, verfügt MySQLi über entsprechende Funktionen zum Abrufen von Fehlern. Mit können Sie mysqli_connect_error()
nach Verbindungsfehlern und mysqli_error($mysqli)
anderen Fehlern suchen. Beachten Sie das obligatorische Argument in mysqli_error($mysqli)
oder halten Sie sich alternativ an den OOP-Stil und die Verwendung $mysqli->error
.
$result = $mysqli->query('SELECT * FROM non_existent_table') or trigger_error($mysqli->error, E_USER_ERROR);
Weitere Erklärungen finden Sie in diesen Beiträgen:
mysqli oder die, muss es sterben?
Wie erhalte ich MySQLi-Fehlerinformationen in verschiedenen Umgebungen?
4. Andere Änderungen
Leider hat nicht jede Funktion von mysql_*
ihr Gegenstück in MySQLi nur ein "i" im Namen und im Verbindungslink als ersten Parameter. Hier ist eine Liste von einigen von ihnen:
mysql_client_encoding()
wurde ersetzt durchmysqli_character_set_name($mysqli)
mysql_create_db
hat kein Gegenstück. Verwenden Sie vorbereitete Anweisungen odermysqli_query
stattdessenmysql_drop_db
hat kein Gegenstück. Verwenden Sie vorbereitete Anweisungen odermysqli_query
stattdessenmysql_db_name
&mysql_list_dbs
Support wurde zugunsten von SQL eingestelltSHOW DATABASES
mysql_list_tables
Unterstützung wurde zugunsten von SQL eingestelltSHOW TABLES FROM dbname
mysql_list_fields
Unterstützung wurde zugunsten von SQL eingestelltSHOW COLUMNS FROM sometable
mysql_db_query
-> benutzemysqli_select_db()
dann die Abfrage oder gib den DB-Namen in der Abfrage anmysql_fetch_field($result, 5)
-> der zweite Parameter (Offset) ist in nicht vorhandenmysqli_fetch_field
. Sie können untermysqli_fetch_field_direct
Berücksichtigung der verschiedenen zurückgegebenen Ergebnisse verwendenmysql_field_flags
,mysql_field_len
,mysql_field_name
,mysql_field_table
&mysql_field_type
-> wurde ersetzt mitmysqli_fetch_field_direct
mysql_list_processes
wurde entfernt. Wenn Sie eine Thread-ID benötigen, verwenden Siemysqli_thread_id
mysql_pconnect
wurde durchmysqli_connect()
mitp:
Host-Präfix ersetztmysql_result
->mysqli_data_seek()
in Verbindung mitmysqli_field_seek()
und verwendenmysqli_fetch_field()
mysql_tablename
Unterstützung wurde zugunsten von SQL eingestelltSHOW TABLES
mysql_unbuffered_query
wurde entfernt. Weitere Informationen finden Sie in diesem Artikel. Gepufferte und ungepufferte Abfragen
mysql_set_charset
es mit MySQL <5.0.7 nicht verfügbar. Ich wollte auf den Unterschied hinweisen, wie die Dinge damals und heute gemacht wurden, anstatt 1 zu 1 Ersatz zu sein.
Wenn Sie eine Menge Dateien in Ihren Projekten ändern müssen, können Sie Funktionen mit den gleichen Namen wie mysql-Funktionen erstellen und in den Funktionen die Konvertierung wie folgt durchführen:
$sql_host = "your host";
$sql_username = "username";
$sql_password = "password";
$sql_database = "database";
$mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database );
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
function mysql_query($query){
$result = $mysqli->query($query);
return $result;
}
function mysql_fetch_array($result){
if($result){
$row = $result->fetch_assoc();
return $row;
}
}
function mysql_num_rows($result){
if($result){
$row_cnt = $result->num_rows;;
return $row_cnt;
}
}
Hier finden Sie ein vollständiges Tutorial, wie Sie es schnell erstellen können, wenn Sie nach einem PHP-Upgrade erneut eine Website erstellen müssen. Ich habe es nach dem Upgrade des Hostings für meine Kunden von 5.4 (OMG !!!) auf 7.x PHP-Version verwendet.
Dies ist eine Problemumgehung und es ist besser, den gesamten Code mit PDO oder der mysqli-Klasse zu schreiben.
1. Verbindungsdefinition
Zuallererst müssen Sie die Verbindung zu einer neuen Variablen setzen $link
oder $con
oder was auch immer Sie wollen.
Beispiel
Ändern Sie die Verbindung von:
@mysql_connect($host, $username, $password) or die("Error message...");
@mysql_select_db($db);
oder
@mysql_connect($host, $username, $password, $db) or die("Error message...");
zu:
$con = mysqli_connect($host, $username, $password, $db) or die("Error message...");
2. mysql_ * änderung
Mit Notepad ++ verwende ich "In Dateien suchen" (Strg + Umschalt + F):
In der folgenden Reihenfolge wähle ich "In Dateien ersetzen":
mysql_query (-> mysqli_query ($ con,
mysql_error () -> mysqli_error ($ con)
mysql_close () -> mysqli_close ($ con)
mysql_ -> mysqli_
3. Anpassungen
Wenn Sie eine Fehlermeldung erhalten, liegt dies möglicherweise daran, dass Ihr $ con über Ihre Funktionen nicht erreichbar ist.
Sie müssen global $con;
in all Ihren Funktionen eine hinzufügen , zum Beispiel:
function my_function(...) {
global $con;
...
}
In der SQL-Klasse stellen Sie die Verbindung zu $this->con
statt $con
. und ersetzen Sie es in jeder Funktion Aufruf (zB mysqli_query($con, $query);
)
Ich hoffe es hilft.
Obwohl dieses Thema ein Jahrzehnt alt ist, muss ich häufig vorhandene Anwendungen, die sich auf die mysql
Erweiterung stützten, zurücksetzen. Die ursprünglichen Programmierer waren zu faul, um den gesamten Code umzugestalten, und fordern die Kunden auf, sicherzustellen, dass sie das neueste PHP 5.6 ausführen Version verfügbar.
PHP 5.6 ist jetzt offiziell veraltet. Mit anderen Worten, die Entwickler hatten ein Jahrzehnt Zeit, ihre Abhängigkeiten zu beseitigen mysql
und zu PDO
(oder, na ja , mysqli
...) zu wechseln . Aber ... so viel alten Code zu ändern ist teuer, und nicht jeder Manager ist bereit, für die unzähligen Stunden zu zahlen, um Projekte mit zehntausenden Zeilen zu reparieren.
Ich habe nach vielen Lösungen gesucht und in meinem Fall oft die von @ esty-shlomovitz vorgestellte Lösung verwendet - aber in der Zwischenzeit habe ich noch etwas Besseres gefunden:
https://www.phpclasses.org/package/9199-PHP-Replace-mysql-functions- using-the-mysqli-extension.html
(Sie müssen sich registrieren, um es herunterzuladen, aber das dauert nur eine Minute.)
Dies sind nur zwei Dateien, die als Ersatz für die gesamte mysql
Erweiterung fungieren und so ziemlich alles (mit mysqli
) sehr geschickt emulieren, ohne sich darum kümmern zu müssen. Natürlich ist es keine perfekte Lösung, aber es wird sehr wahrscheinlich in 99% aller Fälle funktionieren.
Außerdem finden Sie hier ein gutes Tutorial zum Umgang mit den Aufgaben der Migration (mit einer Auflistung der häufigsten Gefahren bei der Migration): https://www.phpclasses.org/blog/package/9199/post/3-Smoothly- Migrieren Sie Ihren PHP-Code mit der alten MySQL-Erweiterung nach MySQLi.html
(Wenn Sie dies im Jahr 2030 lesen und die PHPclasses-Website nicht verfügbar ist, können Sie es jederzeit mit archive.org versuchen :-)
Mit Notepad ++ können Sie eine Massenermittlung durchführen und ersetzen, wenn Folgendes zutrifft:
Finden: mysql_
Ersetzen: mysqli_
Suchen: _query (
Ersetzen Sie: _query ($ conn,
Das Folgende muss geändert werden, aber es hängt davon ab, wie Sie eine Verbindung herstellen ...
Aktualisieren Sie die Verbindungszeichenfolge in config.php wie folgt:
$conn = mysqli_connect($db_host, $db_username, $db_password, $db_name) or die("Unable to Connect");
Hoffe das hilft.
Mein einfaches Shell-Skript zum Ändern von mysql in mysqli in allen PHP-Dateien im Verzeichnis:
for I in *.php
do
cat $I | sed s/'mysql_select_db('/'mysqli_select_db($link,'/ |
sed s/'mysql_query('/'mysqli_query($link,'/|
sed s/mysql_/mysqli_/ > tmpf;
mv tmpf $I;
done