[RESOLU] problème sur requête update

Eléphanteau du PHP | 13 Messages

15 mai 2014, 11:54

Bonjour à tous
décidément quand rien ne va ...
mon souci porte sur une requête UPDATE dans une table de commande de produits dans cette table il y a un champ appelé etat_cde qui indique l'état d'une commande . il peut avoir trois états : soit null soit "en cours de préparation" ou bien "terminé".Par exemple lorsque le préparateur affiche la liste des commandes à préparer il clique sur un lien qui le renvoie sur une commande appropriée à ce moment l'état de la commande est indiqué "en cours de préparation" dans la table. là aucun soucis ma table affiche bien l'info.
Maintenant supposons que pour une raison x ou y par exemple il s'est trompé de commande ou bien elle n'est pas encore terminée , il revienne sur la liste des commandes puis qu''il revienne plus tard sur la commande précédente qui est censée être en cours de prépa, là, la liste des articles ne s'affiche plus. en fait tous se passe comme si mysql refusait de réécrire par dessus l'ancienne valeur de l'etat_cde. Mon champ etat_cde est toujours indiqué "en cours de préparation de commande". Je voudrais donc savoir si mysql autorise une réécriture sur une ancienne valeur identique ou pas. ou bien est ma requête qui est elle fausse?
précision : la requête ne fonctionne pas sous phpMyadmin

voici le bout de code qui pose problème
//dès que le préparateur clique sur le lien préparer on modifie l'état de la commande "etat_cde" à "en cours de préparation"
	// de façon à ce que le client puisse le voir dans le suivit de commande sur son compte client
	$selectCmde = $bdd->prepare('UPDATE commande SET etat_cde = \'En cours de préparation\' WHERE num_bon_commande = :numCde AND client = :client AND (etat_cde = \'En cours de préparation\'
	OR etat_cde IS NULL)')
	or die (print_r($bdd->errorInfo()));
	$selectCmde->execute(array(
	'numCde' => $numCde,
	'client' => $client
	));
	
	$resultat = $selectCmde->rowCount();
	echo 'resultat du retour' . $resultat ;
	// si aucun résultat n'est retourné
		if($resultat == 0)
		{
			$message = "<p><strong>La mise à jour sur l'état de la commande n'a pas été faite. Veuillez recommancer l'opération.</strong></p>";
		}
		else
		{...}
Merci pour votre aide

ViPHP
xTG
ViPHP | 7331 Messages

15 mai 2014, 14:11

Ne fonctionne pas sous phpmyadmin => pas la peine d'aller cherche le code PHP alors.
C'est le code SQL qui va pas.

Attention à la notion de NULL, une chaîne de caractère vide n'est pas NULL.
Attention aussi au nombre de caractères vide avant ou après une chaîne, ou bien aux caractères non imprimables.
(le mieux est encore de faire un SELECT de la valeur puis de l'afficher avec var_dump() qui renvoie aussi la taille)

Ce que je veux dire c'est que si ça se trouve tu as dans ton champs non pas "En cours de préparation" mais "En cours de préparation ".

Après ta conception est assez moche, on ne stocke jamais des chaînes de caractères pour des états... On stocke un entier représentant l'état.
A la limite une table en relation pour avoir le nom de l'état (ou bien faire la correspondance dans le code à l'affichage).

Eléphanteau du PHP | 13 Messages

15 mai 2014, 16:56

j'y avais pensé pour la table pour l'etat de la commande mais trop tard . pas grave c'est pour faire un essai.
il n'empêche que c'est pas pour ça que ça ne doit pas fonctionner. :)
j'ai regardé la valeur dans le champ etat_cde pour un essai sur une commande et j'ai pas d'espaces. et puis le champ est par défaut à NULL lorsque une nouvelle commande est crée.
après j'ai fait un essai direct dans myadmin et toujours le même problème .
je ne pensais pas qu'un petite requête comme celle là me causerait autant de soucis .

ViPHP
xTG
ViPHP | 7331 Messages

15 mai 2014, 17:21

Peut être un souci d'encodage ?
Essaies de remplacer dans ton enregistrement et dans ta requête "En cours de préparation" par "En cours de preparation".
Voir même pour le test le remplacer par une valeur numérique. ;)

Eléphanteau du PHP | 13 Messages

15 mai 2014, 19:11

bon et bien on peut dire qu'elle m'en aura fait voire cette requête. mon problème est résolu
En fait j'avais fait un test:
$resultat = $selectCmde->rowCount(); pour connaitre le nombre de lignes traitées avant de récupérer la liste des articles.
et moi je m'obstinais à voir une valeur égale à 1 :)
Donc forcément au début ça passe il me renvoie bien 1 mais après comme l'état est déjà modifié il me retourne 0 au second donc pas d'articles récupérés.