Bonjour,

J'ai cette partie de code sur mon site:

if(mysql_num_rows($reponse) != 0){

Mais j'essaye de trouver l'équivalent en PDO, de cette code. Comment pourrai-je faire?

Merci d'avance,

24 réponses


Carouge10
Réponse acceptée

Bonsoir,

oui, le tuto sera bon pour vous.
mysql_real_escape_string est obsolète et il faudra le remplacer par : $bdd->quote($_GET'page'])

<?php        

  $bdd = new PDO("mysql:host=localhost;dbname=dbname", "dbuser", "dbpass");

    // On récupère les 3 dernières news  
    if(isset($_GET'page'])){  
        $page = $bdd->quote($_GET'page']); // On récupère le numéro de la page indiqué dans l'adresse ( exemple news.php?page=4)  
    } 
    // si non la variable n'existe pas, c'est la première fois qu'on charge la page
    else{  
        $page = 1; // On affiche la page 1, la page par defaut  
    }
    // Sélection de toute les news
    $reponse = $bdd->query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 10');   
    //Si nous avons des données, nous les affichons
    if ($reponse->RowCount() > 0){
        //on affiche le résultat        
        while ($donnees = $reponse->fetch()){
        ?> 

            <div class="news">

                <span class="cat_date">
                        <?php
                        //si la miniature existe, on l'affiche
                        if(!empty($donnees'miniature']))
                            echo '<img alt="'.$donnees'titre'].'" src="'.$donnees'miniature'].'" style="float:left;margin:5px 10px;" />';  
                        ?>       
                        <em><?= stripslashes($donnees'categorie']); //on recupère catégorie ?>,</em> le <?= date('d/m/Y à H\hi', strtotime($donnees'date'])); //on recupère la date ?> <br/></span>
                            <span class="titre_news"><a href="news.html?id=<?= $donnees'id']; ?>"><?= stripslashes($donnees'titre']); //on recupère titre ?> </a><br /></span>
                        <div class="intro"> 
                            <?php
                                $introduction = nl2br(stripslashes($donnees'introduction']));  
                                echo $introduction;    
                            ?> 
                        </div>

             <div class="hr"></div><br />
             </div> 
             <?php   
        } // Fin de la boucle des news
    }
    //si il n'y a rien
    else {
        echo 'Aucunes données!';
    }
    // fin du else
?>

Par contre vous récupérer le nombre de page mais vous ne vous en servez pas.

Carouge10
Réponse acceptée

Remplacer :

if (isset($_GET'page']))  
{  
    $page = $bdd->quote($_GET'page']); // On récupère le numéro de la page indiqué dans l'adresse ( exemple news.php?page=4)  
}  
else // si non la variable n'existe pas, c'est la première fois qu'on charge la page  
{  
    $page = 1; // On affiche la page 1, la page par defaut  
}

Par:

$page = (isset($_GET'page']))? $_GET'page'] : 1;

Et enlever le "echo" et le var_dump.

Carouge10
Réponse acceptée

oui par exemple.

Salut,
Comment pourrai-je faire? En utilisant Google l'ami de tout le monde
Tu n'as pas du chercher beaucoup :s voila ce que j'ai trouver en même pas 2 min

Lien 1

sinon avec une requete Count + fetch_num

$sql="SELECT count(*) FROM [tablename] WHERE key == ? ";
$sth = $this->db->prepare($sql);
$sth->execute(array($key));
$rows = $sth->fetch(PDO::FETCH_NUM);
echo $rows[0];

sinon compter tout simplement le nombre de resultat

$rows = $q->fetchAll();
$num_rows = count($rows);

Cordialement,

fanweb
Auteur

Salut,

J'avais cherché mais j'avais pas compris grand chose...

Et quand j'essaye ton code j'ai cette erreur: Fatal error: Call to a member function fetchAll() on a non-object in /home/u621129814/public_html/index2.html on line 46

Je met mon code complet:

<?php        

  $bdd = new PDO('');

    // On récupère le nombre total de messages  
     $reponse = $bdd->query('SELECT COUNT(*) AS nb_messages FROM news');  
      while ($donnees = $reponse->fetch())
    $Messages = $donnees'nb_messages']; 

    // On récupère les 3 dernières news  
    if(isset($_GET'page'])){  
        $page = mysql_real_escape_string($_GET'page']); // On récupère le numéro de la page indiqué dans l'adresse ( exemple news.php?page=4)  
    } 
    // si non la variable n'existe pas, c'est la première fois qu'on charge la page
    else{  
        $page = 1; // On affiche la page 1, la page par defaut  
    }  

                    $reponse = $bdd->query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 10');  
        //si il y a quelque chose
        $rows = $q->fetchAll();
$num_rows = count($rows);{
            //on affiche le résultat        
             while ($donnees = $reponse->fetch())
            ?> 

                    <div class="news">

                        <span class="cat_date">
                        <?php
                              //si la miniature existe, on l'affiche
                                    if(!empty($donnees'miniature'])){
                                        echo '<img alt="'.$donnees'titre'].'" src="'.$donnees'miniature'].'" style="float:left;margin:5px 10px;" />';
                                    }
                            ?>      
                            <em><?php  
                            echo stripslashes($donnees'categorie']); //on recupère catégorie ?>,</em> le <?php echo date('d/m/Y à H\hi', strtotime($donnees'date'])); //on recupère la date ?> <br/></span>
                            <span class="titre_news"><a href="news.html?id=<?php echo $donnees'id']; ?>"><?php echo stripslashes($donnees'titre']); //on recupère titre ?> </a><br /></span>
                            <div class="intro"> 
                                <?php  

                                    $introduction = nl2br(stripslashes($donnees'introduction']));  
                                    echo $introduction;    
                                ?> 
                            </div>

                            <div class="hr"></div><br />

                    </div> 
             <?php   
            } // Fin de la boucle des news  
        //si il n'y a rien
        {
            echo 'Aucunes données!';
        }
    // fin du else
?>

Merci d'avance,

Houla en effet je vois que tu ne comprend pas grand chose a PDO

Il faut que tu donne a ton objet PDO les informations de ta BDD sinon forcement il ne trouvera pas FetchAll

$conn = new PDO("mysql:host=localhost;dbname=dbname", "dbuser", "dbpass");

donc je te conseil de suivre ce tuto vue que tu as des difficultés, tu apprendras surement de nouvelle chose

Tuto PDO grafiakrt

fanweb
Auteur

Bonjour,

Yentia: Je sais me connecter, mais pour le forum j'ai enlevé mes données. J'aurais du mettre quelques choses c'est vrai...

Carouge10: Le nombre de pages, je me serve dans une autre fichier. J'ai essayé d'enlever la recuperation de page, mais a chaque fois j'ai eu des messages d'erreurs. Donc, je l'ai laissé en attendant. Mais je dois changer la fonction des pages, de toute façon, c'est pas correcte.

Sinon, j'ai essayé le code, et ca marche. Merci beaucoup pour votre aide...

Je met le sujet comme résolu.

fanweb
Auteur

Bonjour,

Je reviens vers vous sur ce même sujet car j'ai le même type de problème sur d'autres pages. En effet, sur les fichiers ou j'en ai plusieurs pages, l'erreur suivant m'apparaît: Fatal error: Call to a member function RowCount() on a non-object in /home/u621129814/public_html/news-series.html on line 60

Lorsque je vais sur la rubrique tout va bien, mais quand je clique sur une page j'ai cette problème. Même si je clique sur la page 1.

Comme exemple je met le code du fichier news-series:

<?php        

  $bdd = new PDO('mysql:host=1234;dbname=1234', '1234', '1234'); // On se connecte à la base

   // le nombre de news (3) qu'on veut afficher dans une page  
$MessagesPerPage = 10;   
// On récupère le nombre total de messages  
$reponse = $bdd->query('SELECT COUNT(*) AS nb_messages FROM news');  
  while ($donnees = $reponse->fetch())
    $Messages = $donnees'nb_messages'];
// On calcule le nombre de pages à créer  
$Pages = ceil($Messages / $MessagesPerPage);  

// On récupère les 3 dernières news 

if (isset($_GET'page']))  
{  
        $page = $bdd->quote($_GET'page']); // On récupère le numéro de la page indiqué dans l'adresse ( exemple news.php?page=4)  
}  
else // si non la variable n'existe pas, c'est la première fois qu'on charge la page  
{  
        $page = 1; // On affiche la page 1, la page par defaut  
}  
     $firstmessage = ($page - 1) * $MessagesPerPage; 
$reponse = $bdd->query('SELECT * FROM news WHERE categorie="Séries" ORDER BY id DESC LIMIT ' . $firstmessage . ', ' . $MessagesPerPage);  
//si il y a quelque chose
   if ($reponse->RowCount() > 0){
        //on affiche le résultat        
        while ($donnees = $reponse->fetch()){
        ?>   
       <div class="news">

         <span class="cat_date">
         <?php
                              //si la miniature existe, on l'affiche
                                    if(!empty($donnees'miniature'])){
                                        echo '<img alt="'.$donnees'titre'].'" src="'.$donnees'miniature'].'" style="float:left;margin:5px 10px;" />';
                                    }
                            ?>
   <em><?php  
 echo stripslashes($donnees'categorie']); //on recupère catégorie ?>,</em> le <?php echo date('d/m/Y à H\hi', strtotime($donnees'date'])); //on recupère la date ?> <BR></span>
  <span class="titre_news"><a href="news.html?id=<?php echo $donnees'id']; ?>"><?php echo stripslashes($donnees'titre']); //on recupère titre ?> </a> </span><br />
        <div class="intro"> <?php  
   {    
   $introduction = nl2br(stripslashes($donnees'introduction']));  
    echo $introduction;  
   }    
?> </div>
<div class="hr"></div><br />
</div> 

   <?php   
            } // Fin de la boucle des news  
        }//fin du if(mysql_num_rows($result) != 0){
        //si il n'y a rien
        else{
            echo 'Aucunes données!';
        }
    // fin du else
?> 
<div class="pages">
<?php
echo 'Page : ';  
for ($i = 1 ; $i <= $Pages ; $i++)  
{  
    echo '<a href="news-series.html?page=' . $i . '">' . $i . '</a> ';  
} 
?>
</div>

Sur la ligne 60, j'ai cette ligne de code: if ($reponse->RowCount() > 0){

Après plusieurs tentatives, et des recherches sur le web, j'arrive toujours pas à trouver le problème.

Pouvez vous m'aider?

Merci d'avance,

Bonsoir, peut-on avoir le code complet car à la ligne 60 c'est du commentaire.

fanweb
Auteur

Bonsoir,

Voici mon code complet:

<!DOCTYPE html>
<html>
    <head>
        <title>cine-seriestv.tk - Toute l'actualité sur vos séries préférés</title>
        <meta charset="utf-8" />
        <meta name="description" content="Retrouvez toute l'actualité sur vos séries préférés, Françaises et Américaines ..." />
                <link rel="stylesheet" href="design.css" />
          <!--[if lt IE 9]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
    </head>
    <body>
            <?php include('facebook.php'); ?>
    <div id="bloc_page">
    <?php include('header.php'); ?>

    <?php include('menu.php'); ?>
    <section>
        <div class="file-ariane">
<p> <a href="index.html">Accueil</a> › <a href="tv.html">TV</a> › <a href="#">Séries</a> › Actualités Séries
</p>
    </div>
    <hr width=100%>
                <?php include('colonnes_droite.php'); ?>

    <p>ACTUALITES "SERIES"</p>
    <?php        

  $bdd = new PDO('mysql:host=1234;dbname=1234', '1234', '1234'); // On se connecte à la base

   // le nombre de news (3) qu'on veut afficher dans une page  
$MessagesPerPage = 10;   
// On récupère le nombre total de messages  
$reponse = $bdd->query('SELECT COUNT(*) AS nb_messages FROM news');  
  while ($donnees = $reponse->fetch())
    $Messages = $donnees'nb_messages'];
// On calcule le nombre de pages à créer  
$Pages = ceil($Messages / $MessagesPerPage);  

// On récupère les 3 dernières news 

if (isset($_GET'page']))  
{  
        $page = $bdd->quote($_GET'page']); // On récupère le numéro de la page indiqué dans l'adresse ( exemple news.php?page=4)  
}  
else // si non la variable n'existe pas, c'est la première fois qu'on charge la page  
{  
        $page = 1; // On affiche la page 1, la page par defaut  
}  
     $firstmessage = ($page - 1) * $MessagesPerPage; 
$reponse = $bdd->query('SELECT * FROM news WHERE categorie="Séries" ORDER BY id DESC LIMIT ' . $firstmessage . ', ' . $MessagesPerPage);  
//si il y a quelque chose
   if ($reponse->RowCount() > 0){
        //on affiche le résultat        
        while ($donnees = $reponse->fetch()){
        ?>   
       <div class="news">

         <span class="cat_date">
         <?php
                              //si la miniature existe, on l'affiche
                                    if(!empty($donnees'miniature'])){
                                        echo '<img alt="'.$donnees'titre'].'" src="'.$donnees'miniature'].'" style="float:left;margin:5px 10px;" />';
                                    }
                            ?>
   <em><?php  
 echo stripslashes($donnees'categorie']); //on recupère catégorie ?>,</em> le <?php echo date('d/m/Y à H\hi', strtotime($donnees'date'])); //on recupère la date ?> <BR></span>
  <span class="titre_news"><a href="news.html?id=<?php echo $donnees'id']; ?>"><?php echo stripslashes($donnees'titre']); //on recupère titre ?> </a> </span><br />
        <div class="intro"> <?php  
   {    
   $introduction = nl2br(stripslashes($donnees'introduction']));  
    echo $introduction;  
   }    
?> </div>
<div class="hr"></div><br />
</div> 

   <?php   
            } // Fin de la boucle des news  
        }//fin du if(mysql_num_rows($result) != 0){
        //si il n'y a rien
        else{
            echo 'Aucunes données!';
        }
    // fin du else
?> 
<div class="pages">
<?php
echo 'Page : ';  
for ($i = 1 ; $i <= $Pages ; $i++)  
{  
    echo '<a href="news-series.html?page=' . $i . '">' . $i . '</a> ';  
} 
?>
</div>
    <br /><br/>
    </section>
<?php include('footer.php'); ?>
    </div>
   </body>
</html>

Merci d'avance pour votre aide.

Avez-vous essayer la requête dans phpmyadmin pour savoir si elle est correcte ?

De plus, il est préférable de ne pas utiliser plusieurs fois la même variable pour des données différente.
Il vaut mieux donner un nom explicite pour les données récupérer de la BDD.

ex pour la 2ème requête:

