Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
166 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt um 24.09.2020 15:42:12 Uhr aktualiesiert

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_error()."'
"); 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 = '
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:

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_dbVerbindung 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_dbFunktion, 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 ;-)

Solange Sie den prozeduralen Code beibehalten möchten, sollte der Wechsel von mysql zu mysqli nicht zu schwierig sein. Wenn Ihre Codebasis jedoch nicht zu groß ist (dh das Wechseln von einer API zur anderen würde nicht zu viel Arbeit bedeuten), möchten Sie möglicherweise eine objektorientierte API verwenden. es wird allerdings mehr Arbeit erfordern ... Und wenn ich eine OO-API komplett neu schreiben möchte, würde ich mich für PDO entscheiden anstatt für mysqli ...
Ich meine, jetzt den ganzen Tag über die 2 nachzulesen. Soweit ich weiß, ist es nicht der Hauptunterschied zu PDO, dass Sie mit PDO ein anderes DB-System verwenden können. WENN das der einzige Vorteil ist, wäre es in meinem Fall keine große Hilfe, da ich für diese Anwendung niemals eine andere benötige.
In diesem Fall ist mysqli wahrscheinlich in Ordnung :-), zumal Sie bereits einen Code haben, der auf mysql basiert.
Es gibt Tools zur Automatisierung des Migrationsprozesses, z. B . : github.com/philip/MySQLConverterTool
Beachten Sie, dass bei einigen 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

  1. Alle " mysql_select_db ( " mit " mysqli_select_db ($ con, "
  2. Alle " mysql_query ( " mit " mysqli_query ($ con, " und "
  3. Alles " mysql_ " mit " mysqli_ ".

Das funktioniert bei mir immer

Ich würde hinzufügen, dass nach allen functionZeichenfolgen gesucht wird und ein global $con;über dem Funktionsinhalt platziert wird, da $condie außerhalb der Funktion definierten Zeichen aufgrund des Gültigkeitsbereichs der Variablen in PHP standardmäßig nicht verfügbar sind.
Keine perfekte Antwort - einige Funktionen müssen noch den $ con-Parameter hinzufügen (z. B. mysqi_affected_rows, mysqi_real_escape_string) - aber hilfreich, da er die Art der erforderlichen Änderungen zusammenfasst.
Vergessen Sie auch nicht, dass mysql_error () zu mysqli_error ($ con) geändert wird

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;
    }
}
und wie soll ich das nutzen um mit mysqli funktionen zu testen ??? Beispiel: Ihre Datei prüft zuerst, ob mysql_query beendet wird, wenn dies für 5.6 verwendet wird. Wie wird jedoch geprüft, ob mysqli_query funktioniert?
Wie kann ich test mysqli_query (???, $ q) explizieren;
und benutze es: <pre> $ id_cat = (int) '4'; $ sql = "AUS Kategorien LÖSCHEN WHERE id = '$ id_cat' ODER parent_id = '$ id_cat'"; mysql_query ($ sql) oder die ('Error SQL! <br />'. $ sql. <br /> '.mysql_error ()); </ pre>

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, INSERToder UPDATEsind 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_stringfü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_errorsund log_errorsbeachtet 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 durch mysqli_character_set_name($mysqli)
  • mysql_create_dbhat kein Gegenstück. Verwenden Sie vorbereitete Anweisungen oder mysqli_querystattdessen
  • mysql_drop_dbhat kein Gegenstück. Verwenden Sie vorbereitete Anweisungen oder mysqli_querystattdessen
  • mysql_db_name& mysql_list_dbsSupport wurde zugunsten von SQL eingestelltSHOW DATABASES
  • mysql_list_tables Unterstützung wurde zugunsten von SQL eingestellt SHOW TABLES FROM dbname
  • mysql_list_fields Unterstützung wurde zugunsten von SQL eingestellt SHOW COLUMNS FROM sometable
  • mysql_db_query-> benutze mysqli_select_db()dann die Abfrage oder gib den DB-Namen in der Abfrage an
  • mysql_fetch_field($result, 5)-> der zweite Parameter (Offset) ist in nicht vorhanden mysqli_fetch_field. Sie können unter mysqli_fetch_field_directBerücksichtigung der verschiedenen zurückgegebenen Ergebnisse verwenden
  • mysql_field_flags, mysql_field_len, mysql_field_name, mysql_field_table& mysql_field_type-> wurde ersetzt mitmysqli_fetch_field_direct
  • mysql_list_processeswurde entfernt. Wenn Sie eine Thread-ID benötigen, verwenden Siemysqli_thread_id
  • mysql_pconnectwurde durch mysqli_connect()mit p:Host-Präfix ersetzt
  • mysql_result-> mysqli_data_seek()in Verbindung mit mysqli_field_seek()und verwendenmysqli_fetch_field()
  • mysql_tablename Unterstützung wurde zugunsten von SQL eingestellt SHOW TABLES
  • mysql_unbuffered_querywurde entfernt. Weitere Informationen finden Sie in diesem Artikel. Gepufferte und ungepufferte Abfragen
Die Antwort ist eine gute Überraschung, da Sie für diese Art von Frage eher eine unbrauchbare Bemerkung außerhalb des Regelkreises erwarten. Ich glaube, es wird die gebührende Anerkennung bekommen. Nur ein paar Trottel. Es gibt auch mysql_set_charset (), nur einen Factcheck; Ich würde mres () nicht die Schuld geben, dass es "nicht ausreicht, um SQL-Injektionen zu verhindern". Sie können kein Beil dafür verantwortlich machen, dass Sie Ihre Protokolle nicht gesägt haben. Ich würde es eher so ausdrücken: "Es war nie zum Schutz gedacht und sollte natürlich nicht für diesen Zweck verwendet werden" Euer gesunder Menschenverstand,
@YourCommonSense Danke, ich habe den Wortlaut geändert. In Bezug auf die mysql_set_charsetes 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 $linkoder $conoder 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):

Suchen und Ersetzen von Notepad ++ Box

In der folgenden Reihenfolge wähle ich "In Dateien ersetzen":

  1. mysql_query (-> mysqli_query ($ con,

  2. mysql_error () -> mysqli_error ($ con)

  3. mysql_close () -> mysqli_close ($ con)

  4. 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->constatt $con. und ersetzen Sie es in jeder Funktion Aufruf (zB mysqli_query($con, $query);)

Ich hoffe es hilft.

Diese APIs sind so unterschiedlich, dass Sie kein Upgrade mit Suchen und Ersetzen durchführen können. Die Funktionalität und die Art und Weise, wie Sie sie verwenden, wurden geändert. Wenn Sie nur suchen und ersetzen, verpassen Sie den Punkt, an dem mysql_ * API
Dies ist nicht DIE Lösung, aber wenn Sie eine Website erben und keine Zeit haben, den gesamten Code neu zu schreiben, ist dies eine Problemumgehung @Dharman und es funktioniert,Meloman

Obwohl dieses Thema ein Jahrzehnt alt ist, muss ich häufig vorhandene Anwendungen, die sich auf die mysqlErweiterung 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 mysqlund 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 mysqlErweiterung 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.

Diese APIs sind so unterschiedlich, dass Sie kein Upgrade mit Suchen und Ersetzen durchführen können. Die Funktionalität und die Art und Weise, wie Sie sie verwenden, wurden geändert. Wenn Sie nur suchen und ersetzen, verpassen Sie den Punkt, an dem mysql_ * API Dharman Uhr entfernt wurde

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