psql et traitement des erreurs
Le
Une Bévue
Dans un INSERT, j'ai une erreur :
ERROR: value too long for type character varying(30)
(testé depuis le Terminal)
Mais dans le php je n'arrive pas à printer cette erreur :
code
$ret=$db->query($sql);
try {
while($row=$ret->fetch()){ // line 492
$rowid=$row['rowid'];
}
// do something
} catch (Exception $e) {
echo $e->getMessage()."<br />";
}
j'ai essayé aussi, sans succès, PDOException :
code
} catch (PDOException $e) {
echo $e->getMessage()."<br />";
}
j'obtiens l'erreur :
Fatal error: Call to a member function fetch() on a non-object in
/Users/yt/Sites/landp_public/landp.php on line 492
la ligne 492 étant "while($row=$ret->fetch()){"
bien sûr, il conviendrait dans changer pour la colonne fautive
varchar(30) en qqc d'autre, de plus grand.
MAIS, je souhaite d'abord piger comment visualiser l'erreur obtenue au
terminal, comment faire ?
ie. plutôt que bloquer le script php.
puis-je obtenir l'erreur depuis $ret ?
ERROR: value too long for type character varying(30)
(testé depuis le Terminal)
Mais dans le php je n'arrive pas à printer cette erreur :
code
$ret=$db->query($sql);
try {
while($row=$ret->fetch()){ // line 492
$rowid=$row['rowid'];
}
// do something
} catch (Exception $e) {
echo $e->getMessage()."<br />";
}
j'ai essayé aussi, sans succès, PDOException :
code
} catch (PDOException $e) {
echo $e->getMessage()."<br />";
}
j'obtiens l'erreur :
Fatal error: Call to a member function fetch() on a non-object in
/Users/yt/Sites/landp_public/landp.php on line 492
la ligne 492 étant "while($row=$ret->fetch()){"
bien sûr, il conviendrait dans changer pour la colonne fautive
varchar(30) en qqc d'autre, de plus grand.
MAIS, je souhaite d'abord piger comment visualiser l'erreur obtenue au
terminal, comment faire ?
ie. plutôt que bloquer le script php.
puis-je obtenir l'erreur depuis $ret ?

Poser une question


puis-je obtenir l'erreur depuis $ret ?
NON, c'est avec $db :
--- code ---------------------------------------
if($ret){
// do something
}else{
// get error :
$errorInfo=$db->errorInfo();
}
------------------------------------------------
Maintenant il ne me reste plus qu'à faire un alter table sur les
colonnes de varchar(30)...
L'erreur "Fatal error: Call to a member function fetch() on a non-object
in /Users/yt/Sites/landp_public/landp.php on line 492"
signifie que $ret n'est pas un objet PDO et donc que potentiellement
$ret=$db->query($sql); n'a pas réussi car, comme l'indique la doc (
http://fr.php.net/manual/fr/pdo.query.php ), si query() fait une erreur,
$ret = false.
Il suffirait de mettre cette ligne dans le try/catch pour en savoir un
peu plus.
oui, j'ai appris ça ))
je n'ai pas mis de try catch, mais :
$ret=$db->exec($sql);
if($ret){
// pas d'erreur procéder normalement
}else{
// une erreur :
$errorInfo=$db->errorInfo();
}
j'ai aussi augmenté mes varchar(30) à varchar(256) pour ne plus avoir
d'erreur...
il me reste, pour essayer try / catch à mettre :
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
sinon je ne "catch" rien...
car l'erreur SQL se produit à la ligne :
$ret=$db->exec($sql);
mais n'est vue par php qu'au :
while($row=$ret->fetch()){ ... }
qui suiT.
en fait l'erreur donnée par psql utilisé en ligne de commande est très
claire :
ERROR: value too long for type character varying(30)
je dois être plus généreux sur la longueur de mes varchar, par ex
varchar(1024) pour une URL n'est pas trop : je viens d'essayer avec une
URL correspondant à un point Google Maps, ça donne une longi-ueur de 329...