Page 1 sur 1

sqlite_close() ne fonctionne pas ?

Posté : 05 août 2008, 17:50
par Louisss
Bonjour.

Je viens (encore) de remarquer un détail étrange dans SQLite : on dirait que la fonction sqlite_close() ne fonctionne tout simplement pas. Voici un petit bout de code avec lequel je l'ai testée :

Code : Tout sélectionner

$BD = sqlite_open("exemple.sqlite", 0666); $req = "SELECT * FROM test;"; $res = sqlite_query($BD, $req); echo "Nombre d'enregistrements trouvés : ".sqlite_num_rows($res); sqlite_close($BD); $req = "SELECT * FROM test;"; $res = sqlite_query($BD, $req); echo "<br />Nombre d'enregistrements trouvés : ".sqlite_num_rows($res);
Il y a 3 enregistrements dans cette table test, donc logiquement, le premier echo devrait afficher 3, et le second un warning ou un message d'erreur puisque la base est fermée entre les deux.
Et bien non, les deux echo affichent le même résultat, comme si la base était toujours ouverte.

J'en déduit donc qu'en plus d'être rarement utile puisqu'une base est automatiquement fermée à la fin du script, cette fonction ne marche pas. Y aurait-il un détail qui m'échappe ?

Oui, il y a effectivement un détail qui m'avait échappé et que voici :
En fait c'est la variable $res de mon code qui n'a pas changé de valeur à sa deuxième affectation (probablement à cause du fait que $BD ne pointait plus sur rien). Du coup, il est finalement normal que les deux echo affichent le même résultat puisque c'est en fait $res qui contient le résultat affiché.
Le code suivant avec juste une réinitialisation de $res après le sqlite_close() montre que la fermeture a bien fonctionné :

Code : Tout sélectionner

$BD = sqlite_open("exemple.sqlite", 0666); $req = "SELECT * FROM test;"; $res = sqlite_query($BD, $req); echo "Nombre d'enregistrements trouvés : ".sqlite_num_rows($res); sqlite_close($BD); $res = 0; $req = "SELECT * FROM test;"; $res = sqlite_query($BD, $req); echo "<br />Nombre d'enregistrements trouvés : ".sqlite_num_rows($res);
Cette fois-ci, le deuxième sqlite_query() se solde par un warning du type "not a valid sqlite database resource".
Le seul truc que je ne comprend pas, c'est pourquoi ce warning n'apparaît pas systématiquement ?

Posté : 05 août 2008, 17:57
par katagoto
Que ce passe-t-il lorsque tu changes le nom des variables ? la requête ?

Je ne sais pas, mais il y a peut-être une mémoire tampon, ou "d'auto-save"...

Posté : 05 août 2008, 18:01
par Louisss
Bonne remarque katagoto, j'étais justement en train de compléter mon message avec des détails de ce genre pendant que tu rédigeais ta réponse.

Posté : 05 août 2008, 18:16
par Nagol
je dis peut-être une bétise mais la nature même de sqlite est d'être une base de donnée uniquement présente en ram (pas de process gérant l'accès à la base de donnée) il est donc possible que sqlite_close soit tout bonnement inutile pour ce qui est de la lecture des données, j'aimerais voir ce que donne une écriture en revanche. Et j'aimerais aussi savoir comment ca se comporte avec un pconnect.

Je trouve ton problème assez intéressant ma foi :)