Page 1 sur 1

modification d'un script en pdo

Posté : 16 janv. 2017, 22:20
par pacphil
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());
    }
}
?>

Re: modification d'un script en pdo

Posté : 17 janv. 2017, 09:48
par moogli
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).

@+

Re: modification d'un script en pdo

Posté : 18 janv. 2017, 23:37
par pacphil
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;

Re: modification d'un script en pdo

Posté : 19 janv. 2017, 12:16
par moogli
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 ?

@+

Re: modification d'un script en pdo

Posté : 19 janv. 2017, 21:20
par pacphil
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

Re: modification d'un script en pdo

Posté : 20 janv. 2017, 09:22
par Spols
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.

Re: modification d'un script en pdo

Posté : 21 janv. 2017, 01:42
par pacphil
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'];

Re: modification d'un script en pdo

Posté : 23 janv. 2017, 09:13
par Spols
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