Fatal error: Uncaught Error: Call to a member function query()
- Accueil
- Forum
- Programmation
- PHP
- Fatal error: Uncaught Error: Call to a member function query()
Nephilme Le 25 mars 2017 à 01:08 (Édité le 25 janvier 2019 à 17:53)
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 Le 25 mars 2017 à 08:48 (Édité le 1 janvier 1970 à 01:00)
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 Le 25 mars 2017 à 10:45 (Édité le 1 janvier 1970 à 01:00)
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 Le 25 mars 2017 à 17:17 (Édité le 25 mars 2017 à 17:18)
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 Le 25 mars 2017 à 17:41 (Édité le 1 janvier 1970 à 01:00)
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 Le 25 mars 2017 à 20:17 (Édité le 1 janvier 1970 à 01:00)
// 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 Le 25 mars 2017 à 21:55 (Édité le 1 janvier 1970 à 01:00)
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 Le 25 mars 2017 à 22:33 (Édité le 1 janvier 1970 à 01:00)
Mon ip change très souvent.
Jai pas regarder ton code mais je le dis au cas ou.
Zbuu Le 25 mars 2017 à 23:17 (Édité le 1 janvier 1970 à 01:00)
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 Le 26 mars 2017 à 00:35 (Édité le 1 janvier 1970 à 01:00)
<?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 Le 26 mars 2017 à 01:11 (Édité le 1 janvier 1970 à 01:00)
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 Le 26 mars 2017 à 01:43 (Édité le 1 janvier 1970 à 01:00)
L'erreur est toujours la même 😭
Zbuu Le 26 mars 2017 à 03:12 (Édité le 26 mars 2017 à 03:13)
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 Le 26 mars 2017 à 14:12 (Édité le 1 janvier 1970 à 01:00)
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 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 :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'INSERT INTO note(id, id_vote, note, ip_vote)
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 Le 27 mars 2017 à 00:20 (Édité le 1 janvier 1970 à 01:00)
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 Le 31 mars 2017 à 14:18 (Édité le 31 mars 2017 à 14:20)
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 ..