8791 sujets

Développement web côté serveur, CMS

Modérateur
Hello,

Pour mon petit projet en cour, j'ai besoin d'une toute petite bdd. Comme j'ai pas trop envie de faire un système de gestion à base d'XML ou CSV et que j'ai pas besoin de sortir la grosse artillerie (Mysql), j'ai pensé à SQLite. Pour mes besoins, ça devrait suffire amplement (une table avec 7 champs voir une autre avec 5/6 champs). De plus, j'aurai de bonnes « perfs » comparé à un système de gestion perso.

Pour ce qui est de la connexion à SQLite, je crois qu'il se connecte correctement. Il me crée bien le fichier de la base. Par contre quand je fais une requête, il me retourne rien. Pas d'exception. Cependant, quand j'ajoute un die("ko") (sic) j'y ai droit. Je m'explique :


<?php
try{
    $nomBase = "bdd_ecole";
    $repBase = $nomBase."/";
    $tableEleve = $repBase."table_eleve.sql";
    $donneesEleve = $repBase."donnees_eleve.sql";
    $dsnSQLite = "sqlite:".$repBase.$nomBase.".sqlite";
    
    $SQLite = new PDO($dsnSQLite);
    
    $sql = file_get_contents($tableEleve);
    $listeEleve = $SQLite->exec($sql) or die ("ko");
}catch(Exception $e){
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
}
?>


la table Eleve :

CREATE TABLE eleve (
    id_eleve INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    prenom VARCHAR(64) NOT NULL,    
    nom VARCHAR(64) NOT NULL,
    adresse VARCHAR(160) NOT NULL,
    cp varchar(5) NOT NULL,
    ville VARCHAR(64) NOT NULL
);


À noter que la table élève est un pur exemple.

Si vous voyez d'où peut provenir le soucis, merci de me dire ce qui ne va pas.

Bon dimanche à vous

ps : j'ai bien les extensions chargées (php_pdo_sqlite.dll, php_sqlite.dll, php_pdo_sqlite_external.dll).
Modifié par Nolem (13 Dec 2009 - 19:04)
Salut,

Tu es sûr que la table ce créé bien ?
Pars qu'avec la table que tu donne j'ai : near "AUTO_INCREMENT": syntax error
je croit que AUTO_INCREMENT n'existe pas dans sqlite, il faut créé table qui aura la valeur des clefs primaires des autres. Et à chaque fois on l'incrémente.
http://www.sqlite.org/faq.html#q1

au passage
$listeEleve = $SQLite->exec($sql) or die ("ko");
est une erreur, exec peut renvoyer 0 et c'est pourtant normal. Pour les erreurs regarde du coté de PDO::errorInfo()

Et pour que PDO envoi des exceptions, il faut le préciser.
$SQLite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
jo_link_noir a écrit :
je crois que AUTO_INCREMENT n'existe pas dans sqlite

Si ; mais, il s'écrit AUTOINCREMENT.

Quant au type INT, je le remplacerais par son synonyme INTEGER sans préciser le nombre de chiffres autorisés.
Modifié par Victor BRITO (13 Dec 2009 - 14:29)
Bah non, je vient de lire le lien que j'ai mi (oui, je sais, j'aurais du le faire avant Smiley biggol )
Faut juste mettre INTEGER PRIMARY KEY

PS : en parlant des types, c'est TEXT au lieu de VARCHAR (sans le nombre de caractères)
Modifié par jo_link_noir (13 Dec 2009 - 16:10)
Modérateur
Hello,

C'est bon, j'ai ma base de créer et c'est encourageant. Comme je ne connais pas encore bien pdo, je ne savais pas que les exceptions étaient déclenchées par la méthode setAttribute. Merci Jo_link_noir. Smiley smile

Ce qui m'a donné un message que mon erreur SQL était aux environs de AUTO_INCREMENT. Or, il me semble avoir lu que les instructions AUTOINCREMENT et AUTO_INCREMENT sont comprises de la même manière. Apparemment, Le NOT NULL n'est pas très apprécié. Par précaution j'ai enlevé la valeur de INT et que ce dernier soit remplacer par INTEGER (Merci de ton conseille Smiley smile ). Et enfin, la clef primaire déclarée en fin de table. Ce qui donne et que ça fonctionne :


CREATE TABLE eleve (
    id_eleve INTEGER AUTO_INCREMENT,
    nom VARCHAR(64),
    prenom VARCHAR(64),
    adresse VARCHAR(160),
    cp varchar(5),
    ville VARCHAR(64),
    PRIMARY KEY(id_eleve)
);


Je crois que la syntaxe va être extrêmement light. Bein c'est logique, SQLite Smiley murf . En ce qui concerne le VARCHAR(queque chose) est accepté dans la plupart des BDD. En revanche les TEXT ou INT sont compris différemment.

En tout cas, merci à vous deux. Smiley smile
Modifié par Nolem (13 Dec 2009 - 19:08)
Modérateur
Victor BRITO a écrit :

Il me semble que NOT NULL est implémenté par SQLite, comme l'indique le diagramme des contraintes de colonne.


Ah oui exact et merci pour cette réponse. Je viens de faire des petits tests avec. Pour ce qui est de l'auto incrémentation sur une clef primaire, elle se fait automatiquement. Donc il n'est pas nécessaire de le déclarer. Erf, je n'ai pas encore parcouru toute la doc. Par contre ce qui est un peu embêtant, les versions de SQLite antérieures à 3.6.19 ne reconnaissent pas les clefs étrangères. Or, je me suis aperçu que j'aurai un champ qui me donnera une liste de valeur définit et définitive. J'ai pensé à SET ou ENUM, mais je ne crois pas que ce soit supporté. En gros, j'aurai 8 valeurs qui devraient être figées. Je vais faire encore quelques recherches dans la doc à ce propos. En fouillant bien, on tombe sur des trucs intéressant. ^^. Le lien que tu m'as donné je l'avais « aperçu ». Je crois qu'il est essentiel après avoir parcouru la FAQ. Je pense que le champ ENUM qui deviendra VARCHAR (16), je le gérerai par php dans un formulaire avec une balise select. Comme je serai le seul à gérer la base, je ne pense pas qu'il y ait trop de soucis. En tout cas, je vois que SQLite va répondre à mon besoin. C'est vraiment une bonne alternative sur des petites applications.

Bonne soirée à toi. Smiley smile