Kann ich MySQL-APIs in PHP mischen?

Lesezeit: 5 Minuten

Kann ich MySQL APIs in PHP mischen
N3mo

Ich habe im Netz gesucht und bisher gesehen, was Sie verwenden können mysql_ und mysqli_ zusammen bedeutet:

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

oder

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

Sind gültig, aber wenn ich diesen Code verwende, bekomme ich Folgendes:

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

Für das erste und das gleiche außer mit mysqli_close(). Für den zweiten.

Was ist das Problem? Kann ich nicht verwenden mysql_ und mysqli zusammen? Oder ist es normal? Wie kann ich überprüfen, ob die Verbindungen überhaupt gültig sind? (der if(mysq...))

  • mysql ist veraltet, es macht nur Sinn, dass sie nicht zusammenarbeiten würden. Warum versuchst du das..?

    – Sterling Archer

    5. Juli 2013 um 23:50 Uhr


  • Sie sollten die Verwendung vermeiden mysql_* funktioniert insgesamt. Sie sind fehleranfällig und unsicher und werden bald aus PHP entfernt (sie sind als veraltet im Augenblick). [This great answer][0] geht ins Detail erklärend warum Sie sind schlecht. [0]: stackoverflow.com/a/12860046/1055295

    – Andrei Barsan

    5. Juli 2013 um 23:52 Uhr

  • 1) Sie bestehen darauf, eine alte schäbige Schnittstelle (mysql) zu verwenden, die seit Ewigkeiten im Dokument als veraltet gekennzeichnet ist 2) Sie möchten sie aus irgendeinem seltsamen Grund mit ihrem Nachfolger mischen, anstatt das Richtige zu tun und auf die neue umzuwandeln 3 ) Sie sind so überrascht, dass es nicht funktioniert, dass Sie bei SO danach fragen, obwohl es ziemlich offensichtlich sein sollte, dass das, was Sie tun, Unsinn ist.

    – fvu

    6. Juli 2013 um 0:06 Uhr

  • Es ist kein Aberglaube. Natürlich kann man mit schlechten Code schreiben mysqli_* Funktionen und guter Code mit mysql_* Einsen. Aber die letztgenannte Kategorie wird als veraltet markiert, da es sich um den minderwertigen Satz von Funktionen handelt, die keine Aufrufe im OO-Stil oder sogar vorbereitete Anweisungen unterstützen können (um nur zwei Beispiele zu nennen). Liegt die richtige Antwort nicht auf der Hand, wenn man zwei Tools zur Wahl hat, um die gleiche Arbeit zu erledigen, von denen eines auf lange Sicht eindeutig besser und flexibler ist?

    – Andrei Barsan

    6. Juli 2013 um 8:22 Uhr

  • Natürlich nicht. Wenn Sie jedoch die Möglichkeit haben, zwischen der veralteten Funktionalität und der aktiv unterstützten zu wählen, um beispielsweise Ihre eigene Abstraktion zu erstellen, warum sollten Sie dann die alten Funktionen verwenden?

    – Andrei Barsan

    6. Juli 2013 um 9:54 Uhr

Nein, kannst du nicht verwenden mysql und mysqli zusammen. Sie sind separate APIs und die von ihnen erstellten Ressourcen sind nicht miteinander kompatibel.

Da ist ein mysqli_closeobwohl.

  • Obwohl Sie die Verbindung sowieso nie schließen müssen; Objekte bereinigen sich selbst, wenn sie nirgendwo mehr referenziert werden. (Ich bin mir nicht sicher, ob einfache alte Ressourcen das tun, aber Objekte können RAII tatsächlich in einem nicht unerheblichen Maße nutzen.)

    – chao

    5. Juli 2013 um 23:54 Uhr


  • @cHao nicht nur das, sondern PHP schließt alle offenen MySQL-Verbindungen, wenn das Skript beendet wird

    – Explosionspillen

    5. Juli 2013 um 23:56 Uhr

  • Aber meiner Erfahrung nach nicht immer, also platzieren wir immer ein Schließen am Ende der Datei.

    – RationalRabbit

    31. Dezember 2017 um 21:23 Uhr

1647104054 917 Kann ich MySQL APIs in PHP mischen
Rizier123

Nur um hier eine allgemeine Antwort zu allen drei MYSQL-APIs mit einer Referenz zu geben:

