Page 1 sur 1
pb base sqlite 2 et sqlyte3
Posté : 02 mars 2008, 21:45
par nounet
Bonjour a tous ,
J'ai developpé recemment un site basé sur une base sqlyte3 qui marchait parfaitement.je me suis rendez compte que mon hebergeur ne me proposait que pdo-sqlyte en version 2.
Il est donc normal que mon site ne marche pas ave cun ebase sqlyte en version 3.
J'ai bine essayé de la recreer avec wamp et son interface sqlyte manager.Mais la base de données se troucve dans un fichier .sql.
J'ai fait repointé mon code vers ce nouveau fichier texte, le site souvre bien sans aucun message d'erreur ni de probleme de drivers pdo inexistant.Cependant, tout ce qui aurait du s'affciher en faisant appel a m abase de donné ne saffiche pas.
existe t'il un moyen de convertir une base de donnée sqlyte 3 en version 2?
est ce que mon probleme vient il vraiment du fait que je n'utilise pas une base dans la bonne version?
ou s'enregistrela base crée par sqlyte manager dans wamp?
merci d'avance!!
Posté : 03 mars 2008, 10:45
par Berzemus
les versions sqlite 2 et 3 sont incompatibles. Ca, c'est sur.
L'extension du fichier peut varier, c'est pas l'essentiel.
Pdo_sqlite version 2 ? tu es sur? Tu peux nous poster le phpinfo() de ton hébergeur ?
Je ne connais pas le sqlite manager de wamp, mais à la base, sauf s'il utilise php, je ne ferais confiance a aucun soft pour créer une db sqlite a utiliser par un autre (par php pour un site, dans ce cas). Les implentations et les versions peuvent être différentes, et ça crée des soucis.
A mon avis, le plus simple serait de génerer un script de création (create table etc.. & insert etc..) de toute ta base, et simplement l'exécuter dans un fichier que tu crées directement chez ton hébergeur.
Posté : 03 mars 2008, 10:52
par nounet
Merci berzemus pour ton debut de reponse.
En effet, apres quelques recherches, j'ai vu que les 2 bases etaient incompatbiles.D'autre part,la facon de se connecter à celle_ci sont aussi differentes.Pour sqlyte 3 on precise sqlyte alors que pour sqlyte 2 on precise avec slqyte2:'path/db'
Pour information,voici le resultat de ce que m'affiche le phpinfo.php.je ne vais pas cité le nom de mon hébergeur ne sachant pas si j'en ai le droit.
le resultat se toruve ici
http://www.azuracd.fr/phpinfo.php
j'ai deja commencé a utiliser mysqlyte manager.je vais exporter mon resultat sous forme d'un fichier sql.Apres comment l'utiliser afin qu'il me crée ma base?j'ai bien relu mais je ne vois pas comment crée cette base de donné.Aurais tu des liens a me faire lire ??merci d'avance
Posté : 03 mars 2008, 12:19
par Berzemus
hmm.. a y repenser, un fichier sql est censé être un export de ta base (en sql), et donc ton premier fichier que tu as crée pourrait ne pas être une DB (à vérifier avec un éditeur de texte).
Enfin, soit, ce qui m'inquiète c'est l'absence des drivers spécifiques à sqlite (pdo) qui ne sont pas affichés.. j'aurais du y trouver ceci:
pdo_sqlite
PDO Driver for SQLite 3.x enabled
PECL Module version 1.0.1 $Id: pdo_sqlite.c,v 1.10.2.6.2.2 2007/03/23 14:30:00 wez Exp $
SQLite Library 3.3.17undefined
Ce qui me fait penser que bien que pdo soit chargé, les drivers ne le sont pas. (il s'agit peut-être d'une particularité, mais ça m'étonne).
En plus, le message d'erreur sur le domaine semble le confirmer:
Echec de la connexion :could not find driver
Fatal error: Call to a member function query() on a non-object in D:\www\azuracd.fr\htdocs\class\MyPDO.class on line 32
A moins que tu ne comptes faire un code qui doit pouvoir s'adapter à plusieurs DB's, c'est plus simple de passer par le module sqlite intégré à php5 (
petit lien).
Pour ce qui est du transfert de ta db, une fois que tu as ton fichier sql, il suffit de faire une petit script php qui va exécuter tout ça, comme une simple requête sql.
Ou bien tu installes sqlitemanager sur ton hébergement.
Posté : 03 mars 2008, 12:47
par nounet
Désolé berzemus mais au moment ou tu est allé voir le site je n'avais pas encore modifié ma ligne de connexion a ma base.
Maintenant, j'ai utilisé celle-ci:
try{
$this->oDbConnection=new PDO('sqlite2:./Db/MyDb.sql');
}catch (Exception $e){
echo 'Echec de la connexion :'.$e->getMessage();
}
je n'ai plus aucun message d'erreur concernant les drivers.par contre rien ne s'affiche??
Posté : 03 mars 2008, 13:44
par Berzemus
ça a l'air de fonctionner maintenant, en tout cas, je vois le site et je peux le naviguer.
Par contre, un souci de texte/variables/constantes peut-être..
Je suppose que tu bosses dessus, alors je vais te laisser faire.. en tout cas, tu n'a plus l'air d'avoir des soucis de db.
Notice: Use of undefined constant F1_AMIANTE_TTC - assumed 'F1_AMIANTE_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 35
Notice: Use of undefined constant F1_CARREZ_TTC - assumed 'F1_CARREZ_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 35
Notice: Use of undefined constant F1_DPE_TTC - assumed 'F1_DPE_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 35
Notice: Use of undefined constant F1_GAZ_TTC - assumed 'F1_GAZ_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 35
Notice: Use of undefined constant F1_PLOMB_TTC - assumed 'F1_PLOMB_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 35
Notice: Use of undefined constant F1_NSH_TTC - assumed 'F1_NSH_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 35
Notice: Use of undefined constant F1_TERMITE_TTC - assumed 'F1_TERMITE_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 35
Notice: Use of undefined constant F1_AMIANTE_TTC - assumed 'F1_AMIANTE_TTC' in D:\www\azuracd.fr\htdocs\inc\ContenuPageSansFormulaire.inc on line 37
Posté : 03 mars 2008, 14:40
par nounet
Si justement le souci persiste car j'utilise des constantes afin d'eviter de passer par des sessions.le code d'exemple est celui -ci
public function ShowTableUnderSelectBox($NomChamp,$Table,$NameOfSelect,$CssOfSelect,$NameOfOption1){
global$fTextShowTable;
$fTextShowTable='<select name="'.$NameOfSelect.'" id="'.$NameOfSelect.'" class="'.$CssOfSelect.'"><option>'.$NameOfOption1.'</option>';
$oPDOStatement=$this->oDbConnection->query("SELECT $NomChamp FROM $Table");
if($oPDOStatement!==FALSE){
while($aRow=$oPDOStatement->fetch()){
$fTextShowTable.='<option>'.$aRow[$NomChamp].'</option>';
}
}
$fTextShowTable.='</select>';
$oPDOStatement=NULL;
return $fTextShowTable;
}
public function Definition($sTable,$sNomDuDefineTtc){
$oPDOStatement=$this->oDbConnection->query("SELECT PrixTtc from $sTable WHERE idPiece='1' ");
if($oPDOStatement!==FALSE){
while($aRow=$oPDOStatement->fetch()){
define($sNomDuDefineTtc,$aRow['PrixTtc']);
}
}
$oPDOStatement=NULL;
return TRUE;
}
la premiere fonction me sert pour tous les select box du site internet et tu verra dans une page de celle-ci qu'il ne propose rien
??
Posté : 03 mars 2008, 16:09
par Berzemus
ah oui.. la version sqlite 2 pour pdo est une version un peu batarde.. propre à la version 5.1 de php..
Tu as essayé d'effectuer de simples tests sur la db ? un simple script qui insère des données, et essaye de les récuperer ?
Parfois, ça sert à rien de vouloir débugger son application en y passant des heures, alors qu'un simple script de test de 8 lignes permet de cibler l'erreur tout de suite.
Si c'est bien des select de la page devis que tu parles, il sont vides, de fait.
Tu es sur d'ouvrir la bonne db ? peut-être qu'a chaque fois, il en crée une nouvelle, qui est forcément vide, et qui renvoie forcément des résultats vides..
Posté : 03 mars 2008, 16:40
par nounet
oui je commence a comprendre que slqyte 2 est un peu lourd à mettre enplace .D'autant plus qu'avec slqyte version 3,cela m'avait demandé une petite heure pour tout refondre.
J'ai resolu les problemes de mes select grace a toi et surtout a beaucoup de chance.Je n'arrive cependant pas a faire d'insert.Apparemment, je pense que cela vient de mes tables qui avaient des champs auto incrementée.
Suarais tu remédier à ce probleme.Cdlt,charlie.
Posté : 03 mars 2008, 22:55
par Berzemus
Ah, je vois que ça marche de fait, joli

.
Reste apparemment un souci au niveau des constantes:
Notice: Constant F1_ERNT_TTC already defined in D:\www\azuracd.fr\htdocs\class\MyPDO.class on line 35
Vérifier si elle n'est pas déjà définie avant de vouloir la définir serait la marche à suivre, à mon avis. (c'est un peu lourd, mais c'est le prix des constantes

)
Tu as un souci pour les inserts ? Tout dépend alors de la manière que tu les fais, comment elles sont écrites, et la structure de ta table (si tu peux poster un "create table", je pourrais y voir plus clair).
A l'aveuglette, je dirais de faire des requêtes dans ce style, pour ne définir que les colonnes dont on a envie.
Code : Tout sélectionner
insert into matable (nom,adresse,profession) values ("josé","pas loin","agriculteur)
Ca évite les erreurs d'attribution, c'est plus clair.
Sinon, pour l'autoincrement, c'est (un peu) inutile dans sqlite, sqlite s'occupe lui-même de fournir un ID unique pour chaque entrée dans une colonne crée par défaut, qui s'appelle "rowid".
(
ici pour plus d'informations)
Posté : 04 mars 2008, 22:35
par Nounet
oui voici ma table
Code : Tout sélectionner
CREATE TABLE enumereclientinternet (
IdClient INTEGER NOT NULL PRIMARY KEY,
TypeDemande text NOT NULL ,
DesignationClient varchar(100) NOT NULL ,
MailClient varchar(20) NOT NULL ,
TelClient char(10) NOT NULL
);
et voici ma requete
try{
$oPDOStatement=$this->oAccesBase->prepare("INSERT INTO ".NOM_TABLE_CLIENT." (TypeDemande,DesignationClient,MailClient,TelClient) VALUES (?,?,?,?)");
$oPDOStatement->bindValue(1,TYPE_DEMANDE_DEVIS);
$oPDOStatement->bindValue(2,$this->sClient);
$oPDOStatement->bindValue(3,$this->sAdresseMailClient);
$oPDOStatement->bindValue(4,$this->iTelClient);
$oPDOStatement->execute();
$this->oAccesBase=NULL;
}
catch (PDOException $e){
echo 'erreur'.$e->getMessage();
include(PIED_DE_PAGE);
}
je n'obtiens aucun message d'erreur mais ma table ne se remplit pas.Je ne comprend spas mon erreur.Merci d'avance.
Posté : 04 mars 2008, 22:45
par zeus
Tu ne vérifies pas l'exécution de ta requête
Si la requête ne fonctionne pas, tu n'as pas forcément le lancement d'une exception. Il faut que tu contrôle le retour de ton prepare() et de ton execute()
Posté : 05 mars 2008, 10:57
par Nounet
merci de ton aide
j'ai suivi tes conseils pour obtenir le code suivant
try{
$oConnection=new PDO("sqlite2:".MY_DATA_BASE);
$oPDOStatement=$oConnection->prepare("INSERT INTO ".NOM_TABLE_CLIENT." (TypeDemande,DesignationClient,MailClient,TelClient) VALUES (?,?,?,?)");
if ($oPDOStatement === FALSE ){
throw new Exception ('la preparation de la requete n\'a pas marché');
}else
{
$oPDOStatement->bindValue(1,TYPE_DEMANDE_CONTACT);
$oPDOStatement->bindValue(2,$aData['Nom-Prenom']);
$oPDOStatement->bindValue(3,$aData['Email']);
$oPDOStatement->bindValue(4,$aData['Telephone']);
if ($oPDOStatement->execute()===FALSE ){
throw new Exception('l\'exectution de la requete preparé ne s\'est pas fait correcxtement');
}else{
$oConnection=NULL;
}
}
}
catch (PDOException $e){
echo 'erreur'.$e->getMessage();
}
Cette fois je croyais obtenir tous les messages d'erreurs possibles mais il ne se passe toujours rien.Meme pas un message pour m'aiguiller ??
Posté : 05 mars 2008, 12:19
par Berzemus
et si tu ne passe pas par une requête préparée ? simplement avec un query ?
Pour ce genre de débugage, je reviens toujours au plus simple, pour alors progressivement passer au stade plus avançé..