UPDATE ... WHERE..pb de validité du contenu de la variable

Résolu/Fermé
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 12 avril 2020 à 04:53
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 12 avril 2020 à 21:08
Bonjour,

Après un bouton (en fait 2 boutons "submit"), dont voici le code,
<p><label for "ValidationOUI"> Stage accepté </label>
<input type="submit" name="Validation" id="ValidationOUI"  value="ACCEPTE" style="width:150px" />
<input type="submit" name="Validation" id="ValidationNON"  value="REFUSE" style="width:150px" />
<label for "ValidationNON"> Stage refusé </label>
</p>


je tente la transmission vers une table avec ceci :

<?php //activation de l'affichage des erreurs PHP
		error_reporting(E_ALL);
		ini_set('display_errors', TRUE);
		ini_set('display_startup_errors', TRUE);

		//On vérifie qu'on a bien cliqué sur 1 bouton
		if (isset($_POST['Validation'])) {

		//On passe la valeur de $_POST['Validation'] dans $Validation 
		$Validation = $_POST['Validation'];
		
		//on vérifie nos variables
		!empty($NumStage) ? $NumStage : NULL;
		!empty($Validation) ? $Validation : NULL;
		
		//on affiche les variables (test concluant)
		echo ' Validation : '.$Validation ;
		echo ' N° du stage concerné : '.$NumStage;
		
		//on inclut le fichier de connexion à la bdd
		require_once "secure/cnxBdd.php";
	 
		//$sth appartient a la classe PDOStatement
		$sth = $bdd->prepare("UPDATE Stages SET Validation = :decis WHERE NumStage = $NumStage");
		$sth->bindParam(':decis', $Validation, PDO::PARAM_STR);
        $sth->execute();
		
	//	$sth->execute(array($Validation));  //ça c'était avant les 2 lignes bindParam et execute
		  print "<br>$sth<br>";            
				echo '<br><br>		Votre décision pour ce stage a bien Le stage a bien été prise en compte ';
		}
		
		$bdd = null; // Ferme la connexion 
?>


J'ai bien compris, je pense qu'il ne fallait pas utiliser la requête INSERT INTO.. mais UPDATE pour rajouter la valeur de la décision dans un enregistrement existant.

Lors de l'exécution, j'ai un message d'erreur (que je vais mettre en dessous) mais je crois avoir compris que l'erreur vient du contenu de la variable $NumStage et que c'est parce qu'il y a un espace à l'intérieur de la variable qu'il y a un soucis. le '32' ne peut provenir que de la valeur de cette variable qui est du genre 'TEXTE+espace+N°'
Si c'est le cas, comment puis-je contourner la difficulté ? svp et merci d'avance pour vos bons conseils.

Message :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '32' at line 1' in /var/www/sda/0/e/..../Ddevalidation.php:189 Stack trace: #0 /var/www/sda/0/e/..../Ddevalidation.php(189): PDOStatement->execute() #1 {main} thrown in /var/www/sda/0/e/..../Ddevalidation.php on line 189

Daniel

Configuration: Windows / Firefox 75.0 / php 5.6.34


--
A voir également:

2 réponses

jordane45 Messages postés 38310 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
12 avril 2020 à 14:02
Bonjour,

Pour afficher les array, les objets, les class ... ce n'est pas print qu'il faut utiliser... mais print_r

Quoi qu'il en soit, ton code serait mieux ainsi :
$sql = "UPDATE Stages SET Validation = :decis WHERE NumStage = :NumStage";

try{
	$sth = $bdd->prepare($sql);
	$sth->bindParam(':decis', $Validation, PDO::PARAM_STR);
	$sth->bindParam(':NumStage', $NumStage, PDO::PARAM_INT);
	$result = $sth->execute();
}catch(Exception $e){
  echo "Erreur : " . $e->getMessage();
}

echo " <br>Résultat de l'update : " . print_r($result,true);

1
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
12 avril 2020 à 21:08
Bonjour Jordane,

Merci pour le code amélioré et sûrement plus conventionnel que mon bricolage.

Daniel
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
12 avril 2020 à 05:21
ça fonctionne après avoir apporté les corrections suivantes :
- Mettre la variable du WHERE avec des guillemets
//$sth appartient ↓a classe PDOStatement
		$sth = $bdd->prepare("UPDATE Stages SET Validation = :decis WHERE NumStage = '$NumStage'");
		$sth->bindParam(':decis', $Validation, PDO::PARAM_STR);
        $sth->execute();


ensuite il y avait toujours une erreur mais "plus petite" (avec moins de lignes ;-)) qui était :

Catchable fatal error: Object of class PDOStatement could not be converted to string in /var/www/sda/0/e/..../Ddevalidation.php on line 192

corrigée tout simplement en mettant la ligne concernée en commentaire

//	  print "<br>$sth<br>";


Bon, pour les puristes ce ne doit pas être la meilleure solution, mais ça marche. Il n'y a plus d'erreur et l'update est bien fait dans la table.

Ceci étant, je suis preneur de toute proposition qui serait plus conventionnelle ou d'explications sur pourquoi l'objet de la classe ne peut être convertie en chaine de caractères et/ou pourquoi l'execute de l'array($Validation) ne pouvait pas aller.

Daniel

--
0
yg_be Messages postés 23343 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 24 novembre 2024 1 551
12 avril 2020 à 12:55
bonjour, de quoi souhaites-tu faire print?

pourquoi n'utilises-tu pas le bindParam pour tes deux paramètres variables?
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > yg_be Messages postés 23343 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 24 novembre 2024
12 avril 2020 à 21:06
Bonjour yg_be,
C'était juste pour voir la requête exécutée. pour le cas où la valeur n'arriverait pas sur la table . Mais en fait, certainement que la gestion des erreurs avec PDO me l'aurait dit tout simplement.
Sinon, c'est juste un echo qui se fait lorsque tout s'est bien déroulé.
Pourquoi, je n'ai pas utilisé le bindParam pour les 2 variables ? Cela ne m'est pas venu à l'esprit car pour moi, il n'y avait que la variable de décision à envoyer.... l'autre ($NumStage) étant déjà dans la table, elle ne sert qu'à caler l'endroit où la valeur de la variable ($Validation) doit être mise.
Merci pour l'intérêt porté à mon soucis maintenant résolu.
Daniel
0