problème UPDATE mysql avec $_POST

vizz
Invité n'ayant pas de compte PHPfrance

10 sept. 2014, 13:11

Bonjour,

J'ai un problème de mise à jour d'une bdd avec des valeurs provenant d'un formulaire.

Le formulaire ne pose pas de problème, les variables $_POST sont bien envoyées, et un echo de ces variables donne le résultat attendu.
Par contre la requête de mets pas à jour la bdd. Problème de syntaxe ?

Voici le code commenté, appelé par la validation du formulaire :
echo $_POST['newnom'];          //ok
echo $_POST['matricule'];       //ok
 
     
 
//on traite le formulaire
        $req=$bdd->prepare("UPDATE table_personnel SET nom=:nom WHERE matricule='".$_POST['matricule']."'");  //ok avec un matricule tapé en dur, mais ne prends pas avec le $_POST
        $req->execute(array(':nom' => $_POST['newnom'],
                                 
                                 
                            ));     
En remplaçant dans la requête '".$_POST['matricule']."' par un matricule existant dans la bdd, la table est bien mise à jour.

Le problème est donc bien a priori une erreur de syntaxe dans le WHERE.

J'ai testé le code en passant tous les paramètres dans la requête préparée :
try
                {
                    $bdd=new PDO('mysql:host=localhost;dbname=oda','root','');
                    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                }
                catch (PDOException $e) {
                echo 'Échec lors de la connexion : ' . $e->getMessage();
                }
     
    echo $_POST['newnom'];          //ok
    echo $_POST['aNOM'];            //ok   
    echo $_POST['matricule'];       //ok
 
         
     
    //on traite le formulaire
            $req=$bdd->prepare("UPDATE table_personnel SET nom=:nom WHERE matricule=:matricule");  //ok avec un matricule tapé en dur, mais ne prends pas avec le $_POST
            $req->execute(array(':nom' => $_POST['newnom'],
                    ':matricule' => $_POST['matricule']
                                ));  
Les trois lignes echo $_... donnent le résultat attendu, mais aucune mise à jour dans la bdd.

En remplaçant le matricule=:matricule par un matricule existant dans la bdd
$req=$bdd->prepare("UPDATE table_personnel SET nom=:nom WHERE matricule='123456789')
$req->execute(array(':nom' => $_POST['newnom']));
là, tout se passe bien...

Mais ou est donc l'erreur ??
Merci d'avance

Mammouth du PHP | 2278 Messages

10 sept. 2014, 13:41

Si tu extrayais tes variables avant de les enfourner dans tes requetes, tu aurais une syntaxe plus lisible
$matricule = valider($_POST['matricule']); //valider reste à écrire retourne un $matricule ou FALSE;
if ($matricule == FALSE)
{
inutile d'aller plus loin
}
else
{
$autre = valider($_POST['autre']);
}
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ynx
Mammouth du PHP | 586 Messages

10 sept. 2014, 14:56

Salut,

Personnellement je ne trouve pas forcément plus lisible le fait de passer par une variable intermédiaire. Ceci peut porter à confusion pour savoir quelle variables utiliser, et sutout puisqu'on utilise les requêtes préparées, on peut directement utiliser nos variables POST sans risques d'injections sql.

Le problème de mise à jour vient peut-être d'une mauvaise conversion du matricule à l'exécution de la requête. Essaye en utilisant la méthode bindParam en précisant le type de la donnée :
$req=$bdd->prepare("UPDATE table_personnel SET nom=:nom WHERE matricule=:matricule");
$req->bindValue(':nom', $_POST['newnom'], PDO::PARAM_STR);
$req->bindValue(':matricule', $_POST['matricule'], PDO::PARAM_INT); // remplacer le 3e paramètre par PDO::PARAM_STR si le matricule est une chaine
$req->execute();
Bonne journée

vizz
Invité n'ayant pas de compte PHPfrance

10 sept. 2014, 15:30

Salut,

Pour compléter :
Si je fais plusieurs echo des valeurs envoyées par le formulaire :
echo $_POST['newnom'];		
	echo $_POST['aNOM'];		
	echo $_POST['matricule'];		
	echo $_POST['newnom'];
	echo $_POST['matricule'];
Le résultat retourné est : newnom aNOM matricule newnom
Le second echo sur le matricule ne renvoie rien. Le problème viendrait-il du formulaire, que voici :
<form action="trait_perso_modif.php" method="POST">
				<p id="form2">
					<label>Salari&eacute; : </label><select name="aNOM" id="aNOM">	
												<?php 	//on selectionne les matricules dans la table correspondant aux salariés présents (pas de date de départ)
														$reponse = $bdd->query("SELECT matricule FROM table_contrats WHERE ste='".$_SESSION['ste']."' AND date_depart='0000-00-00'");
														while ($donnees = $reponse->fetch())
														{	//on selectionne les nom et prenom des salariés correspondant à ces matricules dans la table perso
															$liste=$bdd->query("SELECT * FROM table_personnel WHERE matricule='".$donnees['matricule']."' ORDER BY nom");
															
															while ($donnees=$liste->fetch())
															{	
												?>
												<option value="<?php echo $donnees['nom']." ".$donnees['prenom']." ".$donnees['matricule']; ?>"> <?php echo $donnees['nom']." ".$donnees['prenom']; ?></option>
												<?php
												}}
												
												?>
												</select></br></br>
												
																
					<input type="hidden" name="matricule" id="matricule" value="<?php $donnees['matricule'];?>"/>					
					<label>NOM : </label><input type="text" name="newnom" id="newnom" maxlength="20"/></br>
					<label>Adresse : </label><textarea name="newadresse" id="newadresse" rows="3" COLS="40"></textarea></br>
					<label>T&eacute;l&eacute;phone : </label><input type="text" name="newtel" id="newtel"/></br>
					<label>Email : </label><input type="email" name="newemail" id="newemail"/><br>						
					<input type="submit" value="Envoyer"/>
					<input type="reset" value="Effacer"/>
				</p>
			</form>
Je ne me suis intéressé pour l'instant qu'au cas du newnom, mais déjà ça bloque.
Quelqu'un aurait-il une idée ?

-> ynx, j'ai tenté la méthode bindParam que tu suggères , sans plus de résultat

ynx
Mammouth du PHP | 586 Messages

10 sept. 2014, 16:45

Le second echo sur le matricule ne renvoie rien.
Le problème vient donc de là, mais c'est incompréhensible : à moins d'altérer le tableau $_POST, l'affichage du deuxième echo ne devrait pas être différent du premier !

Que donne le code suivant ?
echo '<pre>';
var_dump($_POST);
var_dump($_POST['newnom']);
var_dump($_POST['aNOM']);           
var_dump($_POST['matricule']);              

var_dump($_POST);
var_dump($_POST['newnom']);
var_dump($_POST['matricule']);
echo '</pre>';
Pour information, quelle version de php utilises-tu ?

Vizz
Invité n'ayant pas de compte PHPfrance

10 sept. 2014, 17:34

OK bien vu
le premier echo ne renvoie rien non plus. Dans le formulaire, la valeur de aNOM c'est nom-prenom-matricule, d'où ma confusion avec les echo.
Donc le problème se situe dans le formulaire, et sur la ligne :
<input type="hidden" name="matricule" id="matricule" value="<?php $donnees['matricule'];?>"/>
qui dans mon esprit fatigué devait envoyer un $_POST['matricule'], mais qui est super mal placée, hors de la portée de la requête.
Le matricule étant la seule donnée utilisée dans les deux tables, je dois me baser sur cette donnée pour gérer mes bases;
Là je suis paumé, je sais pas trop comment récupérer ce matricule.

vizz
Invité n'ayant pas de compte PHPfrance

10 sept. 2014, 19:49

Je reponds à moi-même,
En récupérant les n derniers caractères de la variable 'aNOM' et ça me donne le matricule, et l'affaire est faite.

Merci pour votre aide