It seems it is common sense to say it is a god practice to free any resource when it isn´t necessary anymore.
Also, when talking about releasing the resources associated with a given result set it is a common sense to say never release a result set before it is assured to have been either commited or rolled back.
Then, the following code sequence should be the most adequate (assuming auto-commit is disabled):
odbc_commit(...);
odbc_free_result(...);
...
odbc_close(...);
odbc_free_result
(PHP 4, PHP 5)
odbc_free_result — Libera le risorse associate ad un risultato
Descrizione
$id_risultato
)
Restituisce sempre TRUE.
La funzione odbc_free_result() permette
di non utilizzare molta memoria durante l'esecuzione di uno script.
Infatti, se si è sicuri di non avere più bisogno dei dati del risultato,
si può eseguire odbc_free_result(), e la memoria associata
a id_risultato sarà liberata. Se la funzione
non viene utilizzata, le aree di memoria resteranno disponibili per tutta
la durata dello script. Al termine verranno liberate in modo automatico.
Nota: Se si ha l'auto-commit disabilitato (vedere odbc_autocommit()) e si esegue odbc_free_result() prima di eseguire il commit, tutte le transazioni pendenti saranno annullate,
("Note: If auto-commit is disabled (see odbc_autocommit()) and you call odbc_free_result() before committing, all pending transactions are rolled back.")
I've looked thru the code, and that note is definitely wrong, at least in my environment (Windows/SQL Server). odbc_free_result ultimately just calls SQLFreeStmt which has NO EFFECT on outstanding transactions.
In fact, it seems it must be wrong for all environments, because the SQLFreeStmt is bound to the destruction of the result resource. So unset($result) would be just as dangerous - and you're randomly and unpredictably screwed if garbage collection reaps the result set before your transaction's done.
odbc_free_result() is also the way to avoid the dreaded "Too many open cursor" error.
I use WinDev 15.0 HyperFileSQL ODBC Connector on Windows, PHP 5.2.3.
With this configuration, any result ressource obtained with odbc_exec must be freed by odbc_free_result before the next query by odbc_exec.
If the result ressource is not freed odbc_exec will return a corrupt result ressource.
example:
odbc_exec($query1);
odbc_exec($query2);
odbc_result_all();
Output: A table with empty cells
