sqlite_close() ne fonctionne pas ?

Eléphant du PHP | 60 Messages

05 août 2008, 17:50

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 ?
Modifié en dernier par Louisss le 05 août 2008, 17:59, modifié 1 fois.
Ils ne savaient pas que c'était impossible, alors ils l'ont fait...

Mammouth du PHP | 1668 Messages

05 août 2008, 17:57

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"...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 60 Messages

05 août 2008, 18:01

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.
Ils ne savaient pas que c'était impossible, alors ils l'ont fait...

ViPHP
ViPHP | 3300 Messages

05 août 2008, 18:16

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 :)
Fait du php depuis que ca existe ou presque :)