Page 1 sur 2

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

Posté : 27 janv. 2008, 17:21
par supercanard
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 ?

Posté : 27 janv. 2008, 17:52
par h0_noMan
Regardes du cote de SHOW COLUMNS

Posté : 27 janv. 2008, 18:00
par Jules Petibidon
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 ;)

Posté : 27 janv. 2008, 19:01
par supercanard
Donc si j'ai bien compris ce n'est pas une erreur, au contraire, de ne pas mettre OR DIE ?

Posté : 27 janv. 2008, 19:11
par zeus
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)

Posté : 27 janv. 2008, 19:53
par Jules Petibidon
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 !";
}

Posté : 27 janv. 2008, 20:23
par supercanard
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]

Posté : 27 janv. 2008, 20:45
par h0_noMan
Enleves ton OR DIE

Posté : 27 janv. 2008, 21:01
par Jules Petibidon
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().

Posté : 27 janv. 2008, 21:07
par h0_noMan
die() est un alias de exit() donc si ta fonction echoue tu arreteras l'execution du code.

Posté : 27 janv. 2008, 21:12
par supercanard
Enleves ton OR DIE
On peut faire ça ? :
mysql_query($req) OR (mysql_errno()) ;

Posté : 27 janv. 2008, 21:17
par Jules Petibidon
Non,

Pourquoi tu veux faire ça ?

Posté : 27 janv. 2008, 21:20
par h0_noMan
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é
}

Posté : 27 janv. 2008, 21:53
par supercanard
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 ?

Posté : 27 janv. 2008, 22:22
par Jules Petibidon
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] ;)