Fonction récupérer ID ne fonctionne pas

WRInaute discret
Bonjour,

Je me prends la tête à installer un script de vote sur mon forum phpBB3 Séo.

Grâce à l'aide de WRI j'arrive au bout, c'est presque parfait, il reste une dernière chose qui ne fonctionne pas, la récupération de l'ID de la personne qui vote.

Je la récupère ainsi :

Code:
//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();

Ensuite je me connecte à la db puis j'enregistre les diverses résultats en db :

Code:
//Connexion à la base de données
mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
//Vérification d'accès à la base de données
mysql_select_db("$nom_de_la_base")  or die ('Erreur :'.mysql_error());


//Fonction pour la notation
function notation($id_vote,$ip_vote){

    //L'utilisateur a t'il déja voté?
    $deja_voter = mysql_query("SELECT ip FROM note WHERE ip = '".mysql_real_escape_string($ip_vote)."' AND id_page = '".mysql_real_escape_string($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 (id_page, note, ip) VALUES ('$id_vote', '$note', '$ip_vote') ");
		mysql_query($req); 
							
        //Si il y a une erreur
        if(!$insert) {
            die('Requête invalide : ' . mysql_error());
        }
        //Tout est ok, on informe et on redirige
        else{
 
            echo 'Merci d\'avoir note cet article! <br/>         Chargement en cours <img alt="Loading" src="images/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>';
 
        }
    }

Pour tester le cript, étant chez Free, j'ai voulu voter une seconde fois en passant par un proxy.
Impossible de voter à nouveau malgré une nouvelle ip.

J'ouvre la db et je constate ceci :



La colonne ip est vide, rien ne s'y enregistre et je ne comprends pas pourquoi ??
Si vous pouviez m'aider à comprendre.

Merci

Page test si vous voulez essayer de voter derrière moi : -http://www.ceinfo.fr/Forum/carpaccio-de-noix-de-saint-jacques-et-saumon-frais-t360.html
 
WRInaute accro
Remplace ça :
Code:
//Ip utilisateur
$ip_vote = getIp();
part ça
Code:
//Ip utilisateur
$ip_vote = $_SERVER['REMOTE_ADDR'];
et regarde si ta base enregistre une ip déjà. Si oui c'est que ta fonction getIP() est branque.
 
WRInaute discret
Bonjour,


et regarde si ta base enregistre une ip déjà.
Non, toujours rien d'enregistré côté IP. :(

Structure de la table:

Code:
CREATE TABLE IF NOT EXISTS `note` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_page` int(11) NOT NULL,
  `note` int(11) NOT NULL,
  `ip` varchar(15) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
 
WRInaute discret
On ne peut pas éditer alors je poursuis.

Je m'aperçois aussi que le message :

echo 'Merci d\'avoir noté cet article!<br/>


N'apparaît pas juste après la fonction d'insertion de l'ip.
Une erreur sur le script qui empêcherait la fin de son exécution ?

Code:
    //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 (id_page, note, ip) VALUES ('$id_vote', '$note', '$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 note cet article! <br/>         Chargement en cours <img alt="Loading" src="images/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>';
 
        }
    }

A noter que j'ai dû déplacer une partie du code dans le overall_header à cause de la création des cookies :

De

Code:
<?php
    session_start();
    include('fonctions-vote.php');
?>

Je déplace le code des cookies ici, ce qui fait :

Code:
<?php
    session_start();
    include('fonctions-vote.php');

    //On créer un cookie d'une duréé de 20 secondes pour éviter les retours en arrière
    if(isset($_POST['note']) && $_POST['note'] != NULL){
        setcookie('deja_voter',$id_transmit,(time() + 20));
    }
?>

Je ne sais pas si c'est important.
 
WRInaute passionné
J'imagine que ton appel à notation() envoie un second paramètre vide, mais on ne voit pas cette partie du code...
 
WRInaute passionné
Hello,

Tu as peut-être mal mis les guillemets, essaie comme ça :
PHP:
<span class="syntaxdefault">$insert </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> mysql_query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'INSERT INTO note (id_page, note, ip) VALUES (" '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$id_vote</span><span class="syntaxkeyword">.</span><span class="syntaxstring">' ", " '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$note</span><span class="syntaxkeyword">.</span><span class="syntaxstring">' ", " '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$ip_vote</span><span class="syntaxkeyword">.</span><span class="syntaxstring">' ") '</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span>
Avec la colorisation du code tu te rends compte facilement si les guillemets sont bien mis.
 
WRInaute discret
Et non, toujours pas d'IP.
La colonne est construite ainsi :
Code:
	ip	varchar(15)	latin1_bin

C'est bon ça pour l'enregistrement d'une ip ?
 
WRInaute passionné
C'est justement ce que j'allais te dire, essaie d'en enregistrer une à la main dans ta BDD pour voir si le format est bon (mais varchar accepte tout normalement...)

Sinon fais un echo de tes différentes variables avec ta mysql_query, tu verras déjà si ta variable $ip_vote contient quelque chose ou si elle est vide
 
WRInaute discret
Alors si j'entre mon ip manuellement elle s'enregistre sans problème.

Je suis pas très à l'aise avec mysql, tu peux m'expliquer comment on fait un echo, comme ça en même temps j'apprends.
 
WRInaute passionné
PHP:
<span class="syntaxdefault"></span><span class="syntaxkeyword">echo&nbsp;</span><span class="syntaxstring">"ID&nbsp;vote&nbsp;:"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$id_vote</span><span class="syntaxkeyword">.</span><span class="syntaxstring">"<br/>"</span><span class="syntaxkeyword">;<br />echo&nbsp;</span><span class="syntaxstring">"Note&nbsp;:"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$note</span><span class="syntaxkeyword">.</span><span class="syntaxstring">"<br/>"</span><span class="syntaxkeyword">;<br />echo&nbsp;</span><span class="syntaxstring">"IP&nbsp;vote&nbsp;:"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$id_vote</span><span class="syntaxkeyword">.</span><span class="syntaxstring">"<br/>"</span><span class="syntaxkeyword">;&nbsp;</span><span class="syntaxdefault"></span>
Met ça avant ton mysql_query, ça affichera le contenu des variables, tu verras si ton ip est vide ou pas et tu sauras où situer le problème comme ça
 
WRInaute discret
Ca n'affiche aucun résultat, regarde -http://www.ceinfo.fr/Forum/pizza-vegetarienne-t405.html
Pour l'IP je veux bien mais le reste la note, la l'id page et l'id du votant je le collecte bien dans ma db.

Exemple :

 
WRInaute passionné
Donc ta variable est bonne, ta BDD est bonne, ta query est bonne... dsl mais là je sèche ! Bonne chance ;)
 
WRInaute impliqué
Peut-être parce que tu définis ta variable comme étant $iP_vote:
Code:
$ip_vote = getIp();

Et que ensuite tu la perds et tu ne l'as plus quand tu lances la fonction Notation()

Le problème on ne voit pas où tu lances ta fonction notation()

Car clairement le problème vient de là. Tu définis une variable $ip_vote que tu arrives à lire et ensuite tu la perds certainement parce que tu utilises un mauvais nom de variable ensuite.

Quand tu lances la fonction notation(), juste avant celle-ci fait simplement:
Code:
echo '->'.$ip_vote;

Le fait que tu récupères les autres valeurs du formulaire est normal car tu les définis dans la fonction même donc pour moi c'est l'appel de la fonction et du premier paramètre qui est mauvais.

@LAMBI:
Cette notation:
Code:
$insert = mysql_query("INSERT INTO note (id_page, note, ip) VALUES ('$id_vote', '$note', '$ip_vote') ");

est tout à fait correcte en PHP. PHP interprète les variables précédées d'un $ dans une chaîne encapsulée par des doubles quottes (pas les simples).
La seule chose qui me gênerait ici est le fait de mettre des simple quottes autour des variables id_vote et note car elles sont définies comme des types ENTIER. A partir de là, les simples quottes autour sont inutiles. Pour l'IP c'est normal, c'est bien un VARCHAR.
 
WRInaute discret
Merci, en te lisant j'ai trouvé l'idée de perdre la requête intéressante alors j'ai relu mon script et bingo !

Un mauvais copier/coller ou j'ai été distrait, enfin bref effectivement j'appelai la fonction 2 fois dans la même page.

J'ai corrigé et ça marche parfaitement.

Merci. :D
 
Discussions similaires
Haut