Condition ne fonctionne pas

Résolu
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -  
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je ne comprend pas pourquoi la condition if ne fonctionne pas, le reste fonctionne très bien.

<?php

$courriel = "contact@domaine.tld";

try
{
$bdd = new PDO('mysql:dbname=postfix;host=localhost;charset=utf8', 'root', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}

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

$reponse = $bdd->query('SELECT username FROM mailbox');

while ($donnees = $reponse->fetch())
{

echo $donnees['username'] . '<br />';

if ($courriel == $donnees)
{
echo 'adresse trouvée !!! <br />';
break;
}

}

$reponse->closeCursor();

?>


Merci d'avance pour votre aide.

3 réponses

Résumé de la discussion

Le problème concerne la vérification côté serveur de l'existence d'un courriel dans une base MySQL avant la création d'un compte, afin d'éviter les doublons et d'assurer la disponibilité de l'adresse. Le code PHP utilise PDO pour interroger la table mailbox et récupérer les usernames, mais la comparaison tente d'associer le courriel à un tableau au lieu du champ, ce qui échoue. Des réponses suggèrent soit d'utiliser une requête de type COUNT(*) et de tester le nombre retourné, soit de vérifier l'existence en parcourant les résultats et en comparant le champ username. Des conseils préconisent l'emploi de requêtes préparées avec liaison de paramètres et une syntaxe correcte de la condition if pour éviter les erreurs.

Bobot (l'IA à votre service)
  1. NHenry Messages postés 2514 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    1) Pour filtrer une requête, regarde la clause SQL "WHERE "
    2)
    $courriel = "contact@domaine.tld";
    echo $donnees['username'] 
    if ($courriel == $donnees)

    Comment veux-tu qu'un tableau soit égal à une chaine de caractères ?
    J'interviens principalement en VB6 et VB.NET, avec un peu de C#, mais la modération m'amène souvent sur d'autre langages.
    En VB.NET pensez à activer "Option Explicit" et "Option Strict"
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929
       
      Merci pour ton aide.

      J'essaie de créer un formulaire qui permettra à quiconque de créer un compte sur mon serveur de messagerie, j'ai une première page avec le formulaire qui envoie l'adresse courriel désirée à cette page. Cette page vérifie dans la base de données Postfix que le courriel ne soit pas déjà utilisé.
      0
    2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Je ne trouve pas quelle condition appliquer pour vérifier si le courriel existe déjà dans la base de données.
      0
    3. NHenry Messages postés 2514 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      ... WHERE AdresseEmail="'.$courriel.'"'
      Après utiliser une requête paramétrée t'évitera d'avoir un risque d'injection SQL.
      0
    4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929
       
      C'est le traitement de la requête qui me pose problème, plutôt que la requête elle-même.
      0
    5. NHenry Messages postés 2514 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      As-tu essayé ma suggestion ?
      Comment l'as-tu implémenté ?
      As-tu une erreur ?
      As-tu essayé la requête dans PHPMyAdmin ?
      0
  2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929
     
    Comment faire pour comparer deux chaînes de caractères ?

    J'ai essayé avec strcmp ou avec in_array mais ça ne fonctionne pas.

    <?php
    
    $courriel = $_POST['courriel'];
    
    try
    {
    $bdd = new PDO('mysql:dbname=postfix;host=localhost;charset=utf8', 'root', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    
    catch(Exception $e)
    {
          die('Connection failed : '.$e->getMessage());
    }
    
    $reponse = $bdd->query('SELECT username FROM mailbox');
    
    while ($donnees = $reponse->fetch())
    {
    if (strcmp($courriel, $donnees) == 0);
    {
    echo 'adresse indisponible !!! <br />';
    break;
    }
    
    }
    $reponse->closeCursor();
    
    ?>
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Et ainsi?
      <?php
      $courriel = $_POST['courriel'];
      try
      {
      $bdd = new PDO('mysql:dbname=postfix;host=localhost;charset=utf8', 'root', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
      }
      catch(Exception $e)
      {
            die('Connection failed : '.$e->getMessage());
      }
      $reponse = $bdd->query("SELECT count(*) as nb FROM mailbox WHERE username = '$courriel'");
      echo $reponse;
      $donnees = $reponse->fetch());
      $nb= $donnees['nb'];
      echo $nb;
      if $nb > 0 {
      echo 'adresse indisponible !!! <br />';
      break;
      }
      $reponse->closeCursor();
      ?>
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Merci pour ta réponse, pas moyen de savoir si ça marche, rien ne s'affiche, même pas les variables.
        0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Et en ajoutant ceci avant le try?
      <?php
      $courriel = $_POST['courriel'];
      echo "<br>_post: ";
      var_dump ($_POST);
      try
      {
      $bdd = new PDO('mysql:dbname=postfix;host=localhost;charset=utf8', 'root', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
      }
      catch(Exception $e)
      {
            die('Connection failed : '.$e->getMessage());
      }
      $sql="SELECT count(*) as nb FROM mailbox WHERE username = '$courriel'";
      echo "<br>sql :".$sql;
      $reponse = $bdd->query($sql);
      $donnees = $reponse->fetch());
      $nb= $donnees['nb'];
      echo "<br>nb :"$nb;
      if $nb > 0 {
      echo 'adresse indisponible !!! <br />';
      break;
      }
      $reponse->closeCursor();
      ?>
      0
    3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929
       
      Ca ne change rien, j'ai une page blanche.
      0
  3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929
     
    Je récapitule, voilà ce qui marche pour l'instant :

    <?php
    
    $courriel = $_POST['courriel'];
    
    try
    {
    $bdd = new PDO('mysql:dbname=postfix;host=localhost;charset=utf8', 'root', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    
    catch(Exception $e)
    {
          die('Connection failed : '.$e->getMessage());
    }
    
    $reponse = $bdd->query('SELECT username FROM mailbox');
    
    while ($donnees = $reponse->fetch())
    {
    echo $donnees['username'] . '<br />';
    //echo 'adresse indisponible !!! <br />';
    //break;
    }
    $reponse->closeCursor();
    
    ?>


    Ce que je trouve étrange, c'est que je peux afficher les champs de la base mais je ne peux pas les comparer à une variable.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Et en ajoutant
      echo "<br>_post: ";
      var_dump ($_POST);
      ?
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Ca m'affiche ça :

        _post: array(1) { ["courriel"]=> string(7) "hvjjcvc" } admin@domaine.tld
        contact@domaine.tld
        gravedigger@domaine.tld
        mattermost@domaine.tld


        Un petit charabia avec ce que j'ai tapé dans le formulaire ("hvjjcvc"), suivi de mes 4 comptes de messagerie en gras
        0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Et ainsi?
      <?php
      $courriel = $_POST['courriel'];
      echo "<br>_post: ";
      var_dump ($_POST);
      try
      {
      $bdd = new PDO('mysql:dbname=postfix;host=localhost;charset=utf8', 'root', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
      }
      catch(Exception $e)
      {
            die('Connection failed : '.$e->getMessage());
      }
      $sql='SELECT count(*) as nb FROM mailbox WHERE username = "'.$courriel.'"';
      echo "<br>sql :".$sql;
      $reponse = $bdd->query($sql);
      $donnees = $reponse->fetch());
      $nb= $donnees['nb'];
      echo "<br>nb :"$nb;
      if $nb > 0 {
      echo 'adresse indisponible !!! <br />';
      break;
      }
      $reponse->closeCursor();
      ?>
      0
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Ou bien:
      <?php
      
      $courriel = $_POST['courriel'];
      
      try
      {
      $bdd = new PDO('mysql:dbname=postfix;host=localhost;charset=utf8', 'root', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
      }
      
      catch(Exception $e)
      {
            die('Connection failed : '.$e->getMessage());
      }
      
      $reponse = $bdd->query('SELECT username FROM mailbox');
      
      while ($donnees = $reponse->fetch())
      {
         echo $donnees['username'] . '<br />';
         if $donnees['username'] == $courriel
         {
            echo 'adresse indisponible !!! <br />';
            break;
         }
      }
      $reponse->closeCursor();
      
      ?>
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 929 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Celui-là fonctionne ! Mais j'ai dû rajouter des parenthèses au if.

        Ouf, je vais pouvoir passer à la suite.

        Un grand merci pour votre patience à tous les deux, à très vite je pense !
        0