utilisation de SQLite en local avec PHP

Le problème exposé dans ce sujet a été résolu.

Salut à tous,

J'ai découvert aujourd'hui SQLite qui permet de faire une base de données local exploitable avec PHP grâce de simple commande SQL et PDO. Or le problème est que j'arrive très bien à le faire fonctionner avec WAMP et PDO mais que si je télécharge PHP tout seul (PHP 5.6.10) cela ne fonctionne pas même si j'ai activé les extension dans le php.ini :

1
2
extension=php_pdo_sqlite.dll
extension=php_sqlite3.dll

Voici l'erreur renvoyée : Impossible d'acc├®der ├á la base de donn├®es SQLite : could not find driver Je précise que j’exécute PHP en ligne de commande

Savez-vous comment réussir à utiliser SQLite en PHP local ?

Merci d'avance @+

EDIT : Je viens de trouver, cela ne fonctionne que si le nom du répertoire ne comporte par d'accent, si il en contient un, cela ne fonctionne pas

Comment résoudre ce problème ?

+0 -1

Le chemin de la base de données est bien encodé en UTF-8, pas ANSI ? (donc le script par extension)

Car PHP utilise la fonction C sqlite3_open, qui, selon la doc attend un chemin encodé en UTF-8.

On peut d'ailleurs lire en bas de page :

Note to Windows users: The encoding used for the filename argument of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever codepage is currently defined. Filenames containing international characters must be converted to UTF-8 prior to passing them into sqlite3_open() or sqlite3_open_v2().

C'est bien ça la question suite à ton edit ?

+0 -0

Merci,

Oui c'était bien ça ma question mais le script est bien encodé en UTF-8 (sans BOM) mais cela ne fonctionne toujours pas si il y a un accent dans le nom du dossier

@+

+0 -1

Quelle extension utilises-tu en fin de compte ? PDO ou sqlite3 ?

Juste pour être sûr : c'est le script avec la chaîne de connexion qui compte (avec PDO, c'est celui avec le new PDO, pour que le DSN soit en UTF-8), qui est généralement un script à part qu'on inclut partout. Ce n'est pas celui où tu fais tes requêtes qui compte là.

+0 -0

J'utilise PDO, et script de connexion est bien en UTF-8, le voici :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
try{
    $pdo = new PDO('sqlite:'.dirname(__FILE__).'/database.sqlite');
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // ERRMODE_WARNING | ERRMODE_EXCEPTION | ERRMODE_SILENT
} catch(Exception $e) {
    echo "Impossible d'accéder à la base de données SQLite : ".$e->getMessage();
    die();
}
?>

Le site où je l'ai trouvé : http://www.finalclap.com/faq/170-php-sqlite-pdo

EDIT : J'ai fait un echo sur dirname(__FILE__) et au lieu de me renvoyer C:\é\php-5.6.10 (le nom du dossier de test), il m'a renvoyé C:\Ú\php-5.6.10.

J'ai également essayer de redéfinir la locale avec setlocale(LC_ALL, 'french'); ou setlocale(LC_ALL, 'fra_fra'); mais cela ne change rien.

+0 -0

Dans ce que j'ai cité de la doc de sqlite, on voit bien que la locale n'intervient pas, il attend de l'UTF-8, point barre.

Par contre, justement, tu ne dois pas utiliser dirname, __DIR__ ou autre fonction PHP qui, sous Windows, renvoient des chemins encodés en ANSI et non en UTF-8 puisque PHP utilise toujours les fonctions ANSI et non Unicode de l'API Windows. Ou alors, sous Windows, il faut ensuite faire la conversion CP1252 => UTF-8 avec iconv mais, dans ce cas-là, ton code ne sera pas portable …

PS : $pdo = new PDO('sqlite:database.sqlite'); ne suffit pas ici ?

+1 -0

Merci,

J'ai essayé avec iconv et cela fonctionne parfaitement même sans serveur puisque j'execute le script PHP via un .bat php.exe -f base.php.

Et même avec juste $pdo = new PDO('sqlite:database.sqlite'); cela ne fonctionne pas si le nom du répertoire contient un accent mais avec iconv cela fonctionne.

Voilà le script final :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
echo $dirname_utf8 = iconv("CP1252", "UTF-8", dirname(__FILE__)); 
try{
    $pdo = new PDO('sqlite:'.$dirname_utf8.'/database.sqlite');
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // ERRMODE_WARNING | ERRMODE_EXCEPTION | ERRMODE_SILENT
} catch(Exception $e) {
    echo "Impossible d'accéder à la base de données SQLite : ".$e->getMessage();
    die();
}
?>

Problème résolu merci à toi ;)

@+

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte