Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035

    mysql_free_result: quante chiamate?

    Quale codice è corretto?

    Codice PHP:
    $sql="......"
    $qry=mysql_query($sql);
    $n=mysql_fetch_row($qry);
    $sql="......"
    $qry=mysql_query($sql);
    $n=mysql_fetch_row($qry);
    mysql_free_result($qry
    Codice PHP:
    $sql="......"
    $qry=mysql_query($sql);
    $n=mysql_fetch_row($qry);
    mysql_free_result($qry);

    $sql="......"
    $qry=mysql_query($sql);
    $n=mysql_fetch_row($qry);
    mysql_free_result($qry

  2. #2
    Ambedue sono corretti e non danno problemi solo che il secondo è migliore perché liberi la memoria utilizzata dal Result Set.

    Una domanda: ma il primo ed il secondo $sql="......." sono uguali?

    Osservazione:

    dal manuale di php:
    Solo per le istruzioni SELECT, SHOW, EXPLAIN o DESCRIBE mysql_query() restituisce un identificativo di risorsa o FALSE se la query non è stata eseguita correttamente. Per altri tipi di istruzioni SQL, mysql_query() restituisce TRUE in caso di successo e FALSE in caso di errore. Un valore restituito diverso da FALSE indica che la query era lecita ed è stata eseguita dal server. Questo non indica niente riguardo il numero di righe coinvolte o restituite. è assolutamente possibile che una query abbia successo ma che non coinvolga o restituisca nessuna riga.

    Quindi sarebbe più opportuno che tu gestisca il risultato di mysql_query per vedere se si sono verificati errori o meno.
    Inoltre, per come tu hai scritto

    $qry=mysql_query($sql);

    Se qui c'è un errore viene visualizzato a video. Per questioni di eleganza, sarebbe meglio ke tu catturassi l'errore o ad esempio

    $qry=@mysql_query($sql) or die("TUO MESSAGGIO");

    o, meglio ancora:

    $qry=@mysql_query($sql);

    if ($qry === FALSE)
    {
    FAI UN QUALCOSA....
    }


    Stesso discorso per mysql_fetch_row();


    Ciao

  3. #3
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    sisi, la gestione dell'errore non è un problema.
    Comunque no, le due query son ovviamente diverse, è la variabile che prende il result set che ha lo stesso nome ($qry), quindi suppongo si sovrascriva ogni volta rendendo necessario solo un free_result, quello finale... o è come un allocazione di memoria che va deallocata? E' questo il punto...

  4. #4
    Comunque no, le due query son ovviamente diverse, è la variabile che prende il result set che ha lo stesso nome ($qry), quindi suppongo si sovrascriva ogni volta rendendo necessario solo un free_result, quello finale... o è come un allocazione di memoria che va deallocata? E' questo il punto...

    Va eseguita per 2 volte mysql_free_resulta.

    Infatti quando la prima volta esegui:

    $qry=mysql_query($sql);

    In $qry ci sarà l'identificativo di una risorsa.

    Quando di nuovo riesegui la stessa istruzione, in $qry ci sarà di nuovo l'identificativo di una risorsa; l'identificativo però è diverso dal precedente.

    Basta che fai echo $sqry dopo le 2 istruzioni e te ne renderai conto.

    Devi paragonare l'identificatore della risorsa ad un puntatore di memoria.
    Quindi $qry = ... contiene un identificativo ke mi dice dove andare a prendere i dati.

    Nel momento in cui tu usi

    mysql_free_result($qry);

    tu non liberi la memoria della variabile $qry in sé (per questo c'è il comando php unset), ma la memoria ke occupano i dati che hai preso e ke si trovano liddove l'identificativo della risorsa ti dice dove sono.

    Ecco perché quando fai per la seconda volta
    $qry=mysql_query($sql);

    i nuovi dati ke sono presi dal DB vengo messi in una locazione di memoria diversi dalla chiamata precedente.

    Ecco perché occorre per 2 volte fare il mysql_free_result($qry).

    E comunque alla fine dello script php, automaticamente la memoria allocata per le varie query è deallocata. Quindi se ti dovessi dimenticare qualche mysql_free_result($qry) ci pensa PHP a farlo.

    Spero di essere stato abbastanza chiaro.

    Ciao.

  5. #5
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    beh, se sono come dei puntatori, quindi indirizzi di memoria, sarà meglio farlo sempre. Però se dici che c'è una sorta di garbage collector non dovrebbe essere un grosso problema nel qual caso ci si dimentichi...

  6. #6
    E' esatto come anche riportato in http://it2.php.net/manual/en/functio...ree-result.php

    "When you call a query, you are returned a handle, which points to a set of results and the associated variables for it. When you call free_result with that handle it will do a garbage - collection upon the result and associated variables, freeing up the memory."

    Ed anche in http://it2.php.net/manual/en/feature...onnections.php

    "Freeing resources
    Due to the reference-counting system introduced with PHP 4's Zend Engine, it is automatically detected when a resource is no longer referred to (just like Java). When this is the case, all resources that were in use for this resource are made free by the garbage collector. For this reason, it is rarely ever necessary to free the memory manually by using some free_result function"

  7. #7
    Comunque è buona norma liberare sempre la memoria

  8. #8
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    ottimo, significa che c'è una sorta di garbage collector che fa il lavoro di deallocazione... un pò come nel C#
    Grazie.

  9. #9
    E' vero però stai attento nel caso in cui tu abbia delle connessioni "persistenti" con il DB, così come riportato in uno dei 2 link ke ti ho dato (non ricordo quale); infatti in tal caso la connessione al DB non viene chiusa al termine dello script php, ma continua ad esistere, così anche il riferimento al result set non viene chiuso ma continua ad esistere.
    E' buona norma, comunque, sempre liberare la memoria anche quando non usi le connessioni persistenti, in tal modo ti trovo avvantaggiato nel caso in cui tu debba un domani usarle.

    Comunque buon lavoro.
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.