Posso combinare le API MySQL in PHP?


106

Ho cercato in rete e finora quello che ho visto è che puoi usare mysql_e mysqli_insieme significano:

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

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

o

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

Sono validi ma quando utilizzo questo codice ciò che ottengo è:

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

Per il primo e lo stesso tranne con mysqli_close(). Per il secondo.

Qual è il problema? Non posso usare mysql_e mysqliinsieme? O è normale? È il modo in cui posso verificare se le connessioni sono valide? (il if(mysq...))


5
mysql è deprecato, ha senso che non funzionino insieme. Perché stai cercando di farlo ..?
Sterling Archer

7
Dovresti evitare di usare le mysql_*funzioni del tutto. Sono soggetti a errori e non sicuri e verranno presto rimossi da PHP (sono contrassegnati come deprecati al momento). [Questa ottima risposta] [0] va in modo più dettagliato spiegando perché sono cattivi. [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan

2
1) insisti nell'usare una vecchia interfaccia scadente (mysql) che viene contrassegnata come obsoleta nel documento da eoni 2) per qualche strana ragione vuoi combinarla con il suo successore invece di fare la cosa giusta e convertirla in quella nuova 3 ) sei così sorpreso che non funzioni che chiedi a SO al riguardo, anche se dovrebbe essere abbastanza ovvio che quello che stai facendo non ha senso.
fvu

1
Non è una superstizione. Ovviamente puoi scrivere codice cattivo con mysqli_*funzioni e codice buono con mysql_*quelle. Ma quest'ultima categoria è contrassegnata come deprecata poiché è l'insieme di funzioni inferiore, non essendo in grado di supportare invocazioni in stile OO o persino istruzioni preparate (per citare solo due esempi). Data la possibilità di scegliere tra due strumenti per svolgere lo stesso lavoro, uno dei quali è chiaramente migliore a lungo termine e più flessibile, non è ovvia la risposta corretta?
Andrei Bârsan

1
Ovviamente no. Tuttavia, data la possibilità di scegliere tra la funzionalità deprecata e quella supportata attivamente, ad esempio, per eseguire la propria astrazione, perché utilizzare le vecchie funzioni?
Andrei Bârsan

Risposte:


66

No, non puoi usare mysqle mysqliinsieme. Sono API separate e le risorse che creano sono incompatibili tra loro.

C'è un mysqli_close, però.


Anche se non dovresti mai comunque chiudere la connessione; gli oggetti si puliscono da soli quando non sono più referenziati da nessuna parte. (Non sono sicuro che le semplici vecchie risorse lo facciano, ma gli oggetti possono effettivamente trarre vantaggio dalla RAII in misura non trascurabile.)
cHao

@cHao non solo, ma PHP chiuderà tutte le connessioni MySQL aperte quando lo script esce
Explosion Pills

1
Ma non sempre, secondo la mia esperienza, quindi mettiamo sempre una chiusura in fondo al file.
RationalRabbit

14

Solo per dare una risposta generale qui su tutte e tre le API MYSQL con un riferimento:

Non è possibile utilizzare uno dei tre ( mysql_*, mysqli_*, PDO) MYSQL API da PHP insieme, semplicemente non funziona. È anche nelle FAQ del manuale :

Non è possibile mischiare le estensioni . Quindi, ad esempio, il passaggio di una connessione mysqli a PDO_MySQL o ext / mysql non funzionerà .


È necessario utilizzare la stessa API MySQL e le sue funzioni correlate, dalla connessione all'interrogazione.


Qualcuno ha provato a dirmi oggi che non hanno problemi / errori quando si mescolano mysql_real_escape_string()con quello che il resto del loro codice è PDO. C'è qualcosa che non ho ottenuto qui durante il mio tempo lavorando con queste diverse API? Sono io l'ignorante qui? Questo è per la domanda "ora cancellata" stackoverflow.com/q/34209127 visualizzabile solo da 10K + membri dovrebbe chiedersi qualcuno. Questo in relazione a $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Mi sto perdendo qualcosa qui?
Funk Forty Niner

1
@ Fred-ii- Hai ragione :) Leggere il manuale mostra che hai ragione . Ciò che probabilmente è accaduto è, che mysql_real_escape_string()sarà in silenzio provare stabilire una connessione con i parametri di default che poi ha lavorato per OP. Quindi ha appena stabilito la connessione per ottenere il set di caratteri. Quindi OP ha 2 connessioni
Rizier123

Se l'OP avesse almeno detto a me / noi che probabilmente avevano 2 connessioni separate, probabilmente sarei stato d'accordo; hanno deciso diversamente. Tuttavia, non riesco ancora a vedere come funzionerebbe ancora. Se lo fa, sono sconcertato.
Funk Forty Niner

@ Fred-ii- Vedi: link_identifier Userà le impostazioni di connessione predefinite, con cui si ottiene ini_get(). Quindi probabilmente funziona solo per OP con le impostazioni predefinite. Vorrei solo lasciarlo e prendere del nuovo caffè (☕☕☕).
Rizier123

Potresti aggiungere qualcosa in merito sqlsrv_query(). Ho appena chiuso una domanda qui stackoverflow.com/q/41263771
Funk Forty Niner

2

Tecnicamente puoi usare tutte le connessioni separate che vuoi, mentre il tuo problema è causato da un semplice errore di battitura: non puoi usare le risorse di un'estensione con le funzioni di un'altra, il che è abbastanza ovviamente.

Tuttavia, dovresti evitare più connessioni dallo stesso script , indipendentemente da una singola API o da altre diverse. Poiché graverà sul server del database e esaurirà le sue risorse. Quindi, anche se tecnicamente puoi, non dovresti mescolare diverse estensioni nel tuo codice, salvo per il breve periodo di refactoring.


Sebbene questa sia probabilmente una buona idea, il pool di connessioni è stato sviluppato per questo motivo. Quando si hanno più richieste Web che colpiscono un server Web, non è possibile utilizzare facilmente la stessa connessione, quindi si apre una nuova connessione. Il pool di connessioni salva l'overhead sul server app e sul database.
Doug

-3

MySQLiè molto più sicuro di quello MySQLche è comunque ora deprecato. Ecco perché dovresti restare MySQLie inoltre non puoi mescolarli poiché sono entrambi diversi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.