Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Tester que les champs du formulaire sont vides


Sujet :

Langage PHP

  1. #1
    Membre expert
    Bonsoir,

    j'ai des soucis pour faire ce test. Voici mon code :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	$sql = 'SELECT question_name
    FROM `questions` t1
    JOIN `consultation_type_question` t2 ON t2.id_question=t1.id_question
    JOIN `consultation_type` t3 ON  t2.id_consultation_type=t3.id_consultation_type
    WHERE t3.titre_consultation_type="médecin"';
     
    $prep = $connexion->prepare($sql);
    $prep->execute();
     
    $sortie=0;
    while($question_name = $prep->fetch()) 
    {
    	//echo "name:".$question_name."<br/>";
    	//echo "POST:".$_POST[$question_name]."<br/>";
    		if (empty($_POST[$question_name])) {$sortie=1; continue;}
    		}
    La requête SQL est correcte (testée avec phpMYAdmin) ; en principe les champs sont non vides, mais ça me dit que si (et si je décommente les lignes 13 et 14, lignes blanches)

    J'ai un peu modifié le code :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    	$sql = 'SELECT question_name FROM `questions` t1
    JOIN `consultation_type_question` t2 ON t2.id_question=t1.id_question
    JOIN `consultation_type` t3 ON  t2.id_consultation_type=t3.id_consultation_type
    WHERE t3.titre_consultation_type="médecin"';
     
    $prep = $connexion->prepare($sql);
    $prep->execute();
     
    var_dump($prep->fetch());
     
    $sortie=0;
    while($question_name = $prep->fetch()) 
    {
    	echo "name:".$question_name."<br/>";
    	echo "POST:".$_POST[$question_name]."<br/>";
    	if (empty($_POST[$question_name])) {$sortie=1; continue;}
    }
     
    if (!$sortie)
    {
    echo "non vide<br/>";
    }
    else echo "un des champs est vide !";
    Il n'y a plus de page blanche, mais les echo des lignes 14 et 15 ne sont pas affichés, donc on ne passe pas dans la boucle alors que le var_dump juste avant montre qu'on devrait (PDO doit retourner un objet et celui-ci est non vide), et ça affiche "non vide"; j'y comprends rien...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Modérateur

    Enlève ton var_dump() il lit le premier résultat de la requête.

    Qu'est ce que tu essaies de faire avec ton "continue" ? Ce n'est pas plutôt "break" que tu veux ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre expert
    OK, ça n'aidait pas, mais pas encore bon :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    	$sql = 'SELECT question_name FROM `questions` t1
    JOIN `consultation_type_question` t2 ON t2.id_question=t1.id_question
    JOIN `consultation_type` t3 ON  t2.id_consultation_type=t3.id_consultation_type
    WHERE t3.titre_consultation_type="médecin"';
     
    $sortie=0;
    $prep = $connexion->prepare($sql);
    $prep->execute();
     
    //var_dump($prep->fetch());
    $sortie=0;
    while($question_name = $prep->fetch()) 
    {
    	echo "<br/> BOUCLE";
    	echo "name:".$question_name."<br/>";
    	echo "POST:".$_POST[$question_name]."<br/>";
    	if (empty($_POST[$question_name])) {$sortie=1; continue;}
    }
     
    if (!$sortie)
    {
    echo "non vide<br/>";
    }
    else echo "un des champs est vide !"; 
    echo "sortie=".$sortie;
    car on passe bien dans la boucle (ligne 14), mais les 2 echo des lignes 15 et 16 ne sont pas affichés ; même pas :
    name: et rien après
    et pas d'echo de la ligne 25...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  4. #4
    Membre éprouvé

    car on passe bien dans la boucle (ligne 14), mais les 2 echo des lignes 15 et 16 ne sont pas affichés ; même pas :
    $question_name est un tableau il est donc impossible de l'afficher comme tel. Si tu avais activé l'affichage des erreurs tu devrais obtenir une erreur de type Notice: Array to string conversion


    Que veux-tu faire exactement?

  5. #5
    Membre expert
    Ceci est dans l'action d'un formulaire et les "names" sont dans une bdd, d'où j'utilise PDO pour les récupérer. Et je veux tester si l'un des champs du formulaire est vide...

    Si tu as besoin de plus de précision, dis-le...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  6. #6
    Modératrice

    Etant donné que ta requête ne retourne qu'une seule colonne et que tu ne veux que cette colonne dans ta boucle, essaye fetchColumn à la place de fetch, ça devrait mieux fonctionner
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    while($question_name = $prep->fetchColumn())
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre expert
    Je viens seulement d'essayer (car même si ça ne plait pas à Jreaux62, j'ai tellement de choses à faire que je manque un peu de temps... ) ; comme ça, ça marche bien mais ceci est un cas particulier et j'aurai d'autres pages où je regarderai plusieurs colonnes ; la solution sera-t-elle alors de faire plusieurs fetchColumn() ?
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = 'SELECT col1,col2 FROM `questions`...;
     
    $sortie=0;
    $prep = $connexion->prepare($sql);
    $prep->execute();
     
    $res1=$prep->fetchColumn(0);
    $res2=$prep->fetchColumn(1);
    etc.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  8. #8
    Modératrice

    Non, chaque fetch fait avancer la liste des résultats.
    Donc si tu as un résultat du genre :
    Col1 | Col2 
    -----|-----
      1  |  A
      2  |  B  
    et que tu fais
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    $res1=$prep->fetchColumn(0);
    $res2=$prep->fetchColumn(1);

    Tu vas obtenir
    res1 = 1
    res2 = B
    Ce qui n'est pas franchement le but de l'opération

    Si tu veux plusieurs colonnes d'une même ligne de résultat, il va falloir passer par fetch qui va te renvoyer un tableau (par défaut)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $res = $pre->fetch();
    $res1 = $res[0];
    $res2 = $res[1];

    te donnerait
    res1 = 1
    res2 = A
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre expert
    Entendu, comme je ne suis dans le cas par défaut, vu que à la connexion, je demande que le fetch me retourne un objet, j'ai modifié le code comme suit :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $result = $prep->fetch();
    print("question_name=$result->question_name\n");
    echo "POST=".$_POST[$result->question_name]."<br/>";
    (sachant que la requête me retourne un "name" de formulaire), et ça a l'air de marcher...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell