modification d'un script en pdo

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : modification d'un script en pdo

Re: modification d'un script en pdo

par Spols » 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

Re: modification d'un script en pdo

par pacphil » 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'];

Re: modification d'un script en pdo

par Spols » 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.

Re: modification d'un script en pdo

par pacphil » 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

Re: modification d'un script en pdo

par moogli » 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 ?

@+

Re: modification d'un script en pdo

par pacphil » 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;

Re: modification d'un script en pdo

par moogli » 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).

@+

modification d'un script en pdo

par pacphil » 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());
    }
}
?>