2012-09-20 16 views
7

Stavo facendo ricerche sulle istruzioni preparate su mysqli e ho 2 domande a riguardo.istruzione mysqli preparata, come eseguire il loop del set di risultati

Mentre leggevo, ho capire che l'ordine di esecuzione di una dichiarazione preparata simile a quanto segue:

$sql = 'SELECT image_id, filename, caption FROM images WHERE image_id = ?'; 

// connect to the database 
$conn = .... 

$stmt = $conn->stmt_init(); 

$stmt->prepare($sql); 

$stmt->bind_param('i', $id); 

$stmt->execute(); 

$stmt->bind_result($image_id, $filename, $caption); 

// optional: get total of records in the result set 
$stmt->store_result(); 
$numRows = $stmt->num_rows; 

// loop through the result set 
while ($stmt->fetch()) { 
    // code goes here... 
} 

or 

// fetch the result for one record 
$stmt->fetch() 

// free & close 
$stmt->free_result(); 
$stmt->close; 

$conn->close(); 

Qui è la mia prima domanda:

Mentre leggevo, ma anche menziona quanto segue:

Se non si associa il risultato alle variabili, utilizzare $ row = $ stmt-> fetch() e accedere a ciascuna variabile come $ row ['column_name']. Quindi,

Sono alcuni pro/contro utilizzando uno dei 2 metodi per eseguire il loop del set di risultati? Se non c'è differenza, allora perché preoccuparsi di legare il risultato usando $ stmt-> bind_result in primo luogo? Qual è il punto se posso usare $ row = $ stmt-> fetch() invece?

Ecco la mia altra domanda:

  • $ stmt-> free_result(); libera cosa esattamente? il prepare() o il store_result() o altro?
  • $ stmt-> chiudi; cosa sto chiudendo esattamente? lo stmt_init() o il prepare() o altro?

Speriamo che le vostre risposte saranno farmi capire dichiarazioni più preparati in modo che io possa costruire qualcosa di sicuro ...

Grazie

risposta

4
  • $ stmt-> free_result() fa più o meno ciò che il nome dice: libera la memoria associata a un risultato.

  • $ stmt-> close chiude l'handle dell'istruzione (il cursore in realtà), rendendo impossibile il looping del set di risultati (di nuovo).

Anche se i manual afferma: 'Si dovrebbe sempre liberare il vostro risultato con mysqli_free_result(), quando il vostro oggetto risultato non è più necessaria', pratica comune è di non usare free_result e vicino su una dichiarazione. Una volta chiuso non è più possibile utilizzare il set di risultati, o riutilizzarlo e quando php muore, la memoria viene comunque liberata.

+0

E se volessi eseguire un'altra query? liberare la memoria e lasciare aperta la maniglia dell'istruzione? o devo assolutamente chiudere l'handle dell'istruzione e riaprirene uno nuovo con $ stmt = $ conn-> stmt_init(); ? – Marco

+2

Basta eseguire un'altra query e non fare nulla con chiudi e liberi. Quando si assegna un nuovo risultato alla dichiarazione, i vecchi verranno chiusi e automatici automaticamente. – JvdBerg

+0

ok così per più query ho fondamentalmente bisogno di preparare, bind_param, eseguire, bind_result. Non è necessario stmt_init per ogni nuova query, solo una volta, come la connessione al database, solo una volta. destra? – Marco

Problemi correlati