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 :

migration de mysql vers pdo


Sujet :

Langage PHP

  1. #21
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    T'a bien fait de passer à pdo. Non seulement parce que l'extension mysql sera obsolète en php5.5, mais en plus à l'usage pdo est plus agréable à écrire et accessoirement plus portable
    Franchement, je suis incapable de te dire ce qui m'a amené à utiliser pdo !!
    Par contre j'ai effectivement lu que mysql serait obsolète et ça m'a conforté dans l'idée d'utiliser pdo (ça fait longtemps que je n'avais plus fait de developpement web et ça fait du bien un petit refresh des nouveautés).

    En farfouillant sur le net j'ai trouvé un script pour un forum ; ce n'est pas ce que je veux faire mais la partie connexion m'a l'air intéressante car elle utilise une autre méthode que le select count(*) qui renvoie uniquement un nombre ; elle utilise une métode qui lit tout, ce qui m'éviterait de faire deux requetes à chaque fois (une pour le select count(*) et une pour récupérer les données utilisateur).
    Je vais donc étudier ce code pour tenter de m'en inspirer (pas totalement mais au moins pour la récupération des données en une seule requête).

  2. #22
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Black_Layer Voir le message
    elle utilise une méthode qui lit tout, ce qui m'éviterait de faire deux requetes à chaque fois (une pour le select count(*) et une pour récupérer les données utilisateur).
    Je vois pas où. Tu peux me citer le passage ?

  3. #23
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Je vois pas où. Tu peux me citer le passage ?
    Effectivement tu ne risquais pas de le trouver ; c'était le bon site mais pas la bonne page

    C'est à la page précédente ; voici 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    //On reprend la suite du code
    else
    {
        $message='';
        if (empty($_POST['pseudo']) || empty($_POST['password']) ) //Oublie d'un champ
        {
            $message = '<p>une erreur s\'est produite pendant votre identification.
        Vous devez remplir tous les champs</p>
        <p>Cliquez <a href="./connexion.php">ici</a> pour revenir</p>';
        }
        else //On check le mot de passe
        {
            $query=$db->prepare('SELECT membre_mdp, membre_id, membre_rang, membre_pseudo
            FROM forum_membres WHERE membre_pseudo = :pseudo');
            $query->bindValue(':pseudo',$_POST['pseudo'], PDO::PARAM_STR);
            $query->execute();
            $data=$query->fetch();
        if ($data['membre_mdp'] == md5($_POST['password'])) // Acces OK !
        {
            $_SESSION['pseudo'] = $data['membre_pseudo'];
            $_SESSION['level'] = $data['membre_rang'];
            $_SESSION['id'] = $data['membre_id'];
            $message = '<p>Bienvenue '.$data['membre_pseudo'].', 
                vous êtes maintenant connecté!</p>
                <p>Cliquez <a href="./index.php">ici</a> 
                pour revenir à la page d accueil</p>';  
        }
        else // Acces pas OK !
        {
            $message = '<p>Une erreur s\'est produite 
            pendant votre identification.<br /> Le mot de passe ou le pseudo 
                entré n\'est pas correcte.</p><p>Cliquez <a href="./connexion.php">ici</a> 
            pour revenir à la page précédente
            <br /><br />Cliquez <a href="./index.php">ici</a> 
            pour revenir à la page d accueil</p>';
        }
        $query->CloseCursor();
        }
        echo $message.'</div></body></html>';
     
    }
    ?>

  4. #24
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Oui ben rien que du très classique, il s'agit là de la partie connexion et dans ce cas il n'y a pas besoin de faire de count puisqu'on vérifie simplement que le pseudo existe et que le mdp correspondant soit égal au mdp envoyé.

    Par contre dans la partie inscription ils font exactement comme dans ton code avec un select count préalablement à l'insertion. Et à part gérer l'éventuelle erreur (duplicate) dans un bloc try/catch, ce qui permet effectivement d'éviter une requête, il n'y a pas de troisième solution.

    D'ailleurs c'est bizarre que la gestion des erreurs avec le mode exception ne fonctionne pas sur ton serveur, ça fonctionne parfaitement sur le mien en local avec easyphp et en distant avec ovh.

  5. #25
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Enfin si il y a une troisième solution qui consisterait à utiliser l'opérateur "@" de suppression des erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $bd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);
     
    $query = "INSERT INTO membres (pseudo) VALUES(?)";
     
    $stmt = $bd->prepare($query);
     
    $result = @$stmt->execute(array($_POST['pseudo']));
     
    if(!$result) echo 'pseudo déjà utilisé';
    else echo 'enregistrement ok';
    Mais bon c'est beaucoup moins optimisé que d'utiliser le mode exception avec les blocs try/catch, et réputé "assez sale".
    Si tu n'arrive pas à faire fonctionner le mode exception sur ton serveur, la solution avec le count serait plus propre et en même temps cela rend la table plus sécurisée dans le cas ou tu aurais oublié de mettre ton champ pseudo unique.
    Et puis la requête d'inscription n'est pas amenée à être utilisée très fréquemment (par rapport à la requête de connexion par exemple) aussi ce sera une perte de performance pratiquement négligeable si tu dois faire ton count avant l'inscription. On se pose plutôt ce genre de question sur l'optimisation pour des requêtes très souvent utilisées dans l'application.

  6. #26
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Bon alors c'est résolu ? terminé cette première approche de pdo ?

    Un mot pour finir car sans vouloir être exhaustif je me suis rendu compte que je ne t'avais pas parlé de la fonction closeCursor Je te laisse lire la doc. Globalement on peut retenir qu'on peut l'utiliser systématiquement après avoir récupéré les données d'une requête de type SELECT. Parfois, ou plus souvent, ce n'est pas nécessaire mais en même temps cela ne dérange pas de la mettre même quand c'est pas nécessaire. A toi de décider de ta stratégie.

    By

  7. #27
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    terminé cette première approche de pdo ?
    Pas vraiment, je faisais juste une pause car à force de voir des lignes de code, je n'en dors plus !
    Là je suis de nouveau sur les rails donc je reprends ça ce soir

  8. #28
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Super_paumé est de retour...

    La question est la suivante : ça marche pas les boucles imbriquées avec PDO ?!!
    J'ai fait pas mal de recherches ces deux derniers jours mais impossible d'imbriquer 2 boucles while !!

    Cette boucle m'affiche les 5 derniers billets du blog. Seule dans un fichier, elle fonctionne parfaitement.
    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
    26
    27
    28
     
    <?php
    	// On récupère les 5 derniers billets
    	$req = $bdd->query('SELECT post_id, post_title, post_content, DATE_FORMAT(post_date, \'%d/%m/%Y à %Hh%imin%ss\') AS date_fr FROM posts ORDER BY post_date DESC LIMIT 0, 5'); 
     
    	while ($donnees = $req->fetch()) // Boucle, le fetch retourne les lignes une par une
    	{
    ?>
         	<div class="news">    
         		<h3>       
    	 			<?php 
    					echo htmlspecialchars($donnees['post_title']); // Convertit les caractères spéciaux en entités HTML, affichage du titre
    				?>    
         			<em>le <?php echo $donnees['date_fr']; ?> </em>    <!-- Date --> 
         		</h3>  
     
         		<p>    
    	 			<?php    
    	 				echo nl2br(htmlspecialchars($donnees['post_content'])); // Insère un retour à la ligne HTML à chaque nouvelle ligne, convertit les caractères spéciaux en entités HTML, affichage du contenu
    				?>    
         				<br />    
         				<em><a href="comments.php?post=<?php echo $donnees['post_id']; ?>">Commentaires</a>     </em>    <!-- Commentaires -->
         		</p>
         	</div>
    <?php
         } // Fin de la boucle des billets
    	 $req->closeCursor();  // Ferme le curseur, permettant à la requête -SQL!!- d'être de nouveau exécutée
    ?>

    Le truc c'est que ce code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="comments.php?post=<?php echo $donnees['post_id']; ?>">Commentaires</a>
    crée une autre page dynamiquement pour afficher les commentaires.

    Ce que je souhaitais faire, c'est afficher les 5 derniers commentaires sous chaque billet et un lien "voir plus de commentaires".

    Le code des commentaires est le suivant et lui aussi, sur une page seule fonctionne parfaitement :

    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
     
    ...
    // Récupération des commentaires
    $req = $bdd->prepare('SELECT comment_author_name, comment_content, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE comment_post_id = ? ORDER BY comment_date');
    $req->execute(array($_GET['post']));
     
    while ($donnees = $req->fetch())	// Boucle, le fetch retourne les lignes une par une
    {
    ?>
    <p><strong><?php echo htmlspecialchars($donnees['comment_author_name']); ?></strong> le <?php echo $donnees['comment_date_fr']; ?></strong></p>
    <p><?php echo nl2br(htmlspecialchars($donnees['comment_content'])); ?></p>
    <?php
    } // Fin de la boucle des commentaires
    $req->closeCursor();	// Important : on libère le curseur pour la prochaine requête
    ...

    J'ai tenté d'imbriquer ce while à différents endroits du précédent (en modifiant bien entendu "comment_post_id = ?") mais le résultat est toujours identique : affichage du premier billet et rien en-dessous ; ni commentaire, ni autre billet (je précise qu'il y a plusieurs billets et que chaque billet a plusieurs commentaires).

  9. #29
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    C'est le même principe que closeCursor. Tant que tu n'as pas récupéré toutes tes lignes, aucune autre requête de sélection n'est possible.

    Donc pour ta première requête enregistre les résultats de ta requête dans un tableau puis applique closeCursor et ainsi tu peux faire les requêtes suivantes. Ensuite il te suffira de lire le contenu de ton tableau.

    Remarque que si ton tableau doit être simplement une réplique du contenu de ta table (comme c'est le cas dans ton exemple) tu peux le construire en utilisant fetchAll() - $tab_donnees = $req->fetchAll() - plutôt que de faire un while ... fetch()

  10. #30
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    C'est le même principe que closeCursor. Tant que tu n'as pas récupérer toutes tes lignes, aucune autre requête de sélection n'est possible.

    Donc pour ta première requête enregistre les résultats de ta requête dans un tableau puis applique closeCursor et ainsi tu peux faire les requêtes suivantes. Ensuite il te suffira de lire le contenu de ton tableau.
    J'avais en effet cru comprendre que le problème devait venir du closeCursor que, il faut bien l'avouer, je ne maîtrise pas.
    Mais bon même sans celà, j'ai tenté de le positionner à divers endroits y compris là où tu me le dis et ça n'a absolument rien changé... et si je fais afficher la source dans mon navigateur, ça m'affiche <p> le contenu du premier billet mais même pas le </p> d'après !

    Citation Envoyé par ABCIWEB Voir le message
    Remarque que si ton tableau doit être simplement une réplique du contenu de ta table (comme c'est le cas dans ton exemple) tu peux le construire en utilisant fetchAll() - $tab_donnees = $req->fetchAll() - plutôt que de faire un while ... fetch()
    C'est marrant que tu parles de fetchAll, j'étais justement entrain de lire de la doc à son sujet... bien que dans les exemples que je lisais il était lui aussi employé dans un while.
    Par contre je dois l'avouer, je ne comprends absolument pas ton code ou plutôt comment "fetcher" plusieurs billets si je ne parcours pas ma bdd.

    Pour rappel, voici ce que j'aimerais obtenir :

    - Premier Billet
    - Les 5 derniers commentaires de ce billet
    - Second billet
    - Les 5 derniers commentaires de ce billet
    - Troisième billet
    - Les 5 derniers commentaires de ce billet
    etc.

  11. #31
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    fais par exemple : $tab_donnees = $req->fetchAll();print_r($tab_donnees);
    et tu verras que $tab_donnees contient toutes tes lignes...

    Donc concrètement
    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
    <?php 
     
    //...
     
    $tab_donnees = $req->fetchAll();
     
    // Comme fetchAll() récupère toutes les données tu peux faire d'autres requêtes à la suite.
     
    // et tu utilise $tab_donnees pour lister tes résultats
    foreach($tab_donnees as $donnees) 
    {
    ?>
         	<div class="news">    
         		<h3>       
    	 			<?php 
    					echo htmlspecialchars($donnees['post_title']); // Convertit les caractères spéciaux en entités HTML, affichage du titre
    				?>  
    //....
    <?php }?>

  12. #32
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    ok je comprends mieux ; il faut quand même un foreach...

    ... mais ça ne me dit toujours pas si les imbrications sont possibles pour obtenir mon résultat final et comment !

  13. #33
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    C'est le même principe que closeCursor. Tant que tu n'as pas récupéré toutes tes lignes, aucune autre requête de sélection n'est possible.
    Donc pour ta première requête enregistre les résultats de ta requête dans un tableau puis applique closeCursor et ainsi tu peux faire les requêtes suivantes. Ensuite il te suffira de lire le contenu de ton tableau.
    Donc en gros ce que je veux faire est impossible avec pdo ? Puisque si je comprends bien il faut que je mette le closeCursor à la fin du foreach mais donc si je sors de ma boucle il m'est impossible de récupérer les commentaires de ce billet uniquement ?!!!
    Puisqu'en gros, si je comprends bien, je vais boucler tous mes billets dans un tableau et les afficher un par un et tant que je ne "relache" pas le curseur, je ne peux pas boucler sur les commentaires donc ils s'afficheront en-dessous de tout et pas en-dessous du billet auquel ils sont liés ?!!!

    Désolé j'avais prévenu, Super_paumé est de retour

  14. #34
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Black_Layer Voir le message
    Donc en gros ce que je veux faire est impossible avec pdo ? Puisque si je comprends bien il faut que je mette le closeCursor à la fin du foreach mais donc si je sors de ma boucle il m'est impossible de récupérer les commentaires de ce billet uniquement ?!!!
    Non pas à la fin du foreach mais dès que tu as récupéré tous tes résultats et comme tu les récupère tous en une seule fois avec fetchAll tu peux mettre closeCursor juste après $tab_donnees = $req->fetchAll(); et donc avant de lister ton tableau... (d'où l'intérêt de mettre tes résultats dans un tableau, c'est ce que je t'explique depuis tout à l'heure )

    En fait dans mon exemple au dessus je n'ai pas utilisé closeCursor car après un fetchAll il n'y en a normalement pas besoin. closeCursor c'est pour libérer le tampon de la ressource et comme fetchAll récupère tout, le tampon est vide donc pas de problème pour récupérer le résultat d'autres requêtes (mais si tu veux tu peux quand même mettre closeCursor, ça gêne pas)
    Dans ton exemple plus haut tu faisais d'autres requêtes avant d'avoir récupérer tous tes résultats donc ça c'est impossible car pdo n'a qu'un tampon de disponible. D'où la solution de stocker tous tes résultats dans un tableau ce qui te permet de libérer la ressource (et le tampon qui va avec) et de pouvoir ainsi faire d'autres requêtes tout en utilisant ton tableau comme tu veux et quand tu veux.

  15. #35
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
    // On récupère les 5 derniers billets
    $req = $bdd->query('SELECT post_id, post_title, post_content, DATE_FORMAT(post_date, \'%d/%m/%Y à %Hh%imin%ss\') AS date_fr FROM posts ORDER BY post_date DESC LIMIT 0, 5'); 
    $tab_donnees = $req->fetchAll();
    $req->closeCursor();  // Ferme le curseur, permettant à la requête -SQL!!- d'être de nouveau exécutée
    foreach($tab_donnees as $donnees) 
    {
    ?>
         	<div class="news">    
         		<h3>       
    	 			<?php 
    					echo htmlspecialchars($donnees['post_title']); // Convertit les caractères spéciaux en entités HTML, affichage du titre
    				?>
                <em>le <?php echo $donnees['date_fr']; ?> </em>    <!-- Date --> 
         		</h3>  
     
         		<p>    
    	 			<?php    
    	 				echo nl2br(htmlspecialchars($donnees['post_content'])); // Insère un retour à la ligne HTML à chaque nouvelle ligne, convertit les caractères spéciaux en entités HTML, affichage du contenu
    	 			?>    
         				<br />    
         				<em> <?php
                            $req->bindParam('postid', $donnees['post_id']);
    						// Récupération des commentaires
    						$req = $bdd->query('SELECT comment_author_name, comment_content, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE comment_post_id = :postid ORDER BY comment_date');
    						$t_donnees = $req->fetchAll();
    						foreach ($t_donnees as $sdonnees)	// Boucle, le fetch retourne les lignes une par une
    						{
    						?>
    						<p><strong><?php echo htmlspecialchars($sdonnees['comment_author_name']); ?></strong> le <?php echo $sdonnees['comment_date_fr']; ?></strong></p>
    						<p><?php echo nl2br(htmlspecialchars($sdonnees['comment_content'])); ?></p>
    						<?php
    						} // Fin de la boucle des commentaires
    						$req->closeCursor();	// Important : on libère le curseur pour la prochaine requête
    						?>
                        </em>    <!-- Commentaires -->
         		</p>
         	</div>  
    <?php
         } // Fin de la boucle
    ?>

    Il me semble avoir respecté tout ce que tu m'as dit. Pourtant ça ne change absolument rien ; ça m'affiche toujours le premier billet et rien d'autre...
    Je suis perdu là !

  16. #36
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Ta deuxième requête dans la boucle ne ressemble à rien. C'est quoi ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req->bindParam('postid', $donnees['post_id']);
    On bind un paramètre pour une requête préparée mais à ce stade tu n'as rien préparé puisque tu fais ta requête après.
    Et la requête suivante n'est d'ailleurs pas une requête préparée puisque tu utilise
    $bdd->query

  17. #37
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Oups erreur de copier-coller

    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
    40
    41
    42
    43
    44
     
    <?php
    // On récupère les 5 derniers billets
    $req = $bdd->query('SELECT post_id, post_title, post_content, DATE_FORMAT(post_date, \'%d/%m/%Y à %Hh%imin%ss\') AS date_fr FROM posts ORDER BY post_date DESC LIMIT 0, 5'); 
    $tab_donnees = $req->fetchAll();
    $req->closeCursor();  // Ferme le curseur, permettant à la requête -SQL!!- d'être de nouveau exécutée
    foreach($tab_donnees as $donnees) 
    {
    ?>
         	<div class="news">    
         		<h3>       
    	 			<?php 
    					echo htmlspecialchars($donnees['post_title']); // Convertit les caractères spéciaux en entités HTML, affichage du titre
    				?>
                <em>le <?php echo $donnees['date_fr']; ?> </em>    <!-- Date --> 
         		</h3>  
     
         		<p>    
    	 			<?php    
    	 				echo nl2br(htmlspecialchars($donnees['post_content'])); // Insère un retour à la ligne HTML à chaque nouvelle ligne, convertit les caractères spéciaux en entités HTML, affichage du contenu
    	 			?>    
         				<br />    
         				<em> <?php
     
    						// Récupération des commentaires
    						$req = $bdd->prepare('SELECT comment_author_name, comment_content, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE comment_post_id = :postid ORDER BY comment_date');
    						$req->bindParam('postid', $donnees['post_id']);
    						$req->execute();
    						$t_donnees = $req->fetchAll();
    						foreach ($t_donnees as $sdonnees)	// Boucle, le fetch retourne les lignes une par une
    						{
    						?>
    						<p><strong><?php echo htmlspecialchars($sdonnees['comment_author_name']); ?></strong> le <?php echo $sdonnees['comment_date_fr']; ?></strong></p>
    						<p><?php echo nl2br(htmlspecialchars($sdonnees['comment_content'])); ?></p>
    						<?php
    						} // Fin de la boucle des commentaires
    						$req->closeCursor();	// Important : on libère le curseur pour la prochaine requête
    						?>
                        </em>    <!-- Commentaires -->
         		</p>
         	</div>  
    <?php
         } // Fin de la boucle
    ?>
    Le problème reste bien entendu identique, j'avais juste copié le code précédemment avant de le changer et quand j'ai refait "copier" sur le nouveau code il a gardé en mémoire l'ancien.

  18. #38
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Faut te mettre en mode debug pour y voir quelque chose, c'est à dire faire des contrôles à différentes étapes.
    Par exemple vérifie $tab_donnees avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'nb_tab_donnees = '.count($tab_donnees);
    pareil pour $t_donnees... Fais afficher $donnees['post_id'] pour contrôle etc...

    Si tu pouvais aussi nommer ta deuxième requête autrement que la première...

    Et puis aussi pense à faire afficher tes erreurs en phase de développement, donc utilise soit l'option PDO::ERRMODE_WARNING, soit PDO::ERRMODE_EXCEPTION avec des blocs try/catch

  19. #39
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    N'oublies pas de tenir compte de mon précédent message si tu veux devenir autonome en matière de débuggage.

    Sinon je vois que tu utilises ->bindParam alors que dans ce cas il faudrait certainement utiliser ->bindValue à la place.


    Et puis tu n'utilise pas l'avantage des requêtes préparées puisque tu les prépare et re prépare dans ta boucle (donc à chaque tour de boucle). L'intérêt est de ne les préparer qu'une seule fois sinon le traitement est finalement plus long que de faire des requêtes non préparées. Donc sur le principe :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?php
    // On récupère les 5 derniers billets
    $req = $bdd->query('SELECT post_id, post_title, post_content, DATE_FORMAT(post_date, \'%d/%m/%Y à %Hh%imin%ss\') AS date_fr FROM posts ORDER BY post_date DESC LIMIT 0, 5'); 
     
    $tab_donnees = $req->fetchAll();
    $req->closeCursor();  // Ferme le curseur, permettant à la requête -SQL!!- d'être de nouveau exécutée
     
    $req_com = $bdd->prepare('SELECT comment_author_name, comment_content, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE comment_post_id = :postid ORDER BY comment_date');
     
    foreach($tab_donnees as $donnees) 
    {
    ?>
         	<div class="news">    
         		<h3>       
    	 			<?php 
    					echo htmlspecialchars($donnees['post_title']); // Convertit les caractères spéciaux en entités HTML, affichage du titre
    				?>
                <em>le <?php echo $donnees['date_fr']; ?> </em>    <!-- Date --> 
         		</h3>  
     
         		<p>    
    	 			<?php    
    	 				echo nl2br(htmlspecialchars($donnees['post_content'])); // Insère un retour à la ligne HTML à chaque nouvelle ligne, convertit les caractères spéciaux en entités HTML, affichage du contenu
    	 			?>    
         				<br />    
         				<em> <?php
     
    						// Récupération des commentaires
     
                                                    $req_com->bindValue('postid', $donnees['post_id']);
    						$req_com->execute();
    						$t_donnees = $req_com->fetchAll();
                                                    $req_com->closeCursor();	// Important : on libère le curseur pour la prochaine requête
    						foreach ($t_donnees as $sdonnees)	// Boucle
    						{
    						?>
    						<p><strong><?php echo htmlspecialchars($sdonnees['comment_author_name']); ?></strong> le <?php echo $sdonnees['comment_date_fr']; ?></strong></p>
    						<p><?php echo nl2br(htmlspecialchars($sdonnees['comment_content'])); ?></p>
    						<?php
    						} // Fin de la boucle des commentaires
     
    						?>
                        </em>    <!-- Commentaires -->
         		</p>
         	</div>  
    <?php
         } // Fin de la boucle
    ?>
    Et si cela ne fonctionne pas, retourne à mon message précédent pour avoir plus de renseignements concernant les erreurs.

  20. #40
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Ca confirme ce que je disais précédemment lorsque je faisais une pause et où tu m'as demandé si j'avais fini mon initiation à PDO : je suis à des années lumières de maîtriser PDO !!

    Je m'explique : à ton avant dernier post où tu m'expliques que je dois analyser mes variables etc pour gérer les erreurs et voir où ça bloque, je reprends le codage.
    Je commence par un try catch sauf que visiblement, comme ça m'affiche le premier billet, le try fonctionne à moitié et donc il ne rentre jamais dans le catch -> aucune erreur affichée mais toujours le premier billet.

    Pas grave, je continue à suivre ton idée : j'affiche le count de tab_données : 2 ; c'est exact donc ok
    Puis j'affiche la variable post_id avec un echo... là il m'affiche uniquement 1 id alors qu'il y en a 2 donc il ne va pas au bout du foreach.
    J'affiche le count de t_donnees : non en fait non parce qu'il n'affiche rien donc visiblement il ne va même pas jusque là !!
    Mais c'est bizarre car le code juste au-dessus est exécuté parfaitement et là ça bloque juste sur cette ligne ($t_donnees = $req->fetchAll()
    Ni une ni deux, je me rends dans phpmyadmin et je vérifie ma requête : elle est correcte !
    J'ai aussi tenté de renommer ma deuxième requête mais pas de changement.
    A ce stade, complètement paumé (ça ça change pas au moins ), je me rends ici pour poster ce que je viens de rencontrer comme situation.

    Là je vois ton code. Je duplique ma page histoire de garder une trace du travail précédent en cas d'échec.
    Je remplace ma partie de code concernée par la tienne.
    J'envoie le tout et là, oh, miracle, ça fonctionne parfaitement comme je le voulais.

    Il ne me reste donc plus qu'une chose à faire : comparer les codes pour essayer de comprendre ce qui a créé ce blocage (je fais toujours cette démarche car si je ne comprends pas l'erreur je suis à même de la reproduire).
    EDIT : j'ai trouvé, j'avais renommé la deuxième requête partout... sauf au début

    Dans tous les cas je tiens à te remercier une fois de plus pour ton aide très précieuse car j'ai pris énormément de retard sur ce site mais sans toi j'en aurais encore beaucoup plus !!!

Discussions similaires

  1. migration de mysql vers postgresql
    Par ANISSS dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 18/05/2007, 15h19
  2. Réponses: 3
    Dernier message: 08/03/2007, 10h53
  3. Migration de Mysql vers Sql Server
    Par bluecurve dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/02/2007, 00h21
  4. Re besoin de vous pour migration de mysql vers dsl server
    Par scaleo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/11/2006, 13h45
  5. [SGBD] Migration de mysql vers PostgreSQL ?
    Par haffouff dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 25/05/2006, 15h29

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