IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

un "empty" pour générer une 404.


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut un "empty" pour générer une 404.
    Bonjour à tous,

    Si je viens vous voir, c'est après avoir lu la documentation PHP (sûrement mal du coup :/ ), donc en dernier recours.

    Voilà, j'ai donc une url contenant une variable (mapage.com?jeuxsport=2).
    Voici le code que j'utilise actuellement (j'ai élagué bien sûr en laissant l'essentiel) et qui fonctionne parfaitement pour générer le contenu de la page correspondant au jeu de sport ayant pour id le "2" :

    Code : 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
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    <?php
    try
    {
     
    	$bdd = new PDO('mysql:host=mysql;dbname=jeu', 'jeu', 'jeu');
    }
    catch(Exception $e)
    {
     
            die('Erreur : '.$e->getMessage());
    }
     
     
    $answer= $bdd->query('SELECT * FROM jeu where id="'.$_GET['id'].'" ');
     
     
    while ($contenu= $answer->fetch())
    {
    ?>
     
                                    <h1 class="vue-produit"><?php echo $contenu['nom']; ?></h1>
     
     
    <?php
    }
     
     
     
    $reponse->closeCursor(); // Termine le traitement de la requête
     
    ?>
    Ce code me permet donc de générer mon h1.

    En plaçant ce même bout de code dans <head>, maintenant, j'aimerai faire deux choses :
    1) Ajouter un "empty" à mon code pour contrôler le contenu de $answer et, si la requête ne répond à rien ...
    2) si la requête ne répond à rien, générer une erreur 404 (une vraie, réponse http du serveur).


    J'ai donc utilisé la fonction empty pour vérifier $answer :
    - Si la requête renvoie quelque chose, alors je ne fais rien.
    - Si la requête ne renvoie rien, alors je génère dans <head> le code pour générer une page 404.

    Pour ces deux opérations, j'ai donc fait cela que j'ai placé avant mon doctype (la documentation disant "N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP.") :

    Code : 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
    26
    27
    28
    29
    30
    31
    32
    
    <?php
    try
    {
    	
    	$bdd = new PDO('mysql:host=mysql;dbname=jeu', 'jeu', 'jeu');
    }
    catch(Exception $e)
    {
    	
            die('Erreur : '.$e->getMessage());
    }
    
    
    $answer= $bdd->query('SELECT * FROM jeu where id="'.$_GET['id'].'" ');
    
    if (empty($answer))
    {
    
    }
    else
    {
    header("HTTP/1.0 404 Not Found");
    }
    
    
    	
    	
    $reponse->closeCursor(); // Termine le traitement de la requête
    
    ?>
    Quand la requête ne renvoie rien, il ne se passe rien...

    J'ai l'impression que ma condition n'est pas bonne alors qu'elle me semble bien écrite..

    Auriez-vous une piste ? (ou carrément un domaine skiable vu que mon erreur est sûrement énorme ).

    Merci d'avance et encore à ce forum !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!empty($answer)){
        //Code si $answer n'est pas vide
    }else{
        header("HTTP/1.0 404 Not Found");
    }
    une réponse vous a permis d'avancer ?

  3. #3
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Par ailleurs, la ligne suivante devrait se trouver avant le catch...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $answer= $bdd->query('SELECT * FROM jeu where id="'.$_GET['id'].'" ');
    Si tu tombes dans le catch, $bdd n'existera pas dans le code suivant le catch, et tu tomberas sur un truc "Can not call function query on a non object".

    De même pour les instructions suivantes qui en dépendent...

    Ensuite, tu devrais architecturer ton code dans ce goût :

    Code : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <?php 
     
    $id = intval($_GET['id']);
     
    /* Déclaration des variables utilisées dans la vue */
    $jeux = array();
     
    try {
        $bdd = new PDO('mysql:host=mysql;dbname=jeu', 'jeu', 'jeu');
        $answer = $bdd->query('SELECT * FROM jeu where id="'.$id.'" ');
        // Parcours des résultats
        while ($contenu = $answer->fetch())
        {
            // on stocke le jeux de résultat dans un tableau associatif id => contenu
            $jeux[$contenu['id']] = array($contenu);
        }
        $reponse->closeCursor(); // Termine le traitement de la requête
        if (count($jeux) < 1){
            header("HTTP/1.0 404 Not Found");
        }
    } catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
    }
     
    ?>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        </head>
        <body>
            <?php foreach($jeux as $id => $contenu): ?>
                <h1 class="vue-produit"><?php echo $contenu['nom']; ?></h1>
            <?php endforeach; ?>
        </body>
    </html>

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Exia93 Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!empty($answer)){
        //Code si $answer n'est pas vide
    }else{
        header("HTTP/1.0 404 Not Found");
    }
    Malheureusement, quand $answer est vide, le code n'affiche pas le header Merci pour ta réponse


    @Théocrite :
    J'ai utilisé le bout de code donné et cela me dit, en effet, "Call to a member function closeCursor() on a non-object in".
    Comment faire pour que la ligne en question se retrouve avant le catch du coup ?

    Thx à vous en tout cas !

    Du coup : Pour tester ma démarche, j'ai fait ce petit code qui doit simplement me dire "ta variable est vide" ou "ta variable n'est pas vide". J'ai placé ce code avant le doctype :

    Code : 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
    26
    27
    28
    29
    30
    <?php
    try
    {
     
    	$bdd = new PDO('mysql:host=;dbname=', '', '');
    }
    catch(Exception $e)
    {
     
            die('Erreur : '.$e->getMessage());
    }
     
     
     
     
    $answer = $bdd->query('SELECT * FROM jeu where id="'.$id.'" and theme ="27" ');
     
     
    if (!empty($answer )){
        echo 'answer n est pas vide';
    }else{
        echo 'answer est vide';
    }
     
     
     
     
    $reponse->closeCursor(); 
     
    ?>
    Quand l'id existe, une ligne s'affiche au début de ma page : "answer n'est pas vide". Normal.
    Quand l'id n'existe pas ou qu'il existe mais n'appartient pas au thème 27, une ligne s'affiche au début de ma page : "answer n'est pas vide". Pas normal...

    Du coup :
    - Soit ma fonction "empty" est mal utilisée.
    - Soit ma variable answer a un problème...

    Merci d'avance pour votre aide

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu devrais relire la doc sur PDO et query(). $bdd->query('SQL') te renvoie un PDOStatement ou false si une erreur survient.
    Donc avant de tester if ( ! empty($answser)) { ... }, il faudrait que tu récupères les lignes résultats et qu'ensuite tu vérifies si tu en as au moins une dedans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $data = $answer->fetchAll(PDO::FETCH_ASSOC);
    if (empty($data)) {
        echo 'answer est vide';
    }
    else {
        echo 'answer n\'est pas vide';
    }

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    $answer est un objet PDO, il ne sera pas "empty" même si la requête ne renvoit pas de résultat.
    Il faut que tu "fetch".
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $answer = $bdd->query('SELECT * FROM jeu where id="'.$id.'" and theme ="27" ');
     
     
    if ( $answer->fetch() ){
        echo 'answer n est pas vide';
    }else{
        echo 'answer est vide';
    }
    devrait faire l'affaire.
    une réponse vous a permis d'avancer ?

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Salut,

    tu devrais relire la doc sur PDO et query(). $bdd->query('SQL') te renvoie un PDOStatement ou false si une erreur survient.
    Donc avant de tester if ( ! empty($answser)) { ... }, il faudrait que tu récupères les lignes résultats et qu'ensuite tu vérifies si tu en as au moins une dedans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $data = $answer->fetchAll(PDO::FETCH_ASSOC);
    if (empty($data)) {
        echo 'answer est vide';
    }
    else {
        echo 'answer n\'est pas vide';
    }
    Cela marche parfaitement

    Merci à tous !

    Je comprends mon erreur du coup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. un "if" pour générer une 404 si url modifiée
    Par PMulE dans le forum Langage
    Réponses: 14
    Dernier message: 08/02/2013, 13h14
  2. Réponses: 3
    Dernier message: 02/12/2005, 13h23
  3. Réponses: 1
    Dernier message: 14/10/2005, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo