Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

psql et traitement des erreurs

3 réponses
Avatar
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 />\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 ?

3 réponses

Avatar
Une Bévue
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)...
Avatar
Clément
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.
Avatar
Une Bévue
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...