$req_news = $bdd->query('SELECT * FROM news WHERE categorie = "Séries" ORDER BY id DESC LIMIT ' . $firstmessage . ', ' . $MessagesPerPage);  
//si il y a quelque chose
if ($req_news->RowCount() > 0){
    //on affiche le résultat        
    while ($donnees_news = $req_news->fetch()){
    ...
fanweb
Auteur

Bonsoir,

Merci pour la réponse.

"Avez-vous essayer la requête dans phpmyadmin pour savoir si elle est correcte ?" C'est-à-dire?

En faite, Lorsque j'ai crée le site, j'ai utilisé l'ancien version pour me connecter à mon BDD, mais comme l'ancien version est devenu obsolète, j'ai commencé à changer en PDO. Et donc avant que je change ca, la pagination marchait sans problème mais dès que j'ai changé en PDO la pagination ne marche plus. Je sais qu'il y a un problème quelques part, mais j'arrive pas à trouver où?

Et c'est vrai qu'avec votre exemple, c'est plus facile pour comprendre...

Merci d'avance pour votre aide.

Quand vous vous rendez sur phpmyadmin de votre site, vous avez la possibilité de tester votre requête dans l'onglet "SQL" afin de vérifier que celle-ci soit correct.

fanweb
Auteur

Je viens de tester la requête sur mon PHPMYADMIN.

J'ai testé la requête suivante, ca a marché sans problème:

SELECT * FROM news WHERE categorie = "Séries"

Mais si je rajoute la partie "ORDER BY id DESC LIMIT" , ca ne marche plus ni la requête entière;

SELECT * FROM news WHERE categorie = "Séries" ORDER BY id DESC LIMIT . $firstmessage . ', ' . $MessagesPerPage

Merci d'avance pour votre réponse.

Dans phpMyAdmin tu dois remplacer $firstmessage et $MessagePerPage par une valeur pour savoir si la requête marche. Sinon dans ton code php n'oublies pas les guillemets d'ouverture et de fermetures.

fanweb
Auteur

Je viens d'essayer mais ca n'a pas marché.

Il m'a affiché le message d'erreur:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '10' at line 1

Par contre si j'enlève complètement &MessagePerPage, et que je donne un valeur à &firstmessage, il m'affiche un resultat:
Par exemple, si je donne comme valeur 10, il va me sortir 10 au hasard...

Merci d'avance pour votre aide.

La syntaxe exacte serait du style:

SELECT * FROM news WHERE categorie = "Séries" ORDER BY id DESC LIMIT 0, 10
fanweb
Auteur

Ah oui, ca marche, j'avais essayé 1, 10 mais non 0, 10

Donc, si ca c'est correct, c'est quoi le problème?

Merci d'avance pour votre aide.

<!DOCTYPE html>
<html>
    <head>
        <title>cine-seriestv.tk - Toute l'actualité sur vos séries préférés</title>
        <meta charset="utf-8" />
        <meta name="description" content="Retrouvez toute l'actualité sur vos séries préférés, Françaises et Américaines ..." />
                <link rel="stylesheet" href="design.css" />

          <!--[if lt IE 9]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
    </head>

    <body>
            <?php include('facebook.php'); ?>

    <div id="bloc_page">
    <?php include('header.php'); ?>

    <?php include('menu.php'); ?>

    <section>
        <div class="file-ariane">
<p> <a href="index.html">Accueil</a> › <a href="tv.html">TV</a> › <a href="#">Séries</a> › Actualités Séries
</p>
    </div>
    <hr width=100%>

                <?php include('colonnes_droite.php'); ?>

    <p>ACTUALITES "SERIES"</p>
    <?php        

  $bdd = new PDO('mysql:host=1234;dbname=1234', '1234', '1234'); // On se connecte à la base

   // le nombre de news (3) qu'on veut afficher dans une page  
$MessagesPerPage = 10;   
// On récupère le nombre total de messages  
$reponse = $bdd->query('SELECT COUNT(*) AS nb_messages FROM news');  
  while ($donnees = $reponse->fetch())
    $Messages = $donnees'nb_messages'];
// On calcule le nombre de pages à créer  
$Pages = ceil($Messages / $MessagesPerPage);  

// On récupère les 3 dernières news 

if (isset($_GET'page']))  
{  
    $page = $bdd->quote($_GET'page']); // On récupère le numéro de la page indiqué dans l'adresse ( exemple news.php?page=4)  
}  
else // si non la variable n'existe pas, c'est la première fois qu'on charge la page  
{  
    $page = 1; // On affiche la page 1, la page par defaut  
}  
$firstmessage = ($page - 1) * $MessagesPerPage;
echo '<br>Page '.$page.'<br>';
$reponse_news = $bdd->query('SELECT * FROM news WHERE categorie="Séries" ORDER BY id DESC LIMIT '.$firstmessage.', '.$MessagesPerPage.'');  
//si il y a quelque chose
var_dump($reponse_news);
if ($reponse_news->RowCount() > 0){
    //on affiche le résultat        
    while ($donnees_news_news = $reponse->fetch()){
        ?>   
        <div class="news">
            <span class="cat_date">
             <?php
            //si la miniature existe, on l'affiche
            if(!empty($donnees_news'miniature'])){
                echo '<img alt="'.$donnees_news'titre'].'" src="'.$donnees_news'miniature'].'" style="float:left;margin:5px 10px;" />';
            }
            ?>
            <em><?php  
            echo stripslashes($donnees_news'categorie']); //on recupère catégorie ?>,</em> le <?= date('d/m/Y à H\hi', strtotime($donnees_news'date'])); //on recupère la date ?> <BR></span>
            <span class="titre_news"><a href="news.html?id=<?= $donnees_news'id']; ?>"><?= stripslashes($donnees_news'titre']); //on recupère titre ?> </a> </span><br />
            <div class="intro"> <?php  
                $introduction = nl2br(stripslashes($donnees_news'introduction']));  
                echo $introduction;    
            ?> </div>
            <div class="hr"></div><br />
        </div> 
    <?php   
    } // Fin de la boucle des news  
}//fin du if(mysql_num_rows($result) != 0){
//si il n'y a rien
else{
    echo 'Aucunes données!';
}
    // fin du else
