[php] - Problème avec un switch / case - RESOLU - merci @ tous ;)

Voilà mon script assure le suivit documentaire d’assurance de véhicules endommagés.

Pour un lot, j’ai de multiples véhicules.

Pour ces véhicules je stocke dans ma base un marqueur de leur état (normal / anormal) qui est quelque chose qui ne changera jamais.

En revanche je veux aussi stocker la nature de l’avarie, et bien que partiellement standardisé, cela pourra évoluer avec le temps.

J’ai donc une seconde table qui stocke mes natures d’avaries, avec un formulaire pour en rajouter.

La liaison se fait par une clef primaire : 1 = porte rayée, donc dans ma table véhicules à la colonne nature j’ai 1 si mon véhicule a sa porte rayée.

J’espère que sur le principe je suis clair, maintenant la partie qui nous intéresse : il était nécessaire de pouvoir ‘mass changer’ l’état, ou encore la nature d’avarie de nombreux véhicules, et ce à la volée… donc j’ai une checkbox et ensuite une liste déroulante, hop ca change mon état sans problème…

SAUF QUE :

Ma nature d’avarie va évoluer avec le temps… Et que donc mon menu déroulant évolue également :slight_smile:

Voici mon menu déroulant :

	<input type="hidden" value="<?php echo $idLot ?>" name="idLot">
	<select name="massificatorAction">
	<optgroup label="Marqueur">
  <option value="Normal">Normal</option>
  <option value="Anormal">Anormal</option>
  <option value="Annulé">Annulé</option>
	</optgroup>
<?php include("optgroup.php"); ?>
	<optgroup label="Lieu Avarie">
  <option value="Approche">Approche</option>
  <option value="Port">Port</option>
  <option value="Port Final">Port Final</option>
	</optgroup>
	<optgroup label="Effacer">
  <option value="Effacer">Effacer</option>
	</optgroup>
	</select>
	<input type="submit" class="button" value="Mass Change">

Comme vous pouvez le voir, j’ai utilisé optgroup pour raison de présentation, l’inclusion correspond au chargement des natures d’avaries, il s’agit en fait d’un fichier texte généré par le script quand on modifie les natures d’avaries (ca limite les requêtes SQL ainsi).

Après pour gérer toute ces possibilités de modification de mes véhicules, j’ai utilisé un switch :

if (isset($_POST['massificatorAction']))
{
foreach ($_POST['massificator'] as $value)
{
	switch ($_POST['massificatorAction'])
	{
  // Marqueur du véhicule
  case "Normal":
  $sql = "UPDATE vehicules SET MarqueurV='Normal' WHERE idVehicule='$value'";
  break;
  case "Anormal":
  $sql = "UPDATE vehicules SET MarqueurV='Anormal' WHERE idVehicule='$value'";
  break;
  case "Annulé":
  $sql = "UPDATE vehicules SET MarqueurV='Annulé' WHERE idVehicule='$value'";
  break;
  // Lieu de l'avarie
  case "Approche":
  $sql = "UPDATE vehicules SET Lieu='Approche' WHERE idVehicule='$value'";
  break;
  case "Port":
  $sql = "UPDATE vehicules SET Lieu='Port' WHERE idVehicule='$value'";
  break;
  case "Port Final":
  $sql = "UPDATE vehicules SET Lieu='Port Final' WHERE idVehicule='$value'";
  break;
  // Nature de l'avarie
  case "nature":
  $sql = "UPDATE vehicules SET Nature='$value' WHERE idVehicule='$value'";
  break;
  // Effacer les véhicules
  case "Effacer":
  $sql = "DELETE FROM vehicules WHERE idVehicule='$value'";
  break;
	}
	mysql_query($sql);
}

Sauf que pour :

  	case "nature":
  $sql = "UPDATE vehicules SET Nature='$value' WHERE idVehicule='$value'";

cela ne fonctionne pas, j’ai tenté diverses méthodes mais je ne sais pas trop comment gérer ce truc là en fait, est-il possible de faire intervenir mon optgroup ? parce que pour mes autres changements il s’agit d’informations qui sont déjà déterminées et qui ne changeront jamais, et donc on écrit direct dans la base ce dont on a besoin, là je peux pas faire autant de possibilités de requêtes SQL qu’il y aura d’avaries possibles.

comment m’en sortir ?

PS : a propos j’ai un minibug avec mon switch : si on a rien coché ca donne une erreur, comme éviter ca ?

n’y connaît rien au PHP, mais c’est normal que “nature” soit écris en minuscule dans ton code, et avec une majuscule en HTML. :smiley: ( c’est la 1ere chose que j’ai vu: tous les “case” on une maj, sauf celui-ci :slight_smile: )

Et pour ton minibug si tu n’a rien coché: il faut un “default:” dans ton switch arpès le dernier break pour traiter le cas, ça résoud le pbm?

Bon alors voui pour le nature je savais, c’était une erreur ^^

Mais bon le truc c’est que :

<select name="massificatorAction" onchange="doit()">
<optgroup label="marqueur">
<option value="normal">normal</option>

</optgroup>

ok là c’est un truc fixe, ca sera toujours pareil, et donc mon cas vérifie que c’est bien de normal dont il s’agit, et hop il chope la value normal et la balance dans la base de données suivant ma requête pré établie.

en revanche :

<optgroup label="Nature Avarie">
<option value="1">Porte rayée</option>
<option value="2">Coffre forcé</option>

</optgroup>

Là j’ai rien qui permet de formellement dire : c’est une nature d’avarie, donc ca complique ma vie pour faire mon case…

J’ai pensé utiliser javascript, et avoir un champ masqué, faudrait que je définisse une valeur “nature” pour mon optgroup, et quand on sélectionne un élément de cet optgroup et ben ca set nature dans le champ masqué, à partir de là je fais une vérification avant même mes switch, et j’en ai plusieurs séries suivant la valeur de mon champ caché…

reste à faire le javascript :confused:

j’ai fait ca là :

function doit()
{
document.massChange.actor.value=document.massChange.massificatorAction.value
}
Mais là ca donne la valeur de mes <options, qui sont changeantes, et donc ca me permet pas de m’en sortir :confused: une idée ?

Histoire que cela soit plus clair, voilà la page :

http://img481.imageshack.us/img481/4197/optgroupprobleme4qu.th.jpg

Tu vois je peux changer diverses colonnes depuis un seul menu en fait…

Et ce fameux contenu est dynamique pour la partie nature avaries, le reste est fixé dans le béton et ne changera pas, donc je fais ca en hardcodé ^^ Mais pour la nature, il faut qu’on puisse en rajouter… donc j’ai besoin de dynamisme :frowning:

Yen a mare !!! je vois plus rien à mon code tellement j’ai essayé de trucs différents :smiley: /pétage de plombs :smiley:

j’ai l’impression que tu te poses bah la bonne question dans le bon sens …

ce que j’ai compris :

  • tu as une table avec tes véhicules

  • tu as une autre table avec des avaries

  • cette table avarie est modifiable dans les intitulés

  • les avaries sont notées pour chaque véhicule en faisant référence à l’identifiant de l’avarie (ce qui fait que chaque véhicule ne peut avoir qu’une avarie, ce que je trouve vachement limité quand même, 'fin passons) …

  • tu as une seule select box pour choisir véhicule avarié (et si oui quel avarie) ou non (je trouve ça pas top aussi, limite j’aurais mis une case à cocher au-dessus de la select box, cette dernière étant inactive par défaut, et quand tu coches la case, la select box devient active, ce qui te permet de choisir ton avarie) …

  • ton problème est de pouvoir différencer le switch avarie / pas avarie de l’avarie sélectionné …

donc bon, déjà moi j’aurais pas fait comme toi, et donc j’aurais pas eu ton problème :smiley: … ensuite, d’après ce que je vois, tes values d’avaries sont toutes des numériques … donc à mon avis avec is_numeric(), tu peux différencier les avaries du reste ?

rroohhhhh … IE + EasyPHP :ane:

Saluton,
la clause default ne changera rien au problème, il faut tester isset($sql) avant de faire la requête :
if (isset($sql)){mysql_query($sql);}
Pour le reste je pense que deltree a vu juste.

En fait c’est juste destiné à changer en grand nombre les états de mes véhicules, c’est pas prévu pour faire les trucs un par un :slight_smile:

ensuite c’est pas vraiment les bons intitulés, ca sera plutôt : collision, vol, manque (truc oublié par l’usine)… c’est beaucoup plus général que ca donc :slight_smile:

Pour les checkbox, ben cf ma réponse d’avant : c’est là pour éditer de nombreux véhicules en même temps, plutôt que devoir saisir un par un le bazar…

Déjà qu’il faut se saisir 17 chiffres et lettres pour les numéros de chassis + le montant des dégats… et encore d’autres trucs, donc je voulais limiter les manipulations pour l’utulisateur, d’où mon “massificator”

Oui clairement ya certainement bien mieux fichu, mais bon là je fais un peu avec les moyens du bord :confused:

PS: t’es toujours le bienvenu à la maison si ca t’amuse ^^ mais bon tu risques d’y passer le week end tellement le code va te faire mal aux yeux ^^

EDIT : et pour IE ben c’est le navigateur standard de l’entreprise, donc pas de raison de bosser sous fox, easyphp ben sur mon portable j’ai rien d’autre et j’ai pas envie de me faire chier avec le reste ^^

Non, enfin oui aussi, mais l’erreur se situe principalement sur le foreach ==> invalid argument supplied for foreach()

question con : les values de tes options, ce sont les identifiants des avaries dans la base ? si non, ça pourrait être une solution non ?

bah euh… table natures d’avaries :
idNature : tinyint << ID
Nature : varchar << mon texte

la méthode javascript me semblait un bon contournement du problème, mais comment faire en sorte que n’importe quel élément d’un optgroup spécifique renvoit sur un autre champ une valeur de mon choix… là je sais pas :frowning:

Faut-il utiliser switch case d’ailleurs dans mon cas particulier ?

Prout tiens, j’y comprends plus rien moi :frowning:

Je connaissais pas les optgroup: j’ai vu rapidement, et le problème, c’est que tu récupère la valeur de l’option, pas celle de l’optgroup. C’est l’optgroup qui vaut “nature” et tu teste la valeur d’un option de la nature dans le switch.
Il faudrait que tu préfixe toutes tes valeurs d’option liée à une nature par “nature:” et ensuite tu traite le cas en dehors du switch avec un bon vieux if pour tester le début de la valeur, et traiter la nature à part (ou alors dans le default du switch.
Enfin, une 2ème liste déroulante pour les nature aurait ptêt été plus simple à faire :slight_smile:

moi non plus :neutre:

J’ai également pensé à ca !!!

Mais je savais pas trop comment le gérer en fait :smiley:

Une seconde liste déroulante spa possible, ya pas la place ^^

Mais ca serait le mieux : on choisit nature, lieu, marqueur dans la première, et ca change la seconde avec les options qui vont bien ^^ et éventuellement un champ caché en même temps ^^

Euh, la place ca ce gagne…
Genre tu mets les 2 select box côte à côte et le bouton mass change en dessous, ya largement la place !

edit: pour la chexkbox, je n’avais pas compris que c’était un autre champs: tu ne peux pas bêtement tester s’il n’est pas vide avant de boucler avec foreach?
et une faute dans le code, qui n’est pas la cause du bug:


$sql = "UPDATE vehicules SET Nature='[COLOR=red]$value[/COLOR]' WHERE idVehicule='$value'

$value correspond à ton id, ce n’est pas l’id que tu affecte, plutôt la valeur de l’option $_POST[‘massificatorAction’] , et dans ma solution(préfixer…) la sous-chaine après ce préfixe…

bah le mieux de toute façon, c’est une liste déroulante par option :oui: …

je crois que je comprend mieux : en fait, ton select te permet de changer plusieurs options, mais une à la fois ? (je sais pas si ce seras très clair pour l’utilisateur final déjà qu’on a du mal à comprendre :D)
donc là oué, je pense que t’auras du mal à éviter le prefixeur pour savoir quel type de traitement appliqué à l’information que tu récupères de ton select :confused:
pour gêrer le préfixeur, un bête preg_match_all te permet de récupérer facilement les différents paramêtres :oui: … mais un substr() te conviendras ptet pour commecner :smiley:

ce serait quand même mieux si tu pouvais faire un site demo avec des exemples bidons de ton espèce de truc machin :smiley:

Kiss > Je vais upper mon bordel sur un serveur de test, faut juste que je trouve le temps :slight_smile:

en effet mon select permet de faire des traitements de masse sur différentes colonnes de ma table véhicules

Dalai-Lama > nan, je veux la méthode compliquée, stou ! :o

deltree > heu oui en effet, raaa ^^

au pire tu fais pour chaque option :
<option onSelect=“document.getElementById(‘machin’).value = ‘lalala’” value=“trilili”>pouet</option>
<option onSelect=“document.getElementById(‘machin’).value = ‘lilili’” value=“ouep”>plop</option>
<option onSelect=“document.getElementById(‘machin’).value = ‘lololo’” value=“truc”>bidule</option>

et tu met un input hidden avec id="machin"
ensuite tu fais un switch de ton post avec machin et basta :o

C’est ca que je cherche depuis un moment comment faire ^^ merci !!

Merci à tous en fait… bon faut que je refasse tout de zéro là, cay tro le bourdail :smiley: