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

Résolu
danielos77 Messages postés 108 Date d'inscription   Statut Membre Dernière intervention   -  
danielos77 Messages postés 108 Date d'inscription   Statut Membre Dernière intervention   -
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   2
 
ç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 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Membre Dernière intervention   2 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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