Kann ich MySQL-APIs in PHP mischen?

106

Ich habe das Netz durchsucht und bisher habe ich gesehen, dass Sie verwenden können mysql_und mysqli_zusammen bedeuten:

<?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

Zum ersten und gleichen außer mit mysqli_close(). Für den zweiten.

Was ist das Problem? Kann ich nicht mysql_und mysqlizusammen verwenden? Oder ist es normal? Kann ich auf diese Weise überprüfen, ob die Verbindungen überhaupt gültig sind? (die if(mysq...))

N3mo
quelle
5
MySQL ist veraltet, es macht nur Sinn, dass sie nicht zusammenarbeiten würden. Warum versuchst du das?
Sterling Archer
7
Sie sollten die Verwendung von mysql_*Funktionen insgesamt vermeiden . Sie sind fehleranfällig und unsicher und werden bald aus PHP entfernt (sie werden derzeit als veraltet markiert ). [Diese großartige Antwort] [0] erklärt ausführlicher, warum sie schlecht sind. [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan
2
1) Sie bestehen darauf, eine alte schlampige Schnittstelle (MySQL) zu verwenden, die seit Äonen im Dokument als veraltet markiert ist. 2) Aus irgendeinem Grund möchten Sie sie mit ihrem Nachfolger mischen, anstatt das Richtige zu tun und auf die neue zu konvertieren. 3 ) Sie sind so überrascht, dass es nicht funktioniert, dass Sie SO danach fragen, obwohl es ziemlich offensichtlich sein sollte, dass das, was Sie tun, Unsinn ist.
fvu
1
Es ist kein Aberglaube. Natürlich können Sie schlechten Code mit mysqli_*Funktionen und guten Code mit mysql_*solchen schreiben . Die letztere Kategorie wird jedoch als veraltet markiert, da es sich um die minderwertige Gruppe von Funktionen handelt, die keine Aufrufe im OO-Stil oder sogar vorbereitete Anweisungen unterstützen können (um nur zwei Beispiele zu nennen). Ist die richtige Antwort nicht offensichtlich, wenn zwei Tools ausgewählt werden, um denselben Job zu erledigen, von denen eines auf lange Sicht eindeutig besser und flexibler ist?
Andrei Bârsan
1
Natürlich nicht. Angesichts der Möglichkeit, zwischen der veralteten und der aktiv unterstützten Funktionalität zu wählen, um beispielsweise Ihre eigene Abstraktion zu rollen, warum sollten Sie die alten Funktionen verwenden?
Andrei Bârsan

Antworten:

65

Nein, Sie können nicht mysqlund mysqlizusammen verwenden. Sie sind separate APIs und die von ihnen erstellten Ressourcen sind nicht miteinander kompatibel.

Es gibt jedoch eine mysqli_close.

Explosionspillen
quelle
Obwohl Sie die Verbindung sowieso nie schließen müssen sollten; Objekte bereinigen sich, wenn sie nirgendwo mehr referenziert werden. (Nicht sicher, ob einfache alte Ressourcen das tun, aber Objekte können RAII tatsächlich in nicht unerheblichem Maße nutzen.)
CHA
@cHao nicht nur das, aber PHP wird alle offenen MySQL-Verbindungen schließen, wenn das Skript beendet wird
Explosion Pills
1
Aber meiner Erfahrung nach nicht immer, also setzen wir immer einen Abschluss am Ende der Datei.
RationalRabbit
14

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

Sie können keine der drei mischen ( mysql_*, mysqli_*,PDO zusammen von PHP) MYSQL - API, es funktioniert einfach nicht. Es ist sogar in den manuellen FAQ :

Es ist nicht möglich, die Erweiterungen zu mischen . So funktioniert beispielsweise das Übergeben einer mysqli-Verbindung an PDO_MySQL oder ext / mysql nicht .


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

Rizier123
quelle
Ein Typ hat heute versucht, mir zu sagen, dass sie keine Probleme / Fehler haben, wenn sie mysql_real_escape_string()mit dem Rest ihres Codes mischen , der PDO ist. Gibt es etwas, das ich in meiner Zeit mit der Arbeit mit diesen verschiedenen APIs nicht hierher gebracht habe? Bin ich der Unwissende hier? Dies ist für die "jetzt gelöschte" Frage stackoverflow.com/q/34209127 nur für mehr als 10.000 Mitglieder sichtbar, sollte sich jemand fragen. Dies in Bezug auf $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Vermisse ich hier etwas?
Funk Forty Niner
1
@ Fred-ii- Du hast recht :) Das Lesen des Handbuchs zeigt, dass du richtig bist . Was wahrscheinlich passiert ist, ist, dass mysql_real_escape_string()im Stillen versucht wird , eine Verbindung mit den Standardparametern herzustellen, die dann für OP funktionierten. Es wurde also nur die Verbindung hergestellt, um den Zeichensatz zu erhalten. OP hat also 2 Verbindungen
Rizier123
Wenn das OP mir / uns zumindest gesagt hätte, dass sie wahrscheinlich zwei getrennte Verbindungen haben, hätte ich wahrscheinlich zugestimmt; sie entschieden sich anders. Ich kann jedoch immer noch nicht sehen, wie das noch funktionieren würde. Wenn ja, bin ich verblüfft.
Funk Forty Niner
@ Fred-ii- Siehe: link_identifier Es werden die Standardverbindungseinstellungen verwendet, mit denen es abgerufen wird ini_get(). Es funktioniert also wahrscheinlich nur für OP mit den Standardeinstellungen. Ich würde es einfach verlassen und mir einen neuen Kaffee holen (☕☕☕).
Rizier123
Vielleicht möchten Sie etwas hinzufügen sqlsrv_query(). Ich habe gerade eine Frage hier geschlossen stackoverflow.com/q/41263771
Funk Forty Niner
2

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

Sie sollten jedoch mehrere Verbindungen aus demselben Skript vermeiden , unabhängig davon, ob es sich um eine einzelne oder eine andere API handelt. Dies wird Ihren Datenbankserver belasten und seine Ressourcen erschöpfen. Obwohl dies technisch möglich ist, sollten Sie nicht verschiedene Erweiterungen in Ihrem Code mischen, außer für die kurze Zeit des Refactorings.

Ihr gesunder Menschenverstand
quelle
Dies ist wahrscheinlich eine gute Idee, aber aus diesem Grund wurde das Verbindungspooling entwickelt. Wenn mehrere Webanforderungen auf einen Webserver treffen, können Sie nicht einfach dieselbe Verbindung verwenden, sodass Sie eine neue Verbindung öffnen. Durch das Verbindungspooling wird der Overhead auf dem App-Server und der Datenbank gespart.
Doug
-3

MySQLiist viel sicherer als MySQLdas, was jetzt sowieso veraltet ist. Deshalb sollten Sie dabei bleiben MySQLiund können sie auch nicht mischen, da beide unterschiedlich sind.

Dämmerung -inaktiv-
quelle