modification d'un script en pdo

Eléphant du PHP | 257 Messages

16 janv. 2017, 22:20

bonjour un système de vote

l'ancien version
<?php
//Si le référant est vide ou que le nom de domaine est différent de ***, on éjecte
if(empty($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_HOST'] != 'localhost'){
    echo 'Erreur de REFERER ou de HOST!';
    exit();
}

//Variable de connexion BDD *
$nom_du_serveur ="localhost";
$nom_de_la_base ="note";
$nom_utilisateur ="root";
$passe ="";
 
//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());
 
//On récupère les 2 variables qui transitent via la fonction ajax()
$id = (isset($_POST["id"])) ? $_POST["id"] : NULL;
$ip = (isset($_POST["ip"])) ? $_POST["ip"] : NULL;

//Note actuelle
$calcul_note = mysql_query("SELECT SUM(note) AS totalmoyenne FROM note WHERE id_page = '".mysql_real_escape_string($id)."'");
$data = mysql_fetch_array($calcul_note);
$note_actuelle = $data['totalmoyenne'];
//Si aucun vote
if($note_actuelle == NULL){
    $note_actuelle = 0;
}
//Si la note est supérieure ou égal à 1 on affiche le signe +
if($note_actuelle>=1){
    echo '+';
}
//On affiche la note actuelle
echo $note_actuelle;
 
//On affiche la note actuelle
echo $note_actuelle;

//on vérifie si l'utilisateur à déjà voté
$deja_voter = mysql_query("SELECT ip FROM note WHERE ip = '".mysql_real_escape_string($ip)."' AND id_page = '".mysql_real_escape_string($id)."'");
$resultat = mysql_fetch_array($deja_voter);
/*Si tel est le cas on affiche un mot ("dv" pour déjà voté) qui sera récupéré par xhr.responseText de la fonction ajax. Cet élément permettra de montrer ou pas le système de vote à l'utilisateur*/
if($resultat != NULL){
    echo 'dv';
}
//L'utilisateur peut voter
if(isset($_POST['note'])){
    //On récupère la note
    $note = (isset($_POST["note"])) ? $_POST["note"] : NULL;
 
    //Insertion en BDD
    $insert = mysql_query("INSERT INTO note VALUES ( '', '".mysql_real_escape_string($id)."', '".mysql_real_escape_string($note)."', '".mysql_real_escape_string($ip)."' ) ");
    //Si il y a une erreur
    if(!$insert) {
        die('Requête invalide : ' . mysql_error());
    }
}
?>
Versions PHP PDO j'ai des erreur dans les select et insert une petite aide serais la bien venue
<?PHP
require("function.php");
$connection = connexion_db ();
header('Content-type: text/html; charset=UTF-8');
//Si le référant est vide ou que le nom de domaine est différent de ***, on éjecte
/*if(empty($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_HOST'] != 'localhost'){
    echo 'Erreur de REFERER ou de HOST!';
    exit();
}*/

		
//On récupère les 2 variables qui transitent via la fonction ajax()
$id = (isset($_POST["id"])) ? $_POST["id"] : NULL;
$ip = (isset($_POST["ip"])) ? $_POST["ip"] : NULL;
//Note actuelle
$calcul_note = $connection->prepare('SELECT SUM(note) AS totalmoyenne FROM note WHERE id_page=:id_page');
if($calcul_note->execute(array(':id_page'=> $id))){
$note_actuelle = $calcul_note->fetchColumn();
}
//Si aucun vote
if($note_actuelle == NULL){
    $note_actuelle = 0;
}
//Si la note est supérieure ou égal à 1 on affiche le signe +
if($note_actuelle>=1){
    echo '+';
}
//On affiche la note actuelle
echo $note_actuelle;
 
//On affiche la note actuelle
echo $note_actuelle;

//on vérifie si l'utilisateur à déjà voté
      $deja_voter = $connection->prepare('SELECT ip FROM note WHERE ip=:ip AND id_page=:id');  
      $deja_voter->execute(array(':ip'=>$ip,':id'=>$id));      
      $resultat = $deja_voter->fetchColumn(); 
/*Si tel est le cas on affiche un mot ("dv" pour déjà voté) qui sera récupéré par xhr.responseText de la fonction ajax. Cet élément permettra de montrer ou pas le système de vote à l'utilisateur*/
if($resultat != NULL){
    echo 'dv';
}
 //L'utilisateur peut voter
if(isset($_POST['note'])){
    //On récupère la note
    $note = (isset($_POST["note"])) ? $_POST["note"] : NULL;
 
    //Insertion en BDD
	 $insert_prep = $connection->prepare("INSERT INTO note  (id_page,note,ip) VALUES(:id_page, :note, :ip");       
     $inser_exec = $insert_prep->execute(array(':id_page'=>$id,
		                                       ':note'=> $note,
											   ':ip'=>$ip));  

    if(!$inser_exec) {
        die('Requête invalide : ' . mysql_error());
    }
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 janv. 2017, 09:48

salut,

C'est bien de fournir les messages d'erreurs cela évite de prendre pas mal de temps a tous décortiquer, on peu aller directement la où ça coince (il y a la ligne qui pose problème dans le message).

le code est syntaxiquement correct. les messages d'erreur devrait aider.

le create table de la table note et un jeux de données de test (même bidon) serait aussi bienvenu si tu souhaites que l'on puisse tester :)

Pense à ajouter l'emploie de la méthode closeCursor() (sur ton PDOStatement) afin de libérer la mémoire (entre autre).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 257 Messages

18 janv. 2017, 23:37

bonjour une erreur de calcul à la sortie de la table je fait un seule vote normalement la valeur $note_actuelle devrais être de 1 et elle m'affiche 11
$calcul_note = $connection->prepare('SELECT SUM(note) AS totalmoyenne FROM note WHERE id_page=:id_page');
$calcul_note->execute(array(':id_page'=> $id));
$res= $calcul_note->fetch();
$note_actuelle = $res['totalmoyenne'];
//Si aucun vote
if($note_actuelle == NULL){
    $note_actuelle = 0;
}
//Si la note est supérieure ou égal à 1 on affiche le signe +
if($note_actuelle>=1){
    echo '+';
}
//On affiche la note actuelle
echo $note_actuelle;

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 janv. 2017, 12:16

salut,

la tu fait la somme de la colonne sur toutes les lignes qui ont un id_page = xxx
vu le nombre c'est plutôt que avg que tu souhaites utiliser ?

SELECT AGV(note) AS totalmoyenne FROM note WHERE id_page=:id_page

as tu testé ta requête dans un client SQL ?

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 257 Messages

19 janv. 2017, 21:20

j'ai une autre erreur
//L'utilisateur a t'il déjà voté?
        $calcul_note = $connection->prepare('SELECT `ip` FROM note WHERE id_page=:id_page AND ip=:ip');
        $calcul_note->execute(array(':id_page'=> $id_vote,':ip'=>$ip_vote));
        $res= $calcul_note->fetch();
        $deja_voter  = $res['ip'];
		
		//L'utilisateur n'a pas voté, on montre le formulaire
		if($deja_voter == 0)
		{
Notice: Undefined variable: connection in C:\Program Files\EasyPHP-5.3.8.1\www\source\fonctions-vote.php on line 17

Fatal error: Call to a member function prepare() on a non-object in C:\Program Files\EasyPHP-5.3.8.1\www\source\fonctions-vote.php on line 17

Mammouth du PHP | 1967 Messages

20 janv. 2017, 09:22

PHP t'indique $connection n'est pas défini, il faut donc le définir avant de l'utiliser comme sur le script précédent.

PS si tu filtre ta requète sur ip et que tu cherche à récupèrer cette ip tu sais dèjà ce que tu cherche à savoir.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 257 Messages

21 janv. 2017, 01:42

voila je comprends pas
function get_ip() {
        return (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
        }  		
		$ip_vote  = get_ip();	

	
// On se connecte à MySQL
  $user = 'root';
  $pass = '';
  $base = 'Tchat';
  $bdd  ='localhost';
try {
  $dns = 'mysql:host='.$bdd.';dbname='.$base.'';
  // Options de connection
  $options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
	PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
  );
  $connection = new PDO( $dns, $user , $pass, $options );
} catch ( Exception $e ) {
  echo "Connection à MySQL impossible : ", $e->getMessage();
  die();
}
	
	//Fonction pour la notation
	function notation($id_vote,$ip_vote){

		//L'utilisateur a t'il déjà voté?
        $calcul_note = $connection->prepare('SELECT `ip` FROM note WHERE id_page=:id_page AND ip=:ip');
        $calcul_note->execute(array(':id_page'=> $id_vote,':ip'=>$ip_vote));
        $res= $calcul_note->fetch();
        $deja_voter  = $res['ip'];

Mammouth du PHP | 1967 Messages

23 janv. 2017, 09:13

C'est un problème de portée de variable. une variable créée dans une fonction n'éxiste que dans cette fonction. et inversement, une variable créée hors fonction n'éxiste pas dans cette fonction.

Il te suffirait de l'inclure dabns les paramètres donné à ta fonction pour régler le problème
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube