Fatal error: Uncaught Error: Call to a member function query()

Nephilme

Nephilme Le 25 mars 2017 à 01:08 (Édité le 25 janvier 2019 à 17:53)

Bonsoir à tous,
Voilà ce qui s'affiche sur ma page : Fatal error: Uncaught Error: Call to a member function query() on null et voilà la partie qui plante :
try
{
    // On se connecte à MySQL
$bdd = new PDO('mysql:host=xxx.mysql.db;dbname=xxx', 'xxx', 'xxx');
}
catch(Exception $e)
{
    // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}
    
    //Fonction pour la notation
    function notation($id_vote,$ip_vote){
        
        //L'utilisateur a t'il déjà voté?
        $deja_voter = $bdd->query('SELECT ip FROM note WHERE ip = '.$ip_vote.' AND id_page = '.$id_vote.'');

et la ligne précisément :
$deja_voter = $bdd->query('SELECT ip FROM note WHERE ip = '.$ip_vote.' AND id_page = '.$id_vote.'');
Je vous remercie d'avance ! ++
TheOldNoob

TheOldNoob Le 25 mars 2017 à 08:48

Salut Nephilme,

Tu les rempli ou tes arguments $ip_vote et $id_vote? 
Car pour moi, ils sont vide, donc se sont des booleen, ce qui veux dire que dans ta requête, tu cherche ça correspond a ça :

$deja_voter = $bdd->query('SELECT ip FROM note WHERE ip = false AND id_page = false');
Par contre, si tu déclare ta variable ainsi :

function notation($id_vote, $ip_vote = $_SERVER['REMOTE_ADDR'])
tu va récupérer l'ip de l'utilisateur. Donc il pourra comparé avec une ip déjà dans ta base de donné.

Pour ton argument id, je pense que tu doit le faire avec des cookies que tu récupére au moment de la connexion de ton utilisateur.


Voilà, après j'ai pas tout ton code, et je sais pas quel est son utilité, donc je fait que supputer 😀
Nephilme

Nephilme Le 25 mars 2017 à 10:45

Hello !
Le code a pour but de permettre à n'importe quel visiteur ou membre de voter ( une seul fois / article ) en retenant son adresse IP / id de la page.
Voici mon code au complet :
 <?php   
    //Fonction pour l'ip
    function getIp()
    {
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $ip_vote = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        elseif(isset($_SERVER['HTTP_CLIENT_IP']))
        {
            $ip_vote = $_SERVER['HTTP_CLIENT_IP'];
        }
        else
        {
            $ip_vote = $_SERVER['REMOTE_ADDR'];
        }
        return $ip_vote;
    }
    //Ip utilisateur
    $ip_vote = getIp();

    try
{
    // On se connecte à MySQL
$bdd = new PDO('mysql:host=xxxx.mysql.db;dbname=xxx', 'xxxx', 'xxxx');
}
catch(Exception $e)
{
    // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}
    
    //Fonction pour la notation
    function notation($id_vote,$ip_vote){
        
        //L'utilisateur a t'il déjà voté?
        $deja_voter = $bdd->query('SELECT ip FROM note WHERE ip = '.$ip_vote.' AND id_page = '.$id_vote.'');
        
        //L'utilisateur n'a pas voté, on montre le formulaire
        if(mysql_num_rows($deja_voter) == 0)
        {
            echo '<form name="monform" id="monform" method="post">
            <label>Noter cet article</label>
            <select name="note" onchange="javascript:submit(this)">
            <option value="">Note</option>
            <option value="0">0</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            </select>
            </form>';
        }   
        
        //Si action de valider et que la note est différent de vide
        if(isset($_POST['note']) && $_POST['note'] != NULL){
            //On vérifie si le cookie existe et si tel est le cas, c'est que l'utilisateur tente de voter plusieurs fois
            if(isset($_COOKIE["deja_voter"]) && $_COOKIE["deja_voter"] == $id_vote){
                die ("Un seul vote autorisé ... merci!");
            }
            //Note de l'utilisateur
            $note = $_POST['note'];
            //Insertion en BDD
            $insert = mysql_query("INSERT INTO note VALUES ( '', '".mysql_real_escape_string($id_vote)."', '".mysql_real_escape_string($note)."', '".mysql_real_escape_string($ip_vote)."' ) ");
            //Si il y a une erreur
            if(!$insert) {
                die('Requête invalide : ' . mysql_error());
            }
            //Tout est ok, on informe et on redirige
            else{
                //On créer un cookie d'une durée de 20 secondes pour éviter les retours en arrière
                setcookie('deja_voter',$id_vote,(time() + 20));
                
                echo 'Merci d\'avoir noté cet article!<br/>
                Chargement en cours <img alt="Loading" src="images-vote/loading.gif" style="width:32px;height:32px;"/>
                <script type="text/javascript">
                document.getElementById("monform").innerHTML = "";
                window.setTimeout(function(){self.location.href="'.$_SERVER['REQUEST_URI'].'";},3000);
                </script>';
            }
        }
        
        //Combien d'utilisateurs ont votés?
        $nombre_vote = mysql_query("SELECT id FROM note WHERE id_page = '".mysql_real_escape_string($id_vote)."'");
        $total_vote = mysql_num_rows($nombre_vote);
        if($total_vote != 0){
            echo 'Nombre de vote : '.$total_vote.'<br/>';
        }
        
        //Total des votes des utilisateurs
        $calcul_vote = mysql_query("SELECT SUM(note) AS totalmoyenne FROM note WHERE id_page = '".mysql_real_escape_string($id_vote)."'");
        $data = mysql_fetch_array($calcul_vote);
        $total_calcul_vote = $data['totalmoyenne'];
        if($total_calcul_vote != 0){
            echo 'Total des votes : '.$total_calcul_vote.'<br/>';   
        }
        
        //Moyenne des votes des utilisateurs
        if($total_vote != NULL && $total_calcul_vote != NULL){
            $moyenne = number_format($total_calcul_vote/$total_vote, 2, ',', '');
            //Si les 2 chiffres après la virgule sont 2 zéros, on les suppriment pour obtenir un entier
            echo 'Note : '.str_replace(',00','',$moyenne).'/5';
            //On affiche les étoiles
            for($i=1; $i<=$moyenne;$i++){
                echo '<img alt="'.$i.'" src="images-vote/etoile.png" style="width:32px;height:32px;"/>';
            }
        }
        else{
            echo 'Aucun vote pour le moment.';
        }
    }
?>
Bien sur il y a plusieurs erreurs car le code n'est pas encore à jours, je le change avec la PDO a mesure que j'avance dans les erreurs, car ca me permettra aussi d'apprendre à remplacer mysql par la PDO, mais ce code avant marchait sans problèmes
Zbuu

Zbuu Le 25 mars 2017 à 17:17 (Édité le 25 mars 2017 à 17:18)

Yop, 

Je pense que le problème viens du fait que ta fonction ne peut pas accéder à ton instance pdo. 

Plusieurs manière d'accéder a ta base de donnée dans une fonction : 

Avec global $bdd : 

function notation($id_vote, $ip_vote = $_SERVER['REMOTE_ADDR']) {
   global $bdd; 
   // Ta requête et le reste du code...
}
En passant ta bdd en paramêtre : 
function notation($bdd, $id_vote, $ip_vote = $_SERVER['REMOTE_ADDR']) {
   // Ta requête et le reste du code... 
}
Ensuite pour ta requête tu as un problème de quote je crois essaye plutôt (et sans oublier de faire un fetch, si tu veux récupéré des données) :

$deja_voter = $bdd->query("SELECT ip FROM note WHERE ip = '$ip_vote' AND id_page = '$id_vote'")->fetch();
 Mais attention, il est préférable de faire une requête préparé lorsque tes utilisateurs pourrait modifier les variables 

Une requête préparé : 

$q = $bdd->prepare("SELECT ip FROM note WHERE ip = :ip AND id_page = :id");
$q = $bdd->execute([
   ':ip' => $ip_vote,
   ':id' => $id_vote
]);
$deja_voter = $q->fetch();
$q->closeCursor();

Nephilme

Nephilme Le 25 mars 2017 à 17:41

Salut Zbuu !
Je viens d'utiliser ce que tu viens de me dire, du moins la première partie afin de passer la bdd dans la fonction, et il me retourne sur la page : " Fatal error : Constant expression contains invalid operations "
Zbuu

Zbuu Le 25 mars 2017 à 20:17

oups c'est a cause du $_SERVER['REMOTE_ADDR'] qui est passé en paramètres j'ai fais copier/coller sur @TheOldNoob sans faire attention

// Avec le global $bdd 
function notation($id_vote, $ip_vote) {
   global $bdd;
   $q = $bdd->prepare("SELECT ip FROM note WHERE ip = :ip AND id_page = :id");
   $q = $bdd->execute([
      ':ip' => $ip_vote,
      ':id' => $id_vote
   ]);
   $deja_voter = $q->fetch();
   $q->closeCursor();
   // Ton code...
}

// OU avec $bdd en parametre 
function notation($bdd, $id_vote, $ip_vote) {
   $q = $bdd->prepare("SELECT ip FROM note WHERE ip = :ip AND id_page = :id");
   $q = $bdd->execute([
      ':ip' => $ip_vote,
      ':id' => $id_vote
   ]);
   $deja_voter = $q->fetch();
   $q->closeCursor();
   // Ton code...
}
Nephilme

Nephilme Le 25 mars 2017 à 21:55

Je suis abonné aux fatal error 😭..
Voilà l'erreur qui m'est transmise : Fatal error: Uncaught Error: Call to undefined method PDO::execute()
Je ne vois pourquoi la method execut ne marcherais pas ..?
Voilà mon code avec la modification si ca peu aider !
<?php
//Fonction pour l'ip
    function getIp()
    {
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $ip_vote = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        elseif(isset($_SERVER['HTTP_CLIENT_IP']))
        {
            $ip_vote = $_SERVER['HTTP_CLIENT_IP'];
        }
        else
        {
            $ip_vote = $_SERVER['REMOTE_ADDR'];
        }
        return $ip_vote;
    }
    //Ip utilisateur
    $ip_vote = getIp();

    try
{
    // On se connecte à MySQL
$bdd = new PDO('mysql:host=xxx.mysql.db;dbname=xxx', 'xxxx', 'xxxx');

    //Fonction pour la notation
function notation($id_vote, $ip_vote) {
    global $bdd;
   $q = $bdd->prepare("SELECT ip FROM note WHERE ip = :ip AND id_page = :id");
   $q = $bdd->execute([
      ':ip' => $ip_vote,
      ':id' => $id_vote
   ]);
   $deja_voter = $q->fetch();
   $q->closeCursor();
        
        //L'utilisateur n'a pas voté, on montre le formulaire
        if(($deja_voter) == 0)
        {
            echo '<form name="monform" id="monform" method="post">
            <label>Noter cet article</label>
            <select name="note" onchange="javascript:submit(this)">
            <option value="">Note</option>
            <option value="0">0</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            </select>
            </form>';
        }   
        
        //Si action de valider et que la note est différent de vide
        if(isset($_POST['note']) && $_POST['note'] != NULL){
            //On vérifie si le cookie existe et si tel est le cas, c'est que l'utilisateur tente de voter plusieurs fois
            if(isset($_COOKIE["deja_voter"]) && $_COOKIE["deja_voter"] == $id_vote){
                die ("Un seul vote autorisé ... merci!");
            }
            //Note de l'utilisateur
            $note = $_POST['note'];
            //Insertion en BDD
            $insert = mysql_query("INSERT INTO note VALUES ( '', '".mysql_real_escape_string($id_vote)."', '".mysql_real_escape_string($note)."', '".mysql_real_escape_string($ip_vote)."' ) ");
            //Si il y a une erreur
            if(!$insert) {
                die('Requête invalide : ' . mysql_error());
            }
            //Tout est ok, on informe et on redirige
            else{
                //On créer un cookie d'une durée de 20 secondes pour éviter les retours en arrière
                setcookie('deja_voter',$id_vote,(time() + 20));
                
                echo 'Merci d\'avoir noté cet article!<br/>
                Chargement en cours <img alt="Loading" src="images-vote/loading.gif" style="width:32px;height:32px;"/>
                <script type="text/javascript">
                document.getElementById("monform").innerHTML = "";
                window.setTimeout(function(){self.location.href="'.$_SERVER['REQUEST_URI'].'";},3000);
                </script>';
            }
        }
        
        //Combien d'utilisateurs ont votés?
        $nombre_vote = mysql_query("SELECT id FROM note WHERE id_page = '".mysql_real_escape_string($id_vote)."'");
        $total_vote = mysql_num_rows($nombre_vote);
        if($total_vote != 0){
            echo 'Nombre de vote : '.$total_vote.'<br/>';
        }
        
        //Total des votes des utilisateurs
        $calcul_vote = mysql_query("SELECT SUM(note) AS totalmoyenne FROM note WHERE id_page = '".mysql_real_escape_string($id_vote)."'");
        $data = mysql_fetch_array($calcul_vote);
        $total_calcul_vote = $data['totalmoyenne'];
        if($total_calcul_vote != 0){
            echo 'Total des votes : '.$total_calcul_vote.'<br/>';   
        }
        
        //Moyenne des votes des utilisateurs
        if($total_vote != NULL && $total_calcul_vote != NULL){
            $moyenne = number_format($total_calcul_vote/$total_vote, 2, ',', '');
            //Si les 2 chiffres après la virgule sont 2 zéros, on les suppriment pour obtenir un entier
            echo 'Note : '.str_replace(',00','',$moyenne).'/5';
            //On affiche les étoiles
            for($i=1; $i<=$moyenne;$i++){
                echo '<img alt="'.$i.'" src="images-vote/etoile.png" style="width:32px;height:32px;"/>';
            }
        }
        else{
            echo 'Aucun vote pour le moment.';
        }
    }
    }
catch(Exception $e)
{
    // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}
    
?>
Balatharas

Balatharas Le 25 mars 2017 à 22:33

A noter que des utilisateurs (comme moi) ont une adresse ip réseau non statique 
Mon ip change très souvent.
Jai pas regarder ton code mais je le dis au cas ou. 
Zbuu

Zbuu Le 25 mars 2017 à 23:17

Décidément aujourd'hui je fais gaffe sur gaffe :( 

Pour exécuter la requête c'est plutôt : 
$q->execute([
    ':ip' => $ip_vote,
    ':id' => $id_vote
]);
Donc ce qui donne au final : 
function notation($id_vote, $ip_vote) {
    global $bdd;
    $q = $bdd->prepare("SELECT ip FROM note WHERE ip = :ip AND id_page = :id");
    $q->execute([
        ':ip' => $ip_vote,
        ':id' => $id_vote
    ]);
    $deja_voter = $q->fetch();
    $q->closeCursor();
   // Ton code....
}
Nephilme

Nephilme Le 26 mars 2017 à 00:35

Après recherches et modification, j'obtiens ceci comme code :
<?php
error_reporting(E_ALL); ini_set('display_errors', '1');

// CONNEXION A LA BDD 

     
    //Variable de connexion BDD
    $nom_du_serveur ="xxx";
    $nom_de_la_base ="xxxx";
    $nom_utilisateur ="xxx";
    $passe ="xxxx";
     
    //Fonction pour l'ip
    function getIp()
    {
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $ip_vote = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        elseif(isset($_SERVER['HTTP_CLIENT_IP']))
        {
            $ip_vote = $_SERVER['HTTP_CLIENT_IP'];
        }
        else
        {
            $ip_vote = $_SERVER['REMOTE_ADDR'];
        }
        return $ip_vote;
    }
    //Ip utilisateur
    $ip_vote = getIp();
//Connexion à la base de données
$bdd = new PDO('mysql:host='.$nom_du_serveur.';dbname='.$nom_de_la_base, $nom_utilisateur, $passe);
//Fonction pour la notation
    function notation($id_vote,$ip_vote){
        global $bdd;
         
        // Recherche si l'utilisateur a déjà voté
        $deja_voter = $bdd->prepare('SELECT ip FROM note ip = :ip ');
        // lie ":ip" de la requête sql à une valeur ( $ip_vote)
        $deja_voter->bindValue(':ip', $ip_vote);
        // execute la requête
        $deja_voter->execute();
  
        //L'utilisateur n'a pas voté, on montre le formulaire
        if($deja_voter->rowCount() == 0)
        {
            echo '<form name="monform" id="monform" method="post">
            <label>Noter cet article</label>
            <select name="note" onchange="javascript:submit(this)">
            <option value="">Note</option>
            <option value="0">0</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            </select>
            </form>';
        }  
          
        //Si action de valider et que la note est différent de vide
        if(isset($_POST['note']) && $_POST['note'] != NULL){
            //On vérifie si le cookie existe et si tel est le cas, c'est que l'utilisateur tente de voter plusieurs fois
            if(isset($_COOKIE["deja_voter"]) && $_COOKIE["deja_voter"] == $id_vote){
                die ("Un seul vote autorisé ... merci!");
            }
            //Note de l'utilisateur
            $note = $_POST['note'];
            //Insertion en BDD
            $insert = $bdd->prepare('INSERT INTO note VALUES (:id_vote, :note, :ip_vote)');
            $insert->bindValue(':id_vote', $id_vote);
            $insert->bindValue(':note', $note);
            $insert->bindValue(':ip_vote', $ip_vote);
            $insert->execute();
             
            //Si il y a une erreur
            if($insert->rowCount() == 0) {
                var_dump($insert);
                die('Aucune ligne n\'a été ajouter dans la base (ligne 54)');
            }
            //Tout est ok, on informe et on redirige
            else{
                //On créer un cookie d'une durée de 20 secondes pour éviter les retours en arrière
                setcookie('deja_voter',$id_vote,(time() + 20));
                  
                echo 'Merci d\'avoir noté cet article!<br/>
                Chargement en cours <img alt="Loading" src="images-vote/loading.gif" style="width:32px;height:32px;"/>
                <script type="text/javascript">
                document.getElementById("monform").innerHTML = "";
                window.setTimeout(function(){self.location.href="'.$_SERVER['REQUEST_URI'].'";},3000);
                </script>';
            }
        }
          
        //Combien d'utilisateurs ont votés?
        $nombre_vote = $bdd->prepare('SELECT id FROM note WHERE id_page = :id_vote');
        $nombre_vote->bindValue(':id_vote', $id_vote);
        $nombre_vote->execute();
 
        if($total_vote = $nombre_vote->rowCount() != 0){
            echo 'Nombre de vote : '.$total_vote.'<br/>';
        }
          
        //Total des votes des utilisateurs
        $somme_vote = $bdd->prepare('SELECT SUM(note) FROM note WHERE id_page = :id_vote');
        $somme_vote->bindValue(':id_vote', $id_vote);
        $somme_vote->execute();
         
        if($total_calcul_vote = $somme_vote->rowCount() != 0){
            echo 'Total des votes : '.$total_calcul_vote.'<br/>';  
        }
          
        //Moyenne des votes des utilisateurs
        if($total_vote != NULL && $total_calcul_vote != NULL){
            $moyenne = number_format($total_calcul_vote/$total_vote, 2, ',', '');
            //Si les 2 chiffres après la virgule sont 2 zéros, on les suppriment pour obtenir un entier
            echo 'Note : '.str_replace(',00','',$moyenne).'/10';
            //On affiche les étoiles
            for($i=1; $i<=$moyenne;$i++){
                echo '<img alt="'.$i.'" src="images-vote/etoile.png" style="width:32px;height:32px;"/>';
            }
        }
        else{
            echo 'Aucun vote pour le moment.';
        }
    }
   ?>
Le code ne semble plus me montrer de "Fatal error", c'est déjà bien 😀 Mais maintenant m'affiche :
object(PDOStatement)#5 (1) { ["queryString"]=>
string(57) "INSERT INTO note VALUES (:id_vote, :note, :ip_vote)"
}
Aucune ligne n'a été ajouter dans la base (ligne 54)

Faut pas oublier de se reposer la tête Zbuu ! 😗 Merci en tout cas pour ton aide
Zbuu

Zbuu Le 26 mars 2017 à 01:11

C'est parce que ta requête n'est pas bonne, tu indiques les valeurs mais tu as oublier d'indiquer les champs 😉

Tu as cette requête : 
$insert = $bdd->prepare('INSERT INTO note VALUES (:id_vote, :note, :ip_vote)');            
$insert->bindValue(':id_vote', $id_vote);            
$insert->bindValue(':note', $note);            
$insert->bindValue(':ip_vote', $ip_vote);            
$insert->execute();
Alors qu'il faudrait plutôt ça :
$insert = $bdd->prepare('INSERT INTO note(id_vote, note, ip_vote) VALUES (:id_vote, :note, :ip_vote)');            
$insert->bindValue(':id_vote', $id_vote);            
$insert->bindValue(':note', $note);            
$insert->bindValue(':ip_vote', $ip_vote);            
$insert->execute();
Nephilme

Nephilme Le 26 mars 2017 à 01:43

Malheureusement ce n'est pas encore ca, malgré que c'est vrai, j'aurais mieux du indiqué les champs !
L'erreur est toujours la même 😭
Zbuu

Zbuu Le 26 mars 2017 à 03:12 (Édité le 26 mars 2017 à 03:13)

Je viens de voir que tu fais un rowCount sur ton $insert et je ne pense pas que ce soit possible

Remplace ça : 
$insert->execute(); 
//Si il y a une erreur            
if($insert->rowCount() == 0) {                
   var_dump($insert);                
   die('Aucune ligne n\'a été ajouter dans la base (ligne 54)');            
}
Par :

//Si il y a une erreur            
if(!$insert->execute()) {                
   var_dump($insert);                
   die('Aucune ligne n\'a été ajouter dans la base (ligne 54)');            
}
Nephilme

Nephilme Le 26 mars 2017 à 14:12

L'erreur est toujours présente, et toujours la même..
Ma bdd contient les champs : id, id_vote, note, ip_vote. Dans mon insert il n'y a que 3 ligne. Est-ce de la que peux venir mon problème ? Malgré ca j'ai essayer d'ajouter l'id justement de différentes façons, tel que :
'INSERT INTO note(id, id_vote, note, ip_vote) VALUES (null, :id_vote, :note, :ip_vote)');

Mais cela ne semble pas fonctionner
Zbuu

Zbuu Le 26 mars 2017 à 23:03 (Édité le 26 mars 2017 à 23:14)

Malgré ca j'ai essayer d'ajouter l'id justement de différentes façons, tel que :
'INSERT INTO note(id, id_vote, note, ip_vote) 
Est ce que ton champ id et en auto_increment ? Si c'est bien le cas alors, il n'est pas nécessaire de l'indiquer dans la requête. Si il n'est pas en auto_increment alors je te conseille de le mettre  

Pour commencer (je ne sais pas pourquoi je n'y ai pas penser avant) on va activer les erreur de PDO.
define('DB_HOST', 'xxxx');
define('DB_NAME', 'xxxx');
define('DB_USER', 'xxxx');
define('DB_PASS', 'xxxx');

try {
    $bdd = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("Erreur : - {$e->getMessage()}");
}
Bien sur tu remplaces les XXXX par tes identifiants  

Maintenant que je connais les champs de ta base de donnée j'ai trouvais d'autre erreur. 

Dans ta requête $deja_vote il manque le WHERE et d’après les champs que tu viens de me dire le champ ip n'existe pas et c'est plutôt le champ ip_vote donc il faut modifier : 
$deja_voter = $bdd->prepare('SELECT ip FROM note ip = :ip ');
Par : 
$deja_voter = $bdd->prepare('SELECT id FROM note WHERE ip_vote = :ip');
Dans ta requête $nombre_vote (toujours d'après les champs que tu ma donné) le champs id_page n'existe pas et donc ce serait plutôt le champ id_vote. Modifie donc 

$nombre_vote = $bdd->prepare('SELECT id FROM note WHERE id_page = :id_vote');
Par 
$nombre_vote = $bdd->prepare('SELECT id FROM note WHERE id_vote = :id_vote');
Dans ta requête $somme_vote tu t'es trompé de champs. Modifie : 
$somme_vote = $bdd->prepare('SELECT SUM(note) FROM note WHERE id_page = :id_vote');
Par : 
$somme_vote = $bdd->prepare('SELECT SUM(note) FROM note WHERE id_vote = :id_vote');
Nephilme

Nephilme Le 27 mars 2017 à 00:20

C'est ça ! J'avais pas fais attention au nom, j'ai du me perdre entre les $id_vote et les :id_vote etc... Waw ! Merci beaucoup, je n'ai plus d'erreur  !! Du moins d'inscrite !
Maintenant quand je fais un vote, il ne m'est afficher que "1" au lieu de '4' par exemple si j'ai voter '4', et place 2x la note en bdd mais sous différentes id ( forcement ).
Je vais voir un peu de mon coté d'ou viens ce problème, et puis si jamais, je reviendrais pour demandez une nouvelle fois de l'aide !
Merci encore !
Bladoom

Bladoom Le 31 mars 2017 à 14:18 (Édité le 31 mars 2017 à 14:20)

Bonjour ! Je me permet de relancer le sujet car je suis bloquer au même niveau
J'ai donc voulu ajouter un script à une de mes pages, celui ci n'étant pas encore coder en PDO, j'ai commencer à le modifier tout en suivant la discussion.
Voila le code :
<?php       function getIp()
    {
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $ip_vote = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        elseif(isset($_SERVER['HTTP_CLIENT_IP']))
        {
            $ip_vote = $_SERVER['HTTP_CLIENT_IP'];
        }
        else
        {
            $ip_vote = $_SERVER['REMOTE_ADDR'];
        }
        return $ip_vote;
    }
    //Ip utilisateur
    $ip_vote = getIp();
//Connexion à la base de données
//Fonction pour la notation
    function notation($id_vote,$ip_vote){
        global $bdd;
              define('DB_HOST', 'xxxxx');
define('DB_NAME', 'xxxxx');
define('DB_USER', 'xxxxx');
define('DB_PASS', 'xxxxx');

try {
    $bdd = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("Erreur : - {$e->getMessage()}");
}
        // Tu recherche si l'utilisateur a déjà voté
        $deja_voter = $bdd->prepare('SELECT ip FROM note WHERE ip = :ip AND id_page = :idp ');
        // lie ":ip" de ta requête sql à une valeur ( $ip_vote)
        $deja_voter->bindValue(':ip', $ip_vote);
        $deja_voter->bindValue(':idp', $id_vote);
        // execute ta requête
        $deja_voter->execute();
  
        //L'utilisateur n'a pas voté, on montre le formulaire
        if($deja_voter->rowCount() == 0)
        {
            echo '<form name="monform" id="monform" method="post">
            <label>Noter cet article</label>
            <select name="note" onchange="javascript:submit(this)">
            <option value="">Note</option>
            <option value="0">0</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            </select>
            </form>';
        }  
          
        //Si action de valider et que la note est différent de vide
        if(isset($_POST['note']) && $_POST['note'] != NULL){
            //On vérifie si le cookie existe et si tel est le cas, c'est que l'utilisateur tente de voter plusieurs fois
            if(isset($_COOKIE["deja_voter"]) && $_COOKIE["deja_voter"] == $id_vote){
                die ("Un seul vote autorisé ... merci!");
            }
            //Note de l'utilisateur
            $note = $_POST['note'];
            //Insertion en BDD
$insert = $bdd->prepare('INSERT INTO note(id_page, note, ip) VALUES (:idp, :note, :ip)');            
$insert->bindValue(':idp', $id_vote);            
$insert->bindValue(':note', $note);            
$insert->bindValue(':ip', $ip_vote);            
$insert->execute();
             
            //Si il y a une erreur
            if(!$insert->execute()) {                
   var_dump($insert);                
   die('Aucune ligne n\'a été ajouter dans la base (ligne 54)');            
}
            //Tout est ok, on informe et on redirige
            else{
                //On créer un cookie d'une durée de 20 secondes pour éviter les retours en arrière
                setcookie('deja_voter',$id_vote,(time() + 20));
                  
                echo 'Merci d\'avoir noté cet article!<br/>
                Chargement en cours <img alt="Loading" src="images-vote/loading.gif" style="width:32px;height:32px;"/>
                <script type="text/javascript">
                document.getElementById("monform").innerHTML = "";
                window.setTimeout(function(){self.location.href="'.$_SERVER['REQUEST_URI'].'";},3000);
                </script>';
            }
        }
          
        //Combien d'utilisateurs ont votés?
        $nombre_vote = $bdd->prepare('SELECT id FROM note WHERE id_page = :idp');
        $nombre_vote->bindValue(':idp', $id_vote);
        $nombre_vote->execute();
        $total_vote = $nombre_vote;
        if($total_vote = $nombre_vote->rowCount() != 0){
            echo 'Nombre de vote : '.$total_vote.'<br/>';
        }
          
        //Total des votes des utilisateurs
        $somme_vote = $bdd->prepare('SELECT SUM(note) AS totalmoyenne FROM note WHERE id_page = :idp');
        $somme_vote->bindValue(':idp', $id_vote);
        $somme_vote->execute();
        
        if($total_calcul_vote = $somme_vote->rowCount() != 0){
            echo 'Total des votes : '.$total_calcul_vote.'<br/>';  
        }
          
        //Moyenne des votes des utilisateurs
        if($total_vote != NULL && $total_calcul_vote != NULL){
            $moyenne = number_format($total_calcul_vote/$total_vote, 2, '', '');
            //Si les 2 chiffres après la virgule sont 2 zéros, on les suppriment pour obtenir un entier
            echo 'Note : '.str_replace(',00','',$moyenne).'/5';
            //On affiche les étoiles
            for($i=1; $i<=$moyenne;$i++){
                echo '<img alt="'.$i.'" src="images-vote/etoile.png" style="width:32px;height:32px;"/>';
            }
        }
        else{
            echo 'Aucun vote pour le moment.';
        }
    }
   ?>
Seulement, quand je vote, cela m'ajoute 2fois dans la bdd le vote transmit, puis affiche 1/5 alors que la note devrais être de 4*.
J'ai essayer de le refaire en le comparant à l'ancienne version mais je ne vois pas ou je peu mal faire fonctionner ce système ..
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte