[RESOLU] Modification enregistrement PHP / MYSQL / PDO

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Modification enregistrement PHP / MYSQL / PDO

Re: Modification enregistrement PHP / MYSQL / PDO

par ninouee » 11 août 2016, 21:38

Bonsoir!

J'y suis !

Voila le code avec lequel j'arrive à modifier mes dates:
$reponse = $bdd->prepare(
  			'UPDATE personnalite 
  			SET prenom = :nouveau_prenom, 
				nom = :nouveau_nom, 
				naissance =  STR_TO_DATE(:nouveau_naissance, "%d/%m/%Y"), 
				photo = :nouvelle_photo 
				
			WHERE id = :id ');
    
  $reponse->execute(array( 
      'nouveau_prenom' => $_POST['prenom'],
      'nouveau_nom' => $_POST['nom'],
   'nouveau_naissance' => $_POST['naissance'],
      'nouvelle_photo' => $_POST['photo'],
	 'id' => $_POST['id'],
      ));
Maintenant je bute sur un autre détail mais ça concerne un autre sous forum.

Je n'arrive pas à avoir une date vide quand je supprime la date.

Re: Modification enregistrement PHP / MYSQL / PDO

par ninouee » 06 août 2016, 11:57

Je pensais pas que ne pas intégrer "id" dans
$reponse->execute(array( 
      'nouveau_prenom' => $_POST['prenom'],
      'nouveau_nom' => $_POST['nom'],
      'nouveau_naissance' => $_POST['naissance'],
      'nouvelle_photo' => $_POST['photo'],
	  'id' => $_POST['id'],
      ));
Pouvait poser problème. Je l'avais volontairement omis car ce n'est pas cette valeur que je voulais modifier car il s'agissait de la valeur de base. Erreur de débutant. :D

Du coup j'ai ajouté tous les paramètres concernant l'id dans les différents formulaire et ça ne bloque plus à ce niveau là. Ca avance bien. :D

Pour STR_TO_DATE et DATE_FORMAT j'avoue encore les confondre...

Du coup comme conseillé j'ai modifié le paramètre et bien entendu j'ai un problème de format.

Si je comprend bien STR_TO_DATE il prend ma date par exemple 26/08/2016 et la transforme en date de serveur car je lui ait dit "en gros" à quoi correspondaient les éléments de ma date pour qu'ils les mettent dans son sens à lui avec "%d,%m,%Y".

Du coup j'ai de nouvelles erreurs par rapport à ça. J'ai fouiné et j'ai tenté différentes combinaisons aussi infructueuses que les autres.

Ce que je croyais être bon c'est ça :
$reponse = $bdd->prepare('UPDATE personnalite SET prenom = :nouveau_prenom, nom = :nouveau_nom, STR_TO_DATE(naissance, "%d,%m,%Y", "=:nouveau_naissance"), photo = :nouvelle_photo WHERE id = :id ');
    
  $reponse->execute(array( 
      'nouveau_prenom' => $_POST['prenom'],
      'nouveau_nom' => $_POST['nom'],
      'nouveau_naissance' => $_POST['naissance'],
      'nouvelle_photo' => $_POST['photo'],
	  'id' => $_POST['id'],
      ));
Et ça me donne ça : Erreur:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Donc je me suis dit que les paramètres de STR_TO_DATE étaient faux donc j'ai fait plusieurs changements:
UPDATE personnalite SET prenom = :nouveau_prenom, nom = :nouveau_nom, STR_TO_DATE(naissance, "%d,%m,%Y", :nouveau_naissance), photo = :nouvelle_photo WHERE id = :id
Qui donne : Erreur:SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '(naissance, "%d,%m,%Y", '03/04/1986'), photo = 'http://ddstv.fr/galerie/albums/u' à la ligne 1
UPDATE personnalite SET prenom = :nouveau_prenom, nom = :nouveau_nom, STR_TO_DATE(naissance, "%d,%m,%Y", nouveau_naissance), photo = :nouvelle_photo WHERE id = :id
Résultat : Erreur:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
UPDATE personnalite SET prenom = :nouveau_prenom, nom = :nouveau_nom, naissance = :(STR_TO_DATE(naissance, "%d,%m,%Y", nouveau_naissance)), photo = :nouvelle_photo WHERE id = :id
résultat : Erreur:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens


J'avoue ne pas avoir trouvé d'explications.

Vous avez une idée?
Les paramètres de STR_TO_DATE ne sont pas dans le bon sens? Ou alors pas dans le bon endroit.

Car là je vois pas.

Merci à vous! :D

Re: Modification enregistrement PHP / MYSQL / PDO

par moogli » 05 août 2016, 10:22

salut,

le message te dit que tu n'as pas le bon nombre de paramètre et il faut le croire :-)~
tu as 5 paramètres dans la requête et n'en fournit que 4 dans le tableau => BOOM ;)

ensuite ceci risque de fortement te peter à la figure : DATE_FORMAT(naissance, "%d/%m/%Y") AS naissance = :nouveau_naissance

Le date_format ne te sera pas nécessaire ici.Il te faut l'inverse str_to_date

je te conseil de tester ta requêtes SQL dans un client SQL (phpmyadmin, HeidiSQL ou autre) afin de la valider puis de l'utiliser ensuite dans ton code php.

@+

Re: Modification enregistrement PHP / MYSQL / PDO

par ninouee » 04 août 2016, 19:52

Oh mince j'avais pourtant fait les modifications et vérifications pour ça. J'y avais pensé mais pas vu qu'il y avait une différence.

Merci!!!!!

J'ai donc fait les modifications mais j'ai une erreur qui apparaît, il devait y avoir d'autres choses.

L'erreur est celle-ci : Erreur:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

En fouinant j'ai cru comprendre qu'il manque un élément dans ma requette, pourtant j'ai mes 4 champs qui doivent être modifiés et l'id qui sers de point de repère.

Je ne comprend pas.

Re: Modification enregistrement PHP / MYSQL / PDO

par or 1 » 03 août 2016, 21:40

pour comprendre le problème de non affichage du nom, il faut jouer au jeu des 7 différences entre ces 2 lignes.
<input type="text" name="prenom" value="<?php echo $donnees['prenom'];?>" tabindex="20"/>
<input type="text" name="nom" title="<?php echo $donnees['nom'];?>" tabindex="20"/>

pour la connexion, il vaux mieux la mettre dans un fichier et inclure ce fichier dans les autres fichiers php. ainsi, s'il y a changer les données, sur le vrai site par exemple, il n'y a qu'un fichier à modifier.

Modification enregistrement PHP / MYSQL / PDO

par ninouee » 03 août 2016, 21:17

Bonjour à tous!

Je reviens vers vous après que vous m'ayez bien aidée à comprendre les dates. :D

Pour le moment j'ai l'impression de bien avancer mais depuis quelques jours je butte sur la modification de saisie. J'ai testé plusieurs tutoriels mais à chaque fois j'avais des problèmes car je ne comprenais pas tout ou alors j'avais des incohérences entre la connexion à la base via PDO ou natif. J'avoue tout juste commencer à saisir du coup je préfère m'adresser à vous.

Pour le moment je travaille en local sur une base de donnée avec une table pour essayer de comprendre le fonctionnement de tous ces langages avant de me lancer sur le site définitif.
J'arrive à insérer et à visualiser ce que j'envoie dans la base ce qui est un exploit pour moi.

J'ai actuellement 4 fichiers qui devraient me permettre de faire ma saisie et mes correction le tout prevenant de divers bouts de code modifiés trouvés par-ci par-là

J'ai l'impression que ça fonctionne à moitié mais je ne sais pas où est l'erreur.

Voila ce que donne mon code :

Le formulaire de saisie avec la liste des enregistrements afin qu'ils soient modifiés à postériori:
Image

Le formulaire de correction :
Image
Donc là je vois que ça coince car il me manque le nom et la date de naissance et la possibilité d'envoyer la correction au serveur.

J'essaie de travailler en PDO pour plus de sécurité à ce qu'on m'a dit mais j'ai pas l'impression de réussir.

Voila mes codes:
fichier index.php qui permet de saisir et voir.
<form action="personnalite.php" method="post">
        <p>
        <label for="nom">Nom</label> : <input type="text" name="nom" id="nom" /><br />
        
        <label for="prenom">prénom 1</label> :  <input type="text" name="prenom" id="prenom" /><br />
        
        
      <label for="naissance">Date de naissance</label> :   <input type="text" name="naissance" id="naissance"/><br />
        
        <label for="photo">Lien photo</label> :   <input type="text" name="photo" id="photo"/><br />

        <input type="submit" value="Envoyer" />
	</p>
    </form>

<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
	
	
	$bdd -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Requête pour affichage
$reponse = $bdd->query('
	SELECT nom, prenom , 
	DATE_FORMAT(naissance, "%d/%m/%Y") AS naissance , photo
	FROM personnalite 
	ORDER BY ID DESC LIMIT 0, 1');
	
	

// Afficher le dernier enregistrement
while ($donnees = $reponse->fetch())
{
	echo '<p>' . htmlspecialchars($donnees['prenom']) .
	
	' ' . htmlspecialchars($donnees['nom']) .
	
	', née le ' . htmlspecialchars($donnees['naissance']) .
	
	 "<img src=\"" . htmlspecialchars($donnees['photo']) . "\"  />" .
	
	'</p>';


}


$reponse->closeCursor();

// Modifier un enregistrement

//connection au serveur:
 {  

$reponse = $bdd->query('SELECT nom, prenom , 
			DATE_FORMAT(naissance, "%d/%m/%Y") AS naissance , photo, id
	     	FROM personnalite
	      	ORDER BY nom');
			
			
 
    while ($donnees = $reponse->fetch())
    {
    ?>
        <p>
		<?php echo 
		
		
		
		$donnees['nom'] .
		'&nbsp;' . $donnees['prenom'].
		 '&nbsp;' . $donnees['naissance']; ?> <a href="modifier.php?number=<?php echo $donnees['id']; ?>">modifier la fiche</a>

	
<?php
} 
// Fin de la boucle qui affiche les articles avec le lien modifier 
    $reponse->closeCursor();
    
}
?>
personnalite.php
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Insertion du message à l'aide d'une requête préparée

$req = $bdd->prepare('INSERT INTO personnalite (nom, prenom, naissance, photo) VALUES(?, ?, str_to_date(?, "%d/%m/%Y"), ?)');
$req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['naissance'] , $_POST['photo']));

// Redirection du visiteur vers la page du minichat
header('Location: index.php');
?>
modifier.php
<?php
// Connexion à la base de données
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
	
    /* On récupère les donnée de l'article séléctioné*/
    $reponse = $bdd->prepare('SELECT prenom, nom, DATE_FORMAT(naissance, "%d/%m/%Y") AS naissance, photo, id  FROM personnalite WHERE id = ?');
    $reponse->execute(array($_GET['number']));
		
	while ($donnees = $reponse->fetch())
    {
    ?>

<!--Formulaire avec les champs préremplis-->

<p>	
<form action="modifier_post.php" method="post" id="modif_personnalite">


<label for="prenom">Prénom</label><br/>

	<input type="text" name="prenom" value="<?php echo $donnees['prenom'];?>" tabindex="20"/><br/>

<label for="nom">Nom</label><br/>

	<input type="text" name="nom" title="<?php echo $donnees['nom'];?>" tabindex="20"/><br/>

<label for="naissance">Date de naissance</label><br/>
	
	<input type="text" name="naissance" title="<?php echo $donnees['naissance'];?>"tabindex="20"/><br/>

<label for="photo">Photo</label><br/>

	<input type="text" name="photo" value="<?php echo $donnees['photo'];?>" tabindex="150"/><br/>	
	  
    <?php
    } 

// Fin de la boucle pour l'affichage des donnée dans la base de donnée
    $reponse->closeCursor();

}

catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}

?>
</form>
et

modifier_post.php
<?php

/*Si le champ "Prénom" est rempli*/
  
if (isset($_POST['prenom']) AND $_POST['prenom'] !== "")
    {  
  
/*Ensuite si le champ "Nom" est rempli*/

	if (isset($_POST['nom']) AND $_POST['nom'] !== "")

       {
/*Puis si le champ "Naissance" est rempli*/

         if (isset($_POST['naissance']) AND $_POST['naissance'] !== "")
            {    
	         
/* Enfin si le champ "Photo" est rempli*/

             if (isset($_POST['photo']) AND $_POST['photo'] !== "")
                {
				   			   
/*Au final on a comme ordre de modifier l'article seulement si les champs numero_article, date_article, text_article et auteur article ne sont pas vide*/

	
	try
		{
			$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
		
		
	$bdd -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

/*cette requètte préparée sert à modifier les données j'ai rajouté "nouveau" et "nouvelle" au nom des variables mais vous n'êtes pas obligé des faire pareil, c'est juste pour mieux me repérer et comprendre ce que je fais.*/
	
	$reponse = $bdd->prepare('UPDATE personnalite SET prenom = :nouveau_prenom, nom = :nouveau_nom, DATE_FORMAT(naissance, "%d/%m/%Y") AS naissance = :nouveau_naissance, photo = :nouvelle_photo WHERE id = :id ');
		
	$reponse->execute(array( 
			'nouveau_prenom' => $_POST['prenom'],
			'nouveau_nom' => $_POST['nom'],
			'nouveau_naissance' => $_POST['naissance'],
			'nouvelle_photo' => $_POST['photo']
			));			
	    }
	catch(Exception $e)
		{
			die('Erreur:'.$e->getMessage());
		}
	$reponse->closeCursor();
	        
			    }
            }
          
	    }  
	
	echo'<p> votre présentation a bien été modifiée</p>';
    }
 
 else
    {  	
	echo '<p>Vous n\'avez pas remplis touts les champs demandés</p>';
	}
?>
Est-ce obligatoire d'avoir autant de fichiers?
Est-il possible de tout regrouper?

Doit-on saisir sur chaque fichier les infos de connexion à la base de donnée?

Désolée j'ai beaucoup de questions mais php est vraiment obscure pour moi je comprend mieux le sql vieux souvenirs avec acces et l'étude des bases de données en bts avec feuille et crayon de papier. :lol:

Pouvez-vous m'orienter pour que je trouve mon erreur afin que je comprenne?

Merci à vous.