Erreur en PHP : Ajout d'adresse

Résolu/Fermé
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013 - Modifié par Numbyscuit le 22/06/2012 à 14:40
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013 - 25 juin 2012 à 11:13
Bonjour,

Je cherche à ajouter une adresse à un client, selon les conditions suivantes :
1- Un client peut avoir plusieurs adresses
2- Plusieurs clients peuvent avoir la même adresse
3- Plusieurs clients peuvent partager le même nom ET prénom.
4- Or, un client ne peut avoir le même nom, prénom, et adresse.
5- Aussi, chaque pseudo (identifiant) est unique.

Mon problème est le suivant. J'ai fait une page contenant une fonction ajouter qui semble bonne, cependant, malgré mes instructions, elle ne remplit pas la condition n°3. Les noms et prénoms des deux clients auront beau êtres différents, si l'adresse se trouve déjà dans la table, elle ne sera pas ajoutée.

Voici d'abord le formulaire qui envoie les informations.
<form method="post" action="newadress.php"> 
        <fieldset class="inscr"> 
         <legend>Ajouter une adresse</legend> 
         <label>Adresse : </label> 
          <input type="text" name="adress" id="adress" class="champ" required /> <br /><br /> 
           
          <label>Code postal : </label> 
          <input type="text" name="CP" id="CP" class="champ" required  /> <br /><br /> 
           
          <label>Ville : </label> 
          <input type="text" name="ville" id="ville" class="champ" required /> <br /><br /> 
           
          <label>Pays : </label> 
          <input type="text" name="pays" id="pays" class="champ" required  />  

       </fieldset> 
       <br /> 
       <div class="inscr"> 
          <input type="reset" value="Réinitialiser" /> 
          <input type="submit" value="Ajouter" />  
            
        </div> 
       </form> 


Voici maintenant le code complet de la page "newadress.php" :

