[RESOLU] Code PHP PDO qui fait des doublons

Petit nouveau ! | 5 Messages

21 mars 2013, 00:39

Bonjour je viens vers vous car je n'arrive a résoudre ce problème qui m' empêche d'avancer.
Mon code crée dans la base deux enregistrement identique avec un timestamp égale a la seconde prés. N'ayant pas des connaissance très hautes dans ce domaine j’espère pouvoir régler ce problème avec vous.

Voici mon index ainsi que mes 4 objet.


index.php
<html>
<body>
	<form method="POST" action="index.php" enctype="multipart/form-data" >
		Prenom: <input type="text" name="prenom">
		Nom: <input type="text" name="nom">
		Age: <input type="text" name="age">
		telephone: <input type="text" name="telephone">
		naissance: <input type="text" value="XX/XX/XXXX" name="naissance">
		email: <input type="text" name="email">
		adresse: <input type="text" name="adresse">
		code postal: <input type="text" name="codepostal">
		ville: <input type="text" name="ville">
		<input type="hidden" name="MAX_FILE_SIZE" value="1000000000000000000000000000000000000000000000000">
    	Fichier : <input type="file" name="photo">
    	
		<input type="submit" value="enregistrer">
	</form>
	

</body>
</html>


<?php

 require 'CompteEleveManager.class.php' ;
 require 'Eleve.class.php';
 require 'EleveManager.class.php';
 require 'Compte.class.php';

		 		
 
		 if(isset($_FILES['photo']))
		 {
		 	$dossier = 'upload\\';
		 	$fichier = basename($_FILES['photo']['name']);
		 	if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
		 	{
		 		echo 'Upload effectué avec succès !';
		 		$photo = $dossier.$fichier ;
		 		

		 	}
		 	else //Sinon (la fonction renvoie FALSE).
		 	{
		 		echo 'Echec de l\'upload !';
		 	}
		 }
	 	if( isset($_POST['prenom'])&& 
		    isset($_POST['nom'])&&
		    isset($_POST['age'])&&
			isset($_POST['telephone'])&&
			isset($_POST['naissance'])&&
			isset($_POST['email'])&&
			isset($_POST['adresse'])&&
	 		isset($_POST['codepostal'])&&
	 		isset($_POST['ville'])
			)		
				 		
		{
			

			$eleve = new Eleve(
								array
									(
										'prenom' => $_POST['prenom'],
										'nom' => $_POST['nom'],
										'age' => $_POST['age'],
										'telephone' => $_POST['telephone'],
										'naissance' => $_POST['naissance'],
										'email' => $_POST['email'],
										'adresse' => $_POST['adresse'],									
										'codepostal' => $_POST['codepostal'],
										'ville' => $_POST['ville'],
										'photo' => $photo,
									)
					
								);
			$compte = new Compte(
									array(
										   'telephone' => $_POST['telephone'],
											'soldes' => $inscription = 250,
											
										)
								);
			try
			{
				$db = new PDO('mysql:host=localhost;dbname=pdo', 'root', '');
				$manager = new EleveManager($db);	 
				$manager->add($eleve);
				
				$db1 = new PDO('mysql:host=localhost;dbname=pdo', 'root', '');
				$manager2 = new CompteEleveManager($db1);
				$manager2->add($compte);
			}
			catch(PDOException $e)
			{
				echo "connection fail ".$e->getMessage();
		
			}	
		}
		else
		{
			echo "t enocre un nul";
		}
 
?>
Eleve.class.php
<?php
class Eleve
{

	protected  $_prenom;	
	protected  $_nom;
	protected  $_age;
	private    $_telephone;
	protected  $_naissance;
	protected  $_email;
	protected  $_adresse;
	protected  $_code_postal;
	protected  $_ville;
	protected  $_photo;	
	protected  $_date;

	


	public function __construct(array $donnees)
	{
		
	  foreach ($donnees as $key => $value)
	  {
	    // On récupère le nom du setter correspondant à l'attribut.
	    $method = 'set'.ucfirst($key);
	     
	    // Si le setter correspondant existe.
	    if (method_exists($this, $method))
	    {
	    	
	      // On appelle le setter.
	      $this->$method($value);
	    }
	  }
	}

  public function prenom() {  return $this->_prenom; }
  public function nom() { return $this->_nom; } 
  public function age() { return $this->_age; } 
  public function telephone() { return $this->_telephone; } 
  public function naissance() { return $this->_naissance; } 
  public function email() { return $this->_email; }
  public function adresse() { return $this->_adresse; }
  public function codepostal() { return $this->_code_postal; }
  public function photo() { return $this->_photo; }
  public function ville() { return $this->_ville; }
  public function date()  { return $this->_date; }
  
  
 
  public function setPrenom($prenom)
  {
  	// On vérifie qu'il s'agit bien d'une chaîne de caractères.
  	// Dont la longueur est superieur à 0 caractères.
 
  		$this->_prenom = $prenom;

  		

  	
  }
  public function setNom($nom)
  {
 	// On vérifie qu'il s'agit bien d'une chaîne de caractères.
  	// Dont la longueur est superieur à 0 caractères. 

  	
  		$this->_nom = $nom;
  	
  }
  public function setAge($age)
  {
 	// On vérifie qu'il s'agit d'un int.
  

  
  
  		$this->_age = $age;
  	
  }
  public function setTelephone($telephone)
  {
 	// On vérifie qu'il s'agit bien un int.

  	// Dont la longueur est superieur à 0 caractères et inferieur a 10. 

  	
  		$this->_telephone = $telephone;
  	
  }
  public function setNaissance($naissance)
  {
 	// On vérifie qu'il s'agit bien int.
  	
  	// Dont la longueur est superieur à 0 caractères. 

  	
  		$this->_naissance = $naissance;
  	
  }
  
  public function setEmail($email)
  {
  	

  	
  	
  		$this->_email = $email;
  		
  	
  }
  
  public function setAdresse($adresse)
  {
 	// On vérifie qu'il s'agit bien d'une chaîne de caractères.
  	// Dont la longueur est superieur à 0 caractères. 
  	
  	
  		$this->_adresse = $adresse;
  	
  }
  	

  
  public function setCodepostal($codepostal)
  {
 	// On vérifie qu'il s'agit bien d'un int.
  	
  	// Dont la longueur est superieur à 0 caractères et ne depasse pas 5. 
  
  	
  		$this->_code_postal = $codepostal;
  	
  }
  
  public function setVille($ville)
  {
 	// On vérifie qu'il s'agit bien d'une chaine.
  	// Dont la longueur est superieur à 0 caractères. 
  	
  		$this->_ville = $ville;
  	
  }
  
  public function setPhoto($photo)
  {
  	
  	// On vérifie qu'il s'agit bien d'une chaine.
  	// Dont la longueur est superieur à 0 caractères.
  	
  	
  		$this->_photo = $photo;
  	
  }
  
  public function setDate($today)
  {
  	$this->_date = $today;
  }

  
}  
		
?>
EleveManager.class.php
<?php

class EleveManager
{
	private $_db;

	
 public function __construct($db)
  {
    $this->setDb($db);
	
  }
	
	public function add(Eleve $eleve)
	{
		
		$q = $this->_db->prepare('INSERT INTO eleve (prenom,nom,age,telephone,naissance,email,adresse,codepostal,ville,photo) VALUES (:prenom,:nom,:age,:telephone,:naissance,:email,:adresse,:codepostal,:ville,:photo)');

	
 		$q->bindValue(':prenom', $eleve->prenom()); 
 		$q->bindValue(':nom', $eleve->nom());
 		$q->bindValue(':age', $eleve->age(), PDO::PARAM_INT);
 		$q->bindValue(':telephone', $eleve->telephone());
 		$q->bindValue(':naissance', $eleve->naissance());
 		$q->bindValue(':email', $eleve->email() );
 		$q->bindValue(':adresse', $eleve->adresse() );
 		$q->bindValue(':codepostal', $eleve->codepostal(), PDO::PARAM_INT);
 		$q->bindValue(':ville', $eleve->ville() ); 	
 		$q->bindValue(':photo', $eleve->photo());

		
 			
		$q->execute();
		$result=$q->execute();
		if ($result === false) {
			var_dump($result);
			//echo $this->_db->errorCode();
			echo $q->errorCode();
			var_dump($q->errorInfo());
		}
		
	}
		
	
	public function delete($tel)
	{
		$this->_db->exec('DELETE FROM eleves WHERE telephone = ' .$tel);
		
		return 'l\'eleve a ete supprimer avec succes';
	}
	
	public function getList()
	{
		$eleve = array();
	
		$q = $this->_db->prepare('SELECT id, prenom, nom, age, telephone, naissance, email, adresse, codepostal, ville, photo FROM eleve ORDER BY nom');
		$q->execute();
		$result=$q->execute();
		if ($result === false) {
			var_dump($result);
			echo $this->_db->errorCode();
			//echo $q->errorCode();
			var_dump($q->errorInfo());
		}
		while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
		{
			
			$eleve[] = new Eleve($donnees);
			
		}
	
		return $eleve;
	}
	
	public function getEleve($tel)
	{
		
		$eleve = array();
	
		$q = $this->_db->prepare('SELECT prenom, nom, age, telephone, naissance, email, adresse, codepostal, ville, photo, date FROM eleve WHERE telephone = '.$tel);
		$q->execute();
		$result=$q->execute();
		if ($result === false) {
			var_dump($result);
			echo $this->_db->errorCode();
			//echo $q->errorCode();
			var_dump($q->errorInfo());
		}
		while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
		{
			
			$eleve[] = new Eleve($donnees);
			
		var_dump($eleve);
		}
	
		return $eleve;
	}
	
	public function update(Eleve $eleve)
	{
		$q = $this->_db->prepare('UPDATE eleve SET prenom = :prenom, nom = :nom, age = :age, telephone = :telephone, naissance = :naissance, email = :email, adresse = :adresse, codepostal = :codepostal, ville = :ville, photo = :photo WHERE telephone = :telephone');
	
		$q->bindValue(':prenom', $eleve->prenom());
		$q->bindValue(':nom', $eleve->nom());
		$q->bindValue(':age', $eleve->age(), PDO::PARAM_INT);
		$q->bindValue(':telephone', $eleve->telephone());
		$q->bindValue(':naissance', $eleve->naissance(), PDO::PARAM_INT);
		$q->bindValue(':email', $eleve->email());
		$q->bindValue(':adresse', $eleve->adresse());
		$q->bindValue(':adresse2', $eleve->adresse2());
		$q->bindValue(':codepostal', $eleve->codepostal(), PDO::PARAM_INT);
		$q->bindValue(':ville', $eleve->ville());
		$q->bindValue(':photo', $eleve->photo());
	
		$q->execute();
		$result=$q->execute();
		if ($result === false) {
			var_dump($result);
			echo $this->_db->errorCode();
			//echo $q->errorCode();
			var_dump($q->errorInfo());
		}
	}
	
  public function setDb($db)
  {
    $this->_db = $db;
  }
}



?>
Compte.class.php
<?php
class Compte extends Eleve
{
	protected  $_soldes;
	protected  $_prix;
	private	   $_telephone;
	
	
	
	
	public function __construct(array $donnees)
	{
	
		foreach ($donnees as $key => $value)
		{
			// On récupère le nom du setter correspondant à l'attribut.
			$method = 'set'.ucfirst($key);
			 
			// Si le setter correspondant existe.
			if (method_exists($this, $method))
			{
				 
				// On appelle le setter.
				$this->$method($value);
			}
		}
	}

	public function soldes() {  return $this->_soldes; }
	public function prix() {  return $this->_prix; }
	public function compteTelephone() { return $this->_telephone; }
	
	public function setSoldes($inscription)
	{
		
		$this->_soldes = $inscription ;
		
	}
	
	public function setPrix($heures, $indice)
	{
		switch ($indice) 
		{
			case 1:
				$this->_prix = $this->_soldes + $heures*45;
				break;
			case 2:
				$this->_prix = $this->_soldes + 90  ;
				break;
			case 3:
				$this->_prix = $this->_soldes + 70  ;
				break;
		}	
	}
	
	public function setcompteTelephone($telephone)
	{
		$this->_telephone = $telephone;
	}

	

	
}
?>
CompteEleveManager.php
<?php
class CompteEleveManager
{
	private $_db;
	
	public function __construct($db)
	{
		$this->setDb($db);
	}
	
		public function add(Compte $compte)
	{
		$q = $this->_db->prepare('INSERT INTO Compte (telephone,soldes,date) VALUES (:telephone,:soldes,:date)');
		
	
		$q->bindValue(':soldes', $compte->soldes(), PDO::PARAM_INT);
		$q->bindValue(':telephone', $compte->telephone());
		$q->bindValue(':date', $compte->date());

		$q->execute();
		$result=$q->execute();
	if ($result === false)
	{
		var_dump($result);
		echo $this->_db->errorCode();
		echo $q->errorCode();
		var_dump($q->errorInfo());
	}
		return 'paiement effectuer le '.$compte->date();
	}
	public function update(Compte $eleve)
	{
		$q = $this->_db->prepare('UPDATE compte SET soldes = :soldes, date = :date WHERE telephone = :telephone');
		
		$q->bindValue(':soldes', $eleve->prix(), PDO::PARAM_INT);
		$q->bindValue(':telephone', $eleve->telephone());
		$q->bindValue(':date', $eleve->date());
		
		$q->execute();
		$result=$q->execute();
		if ($result === false)
	{
			var_dump($result);
			echo $this->_db->errorCode();
			echo $q->errorCode();
			var_dump($q->errorInfo());
	}
		return 'paiement effectuer le '.$compte->date();
	}
	public function setDb($db)
	{
		$this->_db = $db;
	}
}

?>


Ce petit projet va servir pour mon auto-ecole où je travaille en ce moment et je fait ce projet durant mon temps et entre deux lecon de conduite, et je ne sais pas si ca peut vous servir mais il ne sera executer qu'en local.

Merci par avance
Modifié en dernier par hugtere le 21 mars 2013, 03:00, modifié 1 fois.

Mammouth du PHP | 571 Messages

21 mars 2013, 01:16

salut,

dans toutes tes méthodes (en particulier add ) tu fais appel à la fonction " execute()" 2 fois ce qui se traduit par une double exécution de la requête.
Par exemple dans la méthode add de la classe EleveManager, tu appelles 2 fois execute() alors que tu ne devrais l'appeler une et une seule fois pour pouvoir lancer la requête d'insertion:
    //ici tu lances execute() 2 fois
        public function add(Eleve $eleve)
        {
          
          //..........      
                $q->execute(); //1 fois
                $result=$q->execute(); //2 ème fois
            //.....
      }

Tu peux faire appelle à la fonction execute() de la manière suivante:
        public function add(Eleve $eleve)
        {
          
              if( $q->execute() === FALSE ){
                       //.....
             }
          
      }


Petit nouveau ! | 5 Messages

21 mars 2013, 02:00

je teste ca tout de suite et je te tiens au courant.

Re : ben je viens de tester e ca ne regle pas le soucis
Upload effectué avec succès !

boolean false

0000023000

array (size=3)
  0 => string '23000' (length=5)
  1 => int 1062
  2 => string 'Duplicate entry '222222222266' for key 'telephone'' (length=50)
je viens de tester en elevant le bout de code et l'erreur et toujours presente
voila ce que ca me marque et voila ce que j'ai mis
		$q->execute();
		if( $q->execute() === FALSE ){
			
		
		
			var_dump($result);
			//echo $this->_db->errorCode();
			echo $q->errorCode();
			var_dump($q->errorInfo());
		}
Est ce encore une erreur de ma part ou non ?

je viens de tester en enlevant le bout de code que tu ma donnée et ca ne marche pas non plus

Eléphant du PHP | 50 Messages

21 mars 2013, 10:33

Bonjour,

Tu refais la même erreur, tu exécute 2 fois ta requête:
                $q->execute(); //1er fois 
                if( $q->execute() === FALSE ){ //2ième fois
                        
                
                
                        var_dump($result);
                        //echo $this->_db->errorCode();
                        echo $q->errorCode();
                        var_dump($q->errorInfo());
                }
Tu peux donc supprimer le premier execute.

Petit nouveau ! | 5 Messages

21 mars 2013, 11:16

Bonjour et merci de votre patience:

Je Reviens pour vous dire que j'ai essayer de l'enlever il me fait un doublon quand même donc est ce que ca viens vraiment de la ou pas.

Je pensais n'est ce pas une erreur de configuration de mysql qui peut faire cet erreur ?

Mammouth du PHP | 571 Messages

21 mars 2013, 12:18

il n y a aucune raison que ta requête insère 2 fois.voilà comment s'y prendre:
<?php

class EleveManager
{
        private $_db;

       
 public function __construct($db)
  {
    $this->setDb($db);
       
  }
       
        public function add(Eleve $eleve)
        {
               
                $q = $this->_db->prepare('INSERT INTO eleve (prenom,nom,age,telephone,naissance,email,adresse,codepostal,ville,photo) VALUES (:prenom,:nom,:age,:telephone,:naissance,:email,:adresse,:codepostal,:ville,:photo)');

       
                $q->bindValue(':prenom', $eleve->prenom());
                $q->bindValue(':nom', $eleve->nom());
                $q->bindValue(':age', $eleve->age(), PDO::PARAM_INT);
                $q->bindValue(':telephone', $eleve->telephone());
                $q->bindValue(':naissance', $eleve->naissance());
                $q->bindValue(':email', $eleve->email() );
                $q->bindValue(':adresse', $eleve->adresse() );
                $q->bindValue(':codepostal', $eleve->codepostal(), PDO::PARAM_INT);
                $q->bindValue(':ville', $eleve->ville() );      
                $q->bindValue(':photo', $eleve->photo());

               
            //!!!!!!           
                //$q->execute();
                $result=$q->execute();
                if ($result === false) {
                        var_dump($result);
                        //echo $this->_db->errorCode();
                        echo $q->errorCode();
                        var_dump($q->errorInfo());
                }
               
        }
               
       
        public function delete($tel)
        {
                $this->_db->exec('DELETE FROM eleves WHERE telephone = ' .$tel);
               
                return 'l\'eleve a ete supprimer avec succes';
        }
       
        public function getList()
        {
                $eleve = array();
       
                $q = $this->_db->prepare('SELECT id, prenom, nom, age, telephone, naissance, email, adresse, codepostal, ville, photo FROM eleve ORDER BY nom');
               //!!!!!!!!!!!!!!!!!!!!!!
             //   $q->execute();
                $result=$q->execute();
                if ($result === false) {
                        var_dump($result);
                        echo $this->_db->errorCode();
                        //echo $q->errorCode();
                        var_dump($q->errorInfo());
                }
                while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
                {
                       
                        $eleve[] = new Eleve($donnees);
                       
                }
       
                return $eleve;
        }
       
        public function getEleve($tel)
        {
               
                $eleve = array();
       
                $q = $this->_db->prepare('SELECT prenom, nom, age, telephone, naissance, email, adresse, codepostal, ville, photo, date FROM eleve WHERE telephone = '.$tel);
            //    $q->execute();
                $result=$q->execute();
                if ($result === false) {
                        var_dump($result);
                        echo $this->_db->errorCode();
                        //echo $q->errorCode();
                        var_dump($q->errorInfo());
                }
                while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
                {
                       
                        $eleve[] = new Eleve($donnees);
                       
                var_dump($eleve);
                }
       
                return $eleve;
        }
       
        public function update(Eleve $eleve)
        {
                $q = $this->_db->prepare('UPDATE eleve SET prenom = :prenom, nom = :nom, age = :age, telephone = :telephone, naissance = :naissance, email = :email, adresse = :adresse, codepostal = :codepostal, ville = :ville, photo = :photo WHERE telephone = :telephone');
       
                $q->bindValue(':prenom', $eleve->prenom());
                $q->bindValue(':nom', $eleve->nom());
                $q->bindValue(':age', $eleve->age(), PDO::PARAM_INT);
                $q->bindValue(':telephone', $eleve->telephone());
                $q->bindValue(':naissance', $eleve->naissance(), PDO::PARAM_INT);
                $q->bindValue(':email', $eleve->email());
                $q->bindValue(':adresse', $eleve->adresse());
                $q->bindValue(':adresse2', $eleve->adresse2());
                $q->bindValue(':codepostal', $eleve->codepostal(), PDO::PARAM_INT);
                $q->bindValue(':ville', $eleve->ville());
                $q->bindValue(':photo', $eleve->photo());
       
         //       $q->execute();
                $result=$q->execute();
                if ($result === false) {
                        var_dump($result);
                        echo $this->_db->errorCode();
                        //echo $q->errorCode();
                        var_dump($q->errorInfo());
                }
        }
       
  public function setDb($db)
  {
    $this->_db = $db;
  }
}

?>

Petit nouveau ! | 5 Messages

21 mars 2013, 12:37

bonjour et merci pour vos reponses.

malheureusement cela ne fonctione pas , je viens de copier coller votre code que j'ai ensuite executer mais cela m'affiche toujours la meme erreur et cree un doulon dans la bdd.


array (size=3)
0 => string '23000' (length=5)
1 => int 1062
2 => string 'Duplicate entry '12345678910' for key 'telephone'' (length=49)


Re: je reviens vers vous pour vous dire que le soucis n'est pas regler, le champs telephone ete reglé sur unique tout le long de ce poste , a la date de mon premier billet il me sauter une place de mon champs ID c'est a dire qu'au lieu d'avoir 1, 2, 3, 4... il le cree de deux en deux. Aujourd'hui je me suis dit que cela venait peut etre de WAMP 2 donc j'ai decider de refaire mon install de WAMP 2 et donc maintenant j'ai toujours l'erreur qui s'affiche mais cette fois le champs ID et Bien numeroter de 1 en 1, c'est a ne plus rien y comprendre. En esperant que cela puisse vous etre utile pour m'aider a resoudre mon erreur.

Mammouth du PHP | 571 Messages

21 mars 2013, 15:09

dans la méthode add de la classe CompteEleveManager tu appelles toujours 2 fois la fonction execute() ce qui envoie 2 fois la même requête.J'ai commenté execute() supplémentaire donc tu peux au moins arriver à insérer une seule ligne dans tes 2 tables:

<?php
class CompteEleveManager
{
        private $_db;
       
        public function __construct($db)
        {
                $this->setDb($db);
        }
       
                public function add(Compte $compte)
        {
                $q = $this->_db->prepare('INSERT INTO Compte (telephone,soldes,date) VALUES (:telephone,:soldes,:date)');
               
       
                $q->bindValue(':soldes', $compte->soldes(), PDO::PARAM_INT);
                $q->bindValue(':telephone', $compte->telephone());
                $q->bindValue(':date', $compte->date());

          //!!!!!!!!!!  ici j'ai commenté execute() supplémentaire
          //      $q->execute();
                $result=$q->execute();
        if ($result === false)
        {
                var_dump($result);
                echo $this->_db->errorCode();
                echo $q->errorCode();
                var_dump($q->errorInfo());
        }
                return 'paiement effectuer le '.$compte->date();
        }
        public function update(Compte $eleve)
        {
                $q = $this->_db->prepare('UPDATE compte SET soldes = :soldes, date = :date WHERE telephone = :telephone');
               
                $q->bindValue(':soldes', $eleve->prix(), PDO::PARAM_INT);
                $q->bindValue(':telephone', $eleve->telephone());
                $q->bindValue(':date', $eleve->date());
               
                $q->execute();
                $result=$q->execute();
                if ($result === false)
        {
                        var_dump($result);
                        echo $this->_db->errorCode();
                        echo $q->errorCode();
                        var_dump($q->errorInfo());
        }
                return 'paiement effectuer le '.$compte->date();
        }
        public function setDb($db)
        {
                $this->_db = $db;
        }
}

?>

 
Partout où t'as 2 fois la fonction execute()(j'en vois dans d'autres de tes méthodes) il faut en virer un.

Petit nouveau ! | 5 Messages

21 mars 2013, 15:41

Bonjour desoler je devais mal faire la manip en effet le problème est résolu.

Merci grandement pour votre aide .