?> 
<div class="pages">
<?php
echo 'Page : ';  
for ($i = 1 ; $i <= $Pages ; $i++)  
{  
    echo '<a href="news-series.html?page=' . $i . '">' . $i . '</a> ';  
} 
?>
</div>
    <br /><br/>

    </section>
<?php include('footer.php'); ?>
    </div>
   </body>
</html>

Qu'affiche Page et ce qui suit ? (echo de la ligne 58 et le var_dump() de la ligne 61)

fanweb
Auteur

Je viens de le tester et voila ce qu'il m'affiche:

Page 1
object(PDOStatement)#2 (1) { "queryString"]=> string(73) "SELECT * FROM news WHERE categorie="Séries" ORDER BY id DESC LIMIT 0, 10" }

Par contre si je clique sur une page, il m'affiche ca:

Page '1'
bool(false)
Fatal error: Call to a member function RowCount() on a non-object in /home/u621129814/public_html/news-series.html on line 63

Merci d'avance pour votre aide,

fanweb
Auteur

Ah géniale! ca marche! Enfin... Merci beaucoup

Encore une chose, le fait qu'il n'affiche pas le nombre exacte de pages, le problème vient de la récupération du nombre total de pages?

Parce qu'il m'affiche 9 pages alors qu'il n'y a que 3 pages en réalité. A partir de la page 4, il m'affiche aucune données (logique vu qu'il n'y a rien a partir de cette page).
Et il m'affiche la même chose dans les autres fichiers où j'ai mis en place la pagination... (Cette problème était déjà là)

Merci d'avance

Je pense que cela viens de la requête car vous demander d'afficher la catégorie 'Séries' mais pour le comptage, vous demandez tout.

fanweb
Auteur

Comment je dois faire alors?

Je dois compter uniquement les pages de la catégorie?

fanweb
Auteur

J'ai l'impression que ca marche...

J'ai juste rajouté la catégorie à cette partie du code:

$reponse = $bdd->query('SELECT COUNT(*) AS nb_messages FROM news WHERE categorie = "Séries"');

Génial!

Merci pour vos réponses et pour m'avoir aidé.