/*Connexion à BDD */ 
        try 
       { 
        // On se connecte à MySQL 
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;  
        $bdd = new PDO('mysql:host=localhost;dbname=bdd_exiastore', 'root', '', $pdo_options); 
        $bdd->exec('SET NAMES utf8'); 
         
       } 
       catch(Exception $e) 
       { 
        // En cas d'erreur, on affiche un message et on arrête tout 
         die('Erreur : '.$e->getMessage()); 
       } 
        
       $log = $_SESSION['pseudo']; 
       $sql = "SELECT * FROM clients WHERE clients.PseudoClient ='".$log."' ";    
       $req = $bdd->query($sql);    
       $req->setFetchMode(PDO::FETCH_OBJ);  
        
       // Nom 
       $name = $_SESSION['nom'];   
       $sqlTrois = "SELECT * FROM clients WHERE clients.NomClient ='".$name."' ";  
       $reqTrois = $bdd->query($sqlTrois);    
       $reqTrois->setFetchMode(PDO::FETCH_OBJ); 
        
       // Prénom 
       $prename = $_SESSION['prenom'];        
       $sqlQuatre = "SELECT * FROM clients WHERE clients.PrenomClient ='".$prename."'  ";  
       $reqQuatre = $bdd->query($sqlQuatre);    
       $reqQuatre->setFetchMode(PDO::FETCH_OBJ); 
        
    
       // Rue 
       $addr = $_POST['adress'];  
        
       $sqlCinq = "SELECT * FROM adresses WHERE adresses.RueAdresse ='".$addr."' ";  
       $reqCinq = $bdd->query($sqlCinq);    
       $reqCinq->setFetchMode(PDO::FETCH_OBJ); 
        
       // CP 
       $postal = $_POST['CP'];   
        
       $sqlSix = "SELECT * FROM adresses WHERE adresses.CPAdresse ='".$postal."' ";  
       $reqSix = $bdd->query($sqlSix);    
       $reqSix->setFetchMode(PDO::FETCH_OBJ); 
        
       // Ville 
       $town = $_POST['ville']; 
               
       $sqlSept = "SELECT * FROM adresses WHERE adresses.VilleAdresse ='".$town."'   ";  
       $reqSept = $bdd->query($sqlSept);    
       $reqSept->setFetchMode(PDO::FETCH_OBJ); 
        
       // Pays 
       $country = $_POST['pays'];  
                
       $sqlHuit = "SELECT * FROM adresses WHERE adresses.PaysAdresse ='".$country."' ";  
       $reqHuit = $bdd->query($sqlHuit);    
       $reqHuit->setFetchMode(PDO::FETCH_OBJ); 
        
      if(empty($_POST['adress']) OR empty($_POST['ville']) OR empty($_POST['pays']) OR empty($_POST['CP']) ) 
      { 
       echo "Vous n'avez pas renseigné tous les champs."; 
       header("Refresh: 3; URL= zone.php" ) ; 
      } 
   // Si tout n'a pas été mis dans le même "else if", c'est parce que des problèmes ont été rencontrés.    
      else if(strlen($_POST['adress']) < 10  OR strlen($_POST['adress']) > 50) 
      { 
      echo 'Adresse invalide - Rue.'; 
       
      header("Refresh: 3; URL= zone.php" ) ; 
      } 
       
      else if (strlen($_POST['pays']) < 3 OR strlen($_POST['pays']) > 15) 
      { 
      echo 'Adresse invalide - Pays.'; 
       
      header("Refresh: 3; URL= zone.php" ) ; 
      } 
       
      else if (strlen($_POST['CP']) != 5) 
      { 
      echo "Adresse invalide - Code postal.";  
       
      header("Refresh: 3; URL= zone.php" ) ; 
      } 
       
      else if(strlen($_POST['ville']) < 3 OR $_POST['ville'] > 20 ) 
      { 
      echo "Adresse invalide - Ville.";  
       
      header("Refresh: 3; URL= zone.php" ) ; 
      } 
    
       else if(($ligneTrois = $reqTrois->fetch() AND $ligneQuatre = $reqQuatre->fetch() AND $ligneCinq = $reqCinq->fetch() AND $ligneSix = $reqSix->fetch() AND $ligneSept = $reqSept->fetch() AND $ligneHuit = $reqHuit->fetch() ) OR ($ligne = $req->fetch()  AND $ligneCinq = $reqCinq->fetch() AND $ligneSix = $reqSix->fetch() AND $ligneSept = $reqSept->fetch() AND $ligneHuit = $reqHuit->fetch()) ) 
       { 
      echo "Erreur. <br />- Soit un autre compte possède déjà les mêmes nom, prénom, et adresse. <br />- Soit vous avez déjà entré une telle adresse."; 
       
      header("Refresh: 3; URL= zone.php" ) ; 
       } 
      
      else 
      { 
      $add = $_POST['adress']; 
      $ville = $_POST['ville']; 
      $cp = $_POST['CP']; 
      $pays = $_POST['pays']; 
       

      $reqAdd = $bdd->prepare("INSERT INTO adresses (RueAdresse, CPAdresse, VilleAdresse, PaysAdresse) VALUES(:add, :cp, :ville, :pays) "); 
      $reqAdd->execute(array( 
      'add'=>$add, 
      'cp'=>$cp, 
      'ville'=>$ville, 
      'pays'=>$pays   
      )); 
       
      $sqlId = $bdd->prepare(" 
      SELECT ID_Client FROM clients 
      WHERE PseudoClient = :log 
      "); 
      $sqlId->execute(array( 
      'log' => $log 
      )); 
      $donneesId = $sqlId->fetch(); 
      $idCli = $donneesId['ID_Client']; 
       
      $sqlAdd = $bdd->prepare("SELECT adresses.ID_Adresse FROM adresses 
      WHERE  adresses.RueAdresse = :add AND  adresses.CPAdresse = :cp AND  adresses.VilleAdresse = :ville AND  adresses.PaysAdresse = :pays 
      "); 
      $sqlAdd->execute(array( 
      'add'=>$add, 
      'cp'=>$cp, 
      'ville'=>$ville, 
      'pays'=>$pays  
      )); 
      $donneesAdd = $sqlAdd->fetch(); 
      $idAdd = $donneesAdd['ID_Adresse']; 
       
      $reqId = $bdd->prepare("INSERT INTO avoir (avoir.ID_Client, avoir.ID_Adresse) VALUES(:idCli, :idAdd) "); 
      $reqId->execute(array( 
      'idCli'=>$idCli, 
      'idAdd'=>$idAdd   
      ));       
       
      echo "Adresse ajoutée"; 
      $sqlAdd->closeCursor(); 
      $reqAdd->closeCursor(); 
      $reqId->closeCursor(); 
      header("Refresh: 3; URL= zone.php" ) ; 
      }       
       
      ?> 

Je reçois toujours le message d'erreur "Erreur dans l'adresse" quand mes informations relatives à l'adresse sont identiques. J'ai eu beau essayé de trifouiller encore et encore, rien n'y fait.

Je vous remercie d'avance pour votre aide, en m'excusant de beaucoup en demander, ces derniers jours ^^

7 réponses

Kafiristanica Messages postés 263 Date d'inscription mardi 12 juin 2012 Statut Membre Dernière intervention 27 août 2012 28
22 juin 2012 à 14:46
l'adresse ne serait pas une clef primaire ?
0
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013
22 juin 2012 à 14:50
L'ID_Adresse est la clef primaire. Et sinon, la requête INSERT INTO fonctionne pour la table "avoir" comme pour la table "adresses". Mais le hic, c'est quand le code semble pas comprendre que les noms et prénoms doivent déjà exister aussi pour que ça bloque.
0
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013
25 juin 2012 à 08:54
UP, si toutefois cela est permis.
0
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013
Modifié par Numbyscuit le 25/06/2012 à 11:10
J'ai changé la structure de la requête, et ça semble fonctionner :
$name = $_SESSION['nom'];   
$prename = $_SESSION['prenom'];   
$addr = $_POST['adress'];   
$postal = $_POST['CP'];   
$town = $_POST['ville'];   
$country = $_POST['pays']; 

       $check = $bdd->prepare( 
       "SELECT * FROM adresses 
       INNER JOIN avoir 
       ON avoir.ID_Adresse = adresses.ID_Adresse 
       INNER JOIN clients 
       ON clients.ID_Client = avoir.ID_Client 
       WHERE clients.NomClient = :name AND clients.PrenomClient = :prename AND adresses.RueAdresse = :addr AND adresses.CPAdresse = :postal AND adresses.VilleAdresse = :town AND adresses.PaysAdresse = :country 
       "); 

       $check->execute(array( 
       'name'=>$name, 
       'prename'=>$prename, 
       'addr'=>$addr, 
       'postal'=>$postal, 
       'town'=>$town, 
       'country'=>$country 
       )); 

       $check->setFetchMode(PDO::FETCH_OBJ);

Ce qui est étrange, c'est que la précédente structure fonctionnait sans problème pour vérifier l'inscription, mais pas pour l'ajout d'adresse.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
25 juin 2012 à 11:10
Bonjour

Oui, un up est tout à fait permis, dans la mesure où tu n'en abuses pas. Et après 3 jours, on ne peut pas te reprocher d'en abuser.
Je reçois toujours le message d'erreur "Erreur dans l'adresse" Sauf erreur de ma part, ce message n'existe pas dans ton script. Quel message d'erreur as-tu vraiment ?
else if(($ligneTrois = $reqTrois->fetch() AND $ligneQuatre = $reqQuatre->fetch() AND $ligneCinq = $reqCinq->fetch() AND $ligneSix = $reqSix->fetch() AND $ligneSept = $reqSept->fetch() AND $ligneHuit = $reqHuit->fetch() ) OR ($ligne = $req->fetch() AND $ligneCinq = $reqCinq->fetch() AND $ligneSix = $reqSix->fetch() AND $ligneSept = $reqSept->fetch() AND $ligneHuit = $reqHuit->fetch()) )

Ton problème s'explique très bien par cette condition.
Si les noms sont différents, tu sautes au OR. Là, tu ne compares les adresses, elles sont égales, donc le if est globalement vrai.

D'autre part, te rends-tu compte que dans l'évaluation de cette condition, tu peux être amené à faire deux fois $reqCinq->fetch(), ... et que cela va donc essayer de lire deux lignes du résultat de la requête... Tu peux donc avoir 'vrai' la 1ère fois et 'faux' la seconde, je doute que ce soit l'effet recherché.
0
Utilisateur anonyme
25 juin 2012 à 11:11
Tiens, j'arrive un peu tard...
0
Numbyscuit Messages postés 18 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 23 janvier 2013
25 juin 2012 à 11:13
A une minute près ^^
Mais merci quand même pour tes éclaircissement =)
0