Sie können keines der drei mischen (mysql_*, mysqli_*, PDO) MYSQL API’s von PHP zusammen, es funktioniert einfach nicht. Es ist sogar in der Handbuch FAQ:

es ist Ein Mischen der Erweiterungen ist nicht möglich. Also zum Beispiel eine MySQL-Verbindung an PDO_MySQL oder ext/mysql übergeben wird nicht funktionieren.


Sie müssen dieselbe MySQL-API und die zugehörigen Funktionen verwenden, von der Verbindung bis zur Abfrage.

  • Irgendein Typ hat mir heute versucht zu sagen, dass sie keine Probleme/Fehler beim Mischen haben mysql_real_escape_string() wobei der Rest ihres Codes PDO ist. Gibt es etwas, das ich in meiner Zeit bei der Arbeit mit diesen verschiedenen APIs nicht verstanden habe? Bin ich hier der Ignorant? Dies gilt für die “jetzt gelöschte” Frage stackoverflow.com/q/34209127, die nur von über 10.000 Mitgliedern angezeigt werden kann, falls sich jemand wundert. Dies in Bezug auf $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr))) – Übersehe ich hier etwas?

    – Funk Forty-Niner

    10. Dezember 2015 um 19:05 Uhr


  • @Fred-ii- Du hast Recht 🙂 Lesen der Handbuch zeigt, dass du es bist Korrekt. Was wahrscheinlich passiert ist, ist das mysql_real_escape_string() Wille schweigend Versuchen Stellen Sie eine Verbindung mit den Standardparametern her was dann für OP funktionierte. Es hat also nur die Verbindung hergestellt, um den Zeichensatz zu erhalten. OP hat also 2 Anschlüsse

    – Rizier123

    10. Dezember 2015 um 19:49 Uhr


  • Wenn das OP mir/uns zumindest gesagt hätte, dass sie wahrscheinlich zwei separate Verbindungen haben, hätte ich wahrscheinlich zugestimmt; sie entschieden sich anders. Allerdings kann ich mir immer noch nicht vorstellen, wie das noch funktionieren soll. Wenn ja, bin ich ratlos.

    – Funk Forty-Niner

    10. Dezember 2015 um 19:53 Uhr

  • @Fred-ii- Siehe: link_identifier Es verwendet die Standardverbindungseinstellungen, die es erhält ini_get(). Es funktioniert also wahrscheinlich nur für OP mit den Standardeinstellungen. Ich würde es einfach stehen lassen und mir neuen Kaffee holen (☕☕☕).

    – Rizier123

    10. Dezember 2015 um 19:56 Uhr

  • Vielleicht möchten Sie etwas über hinzufügen sqlsrv_query(). Ich habe gerade eine Frage hier stackoverflow.com/q/41263771 geschlossen

    – Funk Forty-Niner

    21. Dezember 2016 um 13:40 Uhr

Kann ich MySQL APIs in PHP mischen
Ihr gesunder Menschenverstand

Technisch gesehen können Sie so viele separate Verbindungen verwenden, wie Sie möchten, während Ihr Problem durch einen bloßen Tippfehler verursacht wird – Sie können nur Ressourcen einer Erweiterung nicht mit Funktionen einer anderen verwenden, was ganz offensichtlich ist.

Aber du sollte mehrere Verbindungen aus demselben Skript vermeiden, egal von einer einzelnen API oder verschiedenen. Da es Ihren Datenbankserver belastet und seine Ressourcen erschöpft. Obwohl dies technisch möglich ist, sollten Sie also nicht verschiedene Erweiterungen in Ihrem Code mischen, außer für die kurze Zeit des Refactorings.

  • Dies ist zwar wahrscheinlich eine gute Idee, aber Verbindungspooling wurde aus diesem Grund entwickelt. Wenn Sie mehrere Webanforderungen haben, die einen Webserver treffen, können Sie nicht einfach dieselbe Verbindung verwenden, also öffnen Sie eine neue Verbindung. Das Verbindungspooling spart Overhead auf dem App-Server und der Datenbank.

    – Doug

    9. Juli 2015 um 14:43 Uhr


MySQLi ist viel sicherer als MySQL was sowieso jetzt veraltet ist. Deshalb solltest du dabei bleiben MySQLi und Sie können sie auch nicht mischen, da sie beide unterschiedlich sind.

994440cookie-checkKann ich MySQL-APIs in PHP mischen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy