Erreur en PHP : Ajout d'adresse

[Résolu/Fermé]
Signaler
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013
-
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013
-
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

Messages postés
263
Date d'inscription
mardi 12 juin 2012
Statut
Membre
Dernière intervention
27 août 2012
29
l'adresse ne serait pas une clef primaire ?
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

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.
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

UP, si toutefois cela est permis.
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

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.

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é.

Tiens, j'arrive un peu tard...
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

A une minute près ^^
Mais merci quand même pour tes éclaircissement =)