2013-10-23 14 views
14

Sto cercando di chiarire la differenza tra $ stmt-> close e $ stmt-> free_result()() quando si finalizza un preparato mysqli dichiarazione.


Finora io uso:

$mysqli = new mysqli(host,user,password,database); 
$stmt = $mysqli->prepare(sql statement); 
[...] 
$stmt->free_result(); 
$mysqli->close(); 

e tutto sembra funzionare bene.

Ma ho visto molti programmatori usare $ stmt-> chiudi invece di $ stmt-> free_result(). E una volta che ho visto entrambi:

$stmt->free_result(); 
$stmt->close(); 
$mysqli->close(); 

Quindi, che cosa dovrei scegliere, in quali circostanze e perché?

risposta

22

$stmt->free_result() libera memoria relativa a un set di risultati, mentre $stmt->close() libera memoria relativa a un'istruzione preparata. Successivamente, chiamando lo $stmt->close() si annulla qualsiasi risultato ancora rimanente.

In pratica, chiamando lo $stmt->close() si otterrà lo stesso effetto di chiamare $stmt->free_result() poiché annulla anche il set di risultati. Tuttavia, chiamando lo $stmt->free_result() non si cancellerà la memoria utilizzata dall'istruzione preparata, nel qual caso sarà necessario utilizzare $stmt->close().

Per quanto riguarda quale usare va - ci possono essere situazioni in cui si intende usare l'istruzione preparata avete inizializzato, ma non ha più bisogno del risultato sono impostati attualmente avete. In tal caso, attendi chiamando lo $stmt->close() finché non hai finito con la dichiarazione preparata e chiama invece $stmt->free_result() prima di eseguire un'altra istruzione.

+0

spiegazione ideale! – neophyte

2

PHP interromperà la connessione e libererà la risorsa al termine dell'esecuzione;

mysqli::closeChiude una dichiarazione preparata.

Poiché il numero di connessioni totali disponibili è limitato, liberando la risorsa il secondo che hai finito è una buona pratica.

E

mysqli_stmt::free_resultlibera memorizzato nella memoria di risultato per il dato handle di istruzione.

è buona norma liberare esplicitamente la risorsa quando non ne hai più bisogno. potrebbe evitare di sovraccaricare il server quando vengono fatte molte richieste contemporaneamente.

Entrambi non sono mai strettamente necessari per invocare, ed è una buona pratica l'uso di entrambi.