Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

psql et traitement des erreurs

23 views
Skip to first unread message

Une Bévue

unread,
May 14, 2012, 2:47:01 AM5/14/12
to
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 />\n";
}
---------------------------------------------------------

j'ai essayé aussi, sans succès, PDOException :

--- code ------------------------------------------------
} catch (PDOException $e) {
echo $e->getMessage()."<br />\n";
}
---------------------------------------------------------


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 ?

Une Bévue

unread,
May 14, 2012, 3:12:00 AM5/14/12
to
On 14/05/12 08:47, Une Bévue wrote:
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)...

Clément

unread,
May 14, 2012, 2:10:25 PM5/14/12
to
Le 14/05/2012 08:47, Une Bévue a écrit :
> puis-je obtenir l'erreur depuis $ret ?

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.

Une Bévue

unread,
May 14, 2012, 2:57:33 PM5/14/12
to
On 14/05/12 20:10, Clément wrote:
> 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...
0 new messages