Ajouter une colone dans une table, si elle n'existe pas

Mammouth du PHP | 531 Messages

27 janv. 2008, 17:21

Bonjour,

Je pensais qu'il était possible de faire ça, mais IF NOT EXISTS me produit une erreur :
$req = "ALTER TABLE bloom_config ADD theme IF NOT EXISTS VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL" ;
$sql = mysql_query($req) OR DIE (mysql_error());
Vous allez me dire, ce n'est pas nécessaire de savoir si la colonne existe déjà puisque dans ce cas elle sera simplement pas créé. Sauf que du coup si la colonne existe j'obtient un message (duplicate... blabla) et mon script s'arrête au mysql_error.
Moi j'ai besoin qu'il continu, alors à moins d'enlever OR DIE, mais c'est de la bidouille, n' y a t'il pas une solution pour tester l'existence de la colonne ?

Eléphant du PHP | 445 Messages

27 janv. 2008, 17:52

Regardes du cote de SHOW COLUMNS

Eléphant du PHP | 259 Messages

27 janv. 2008, 18:00

Hello,

C'est le or die() qui est de la bidouille... On demande à un script de planter lorsqu'une requête plante au débugage, là dans ce cas on peut apparenter ça à une exception. Le retour d'erreur DUPLICATE est pas un plantage mais une information.

Ce genre de retour d'erreur ( mysql_errno() ) peut etre exploité dans la suite du script.

PS: Message ecrit, effacé et réécrit, du coup je suis sur d'être clair ;)

Mammouth du PHP | 531 Messages

27 janv. 2008, 19:01

Donc si j'ai bien compris ce n'est pas une erreur, au contraire, de ne pas mettre OR DIE ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 janv. 2008, 19:11

le "or die()" n'est pas une erreur, mais ce n'est que le 1er pas de la gestion d'erreur.

Pour aller plus loin, il ne faudrait pas que tu arrêtes l'exécution de ton script, mais que tu interceptes l'erreur et que tu essayes de voir s'il s'agit d'une erreur controlée (colonne exisante) d'une erreur non controlée (tout le reste)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 259 Messages

27 janv. 2008, 19:53

Comme l'a dit Zeus, or die() n'est pas une erreur en soi. Croire qu'il faut systématiquement le mettre derriere un mysql_query (ou autre), par contre, en est une.

Dans ton cas justement il peut être intéressant, dans un premier temps

tu essaye ton script comme ceci ->
mysql_query( $truc ) or die( mysql_errno() );
Cela te donnera le code d'erreur généré par ta requête. Tu n'auras plus qu'a réécrire ton script comme ceci :
mysql_query( $truc );
if( mysql_errno() == valeur ){
   echo "Y'a doublon !";
}

Mammouth du PHP | 531 Messages

27 janv. 2008, 20:23

Merci pour vos réponses.
Je crois avoir bien tout compris mais quelque chose cloche quand même dans mon histoire :
$req = "ALTER TABLE bloom_config ADD theme VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL" ;
$sql = mysql_query($req) OR DIE (mysql_errno()) ;
echo 'rere';
Si la colonne existe voilà ce qui se passe : Pas d'erreur ou d'information , page blanche et le script s'arrête à la requete puisque mon echo ne s'exécute pas.
Impossible donc de faire par exemple ceci :
if( mysql_errno() == valeur ){
  // Suite du script
}
Le seul moyen d'obtenir le résultat voulu (continuation du script même si il y a doublon) est de ne pas mettre de or die... mais ce n'ets pas une bonne habitude à prendre me semble t-il :roll: [/php]

Eléphant du PHP | 445 Messages

27 janv. 2008, 20:45

Enleves ton OR DIE

Eléphant du PHP | 259 Messages

27 janv. 2008, 21:01

Tu n'as pas lu ce que j'ai ecrit je crois :)

Le die() sert à identifier l'erreur. Une fois l'erreur identifiée, il n'est plus nécessaire.

Comme je te l'ai déja ecrit plus haut, une fonction genre mysql_* n'implique pas SYSTÉMATIQUEMENT un die().

Eléphant du PHP | 445 Messages

27 janv. 2008, 21:07

die() est un alias de exit() donc si ta fonction echoue tu arreteras l'execution du code.

Mammouth du PHP | 531 Messages

27 janv. 2008, 21:12

Enleves ton OR DIE
On peut faire ça ? :
mysql_query($req) OR (mysql_errno()) ;

Eléphant du PHP | 259 Messages

27 janv. 2008, 21:17

Non,

Pourquoi tu veux faire ça ?

Eléphant du PHP | 445 Messages

27 janv. 2008, 21:20

mysql_query() returns a resource on success, or FALSE on error.
Il serait préferable de faire quelque chose dans ce genre.
$handle = mysql_query($req) ;

if($handle){
    // Traitement si la requete à reussi
}else{
    // Traitement si la requete à echoué
}

Mammouth du PHP | 531 Messages

27 janv. 2008, 21:53

Non,

Pourquoi tu veux faire ça ?
Parce que sinon l'exécution du script s'arrête étant donné qu'il trouve la colonne en doublon. Alors que je veut pas qu'il s'arrête :roll:

@ h0_noMan

Effectivement mais ça ne résout pas le problème à la base en fait... :?

Quoi que je fasse après la requete, je ne peut e toute façon rien faire puisque OR DIE me stop tout. Et si je laisse ma requete sans OR DIE (mysql... etc, c'est mal... non ?

Eléphant du PHP | 259 Messages

27 janv. 2008, 22:22

Non, ce n'est pas mal.

Par contre [url=http://xn--or_die__outrance-3lb.saimal.fr/]or die à outrance, oui c'est mal[/url] ;)