sqlite vers sql

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 : sqlite vers sql

Re: sqlite vers sql

par juliette » 22 déc. 2011, 13:20

bon, j'ai réussi quelques modifs mais ce create table me pose problème, je vous fait vois le code d'origine:
<?php
class rating{

	public $average = 0;
	public $votes;
	public $status;
	public $table;
	private $path;
	
	function __construct($table){
		try{
			$pathinfo = pathinfo(__FILE__);
			$this->path = realpath($pathinfo['dirname']) . "/database/ratings.sqlite";
			$dbh = new PDO("sqlite:$this->path");
			$this->table = $dbh->quote($table);
			// check if table needs to be created
			$table_check = $dbh->query("SELECT * FROM $this->table WHERE id='1'");
			if(!$table_check){
				// create database table
				$dbh->query("CREATE TABLE $this->table (id INTEGER PRIMARY KEY, rating FLOAT(3,2), ip VARCHAR(15))");
				$dbh->query("INSERT INTO $this->table (rating, ip) VALUES (0, 'master')");				
			} else {
				$this->average = $table_check->fetchColumn(1);
			}
			$this->votes = ($dbh->query("SELECT COUNT(*) FROM $this->table")->fetchColumn()-1);
		}catch( PDOException $exception ){
				die($exception->getMessage());
		}
		$dbh = NULL;		
	}

	function set_score($score, $ip){
		try{
			$dbh = new PDO("sqlite:$this->path");
			$voted = $dbh->query("SELECT id FROM $this->table WHERE ip='$ip'");
			if(sizeof($voted->fetchAll())==0){
				
				$dbh->query("INSERT INTO $this->table (rating, ip) VALUES ($score, '$ip')");
				$this->votes++;
				
				//cache average in the master row
				$statement = $dbh->query("SELECT rating FROM $this->table");
				$total = $quantity = 0;
				$row = $statement->fetch(); //skip the master row
				while($row = $statement->fetch()){
					$total = $total + $row[0];
					$quantity++;
				}
				$this->average = round((($total*20)/$quantity),0);
				$statement = $dbh->query("UPDATE $this->table SET rating = $this->average WHERE id=1");
				$this->status = '(thanks!)';
			} else {
				$this->status = '(already scored)';
			}
			
		}catch( PDOException $exception ){
				die($exception->getMessage());
		}
		$dbh = NULL;
	}
}

function rating_form($table){
	$ip = $_SERVER["REMOTE_ADDR"];
	if(!isset($table) && isset($_GET['table'])){
		$table = $_GET['table'];
	}
	$rating = new rating($table);
	$status = "<div class='score'>
				<a class='score1' href='?score=1&table=$table&user=$ip'>1</a>
				<a class='score2' href='?score=2&table=$table&user=$ip'>2</a>
				<a class='score3' href='?score=3&table=$table&user=$ip'>3</a>
				<a class='score4' href='?score=4&table=$table&user=$ip'>4</a>
				<a class='score5' href='?score=5&table=$table&user=$ip'>5</a>
			</div>
	";
	if(isset($_GET['score'])){
		$score = $_GET['score'];
		if(is_numeric($score) && $score <=5 && $score >=1 && ($table==$_GET['table']) && isset($_GET["user"]) && $ip==$_GET["user"]){
			$rating->set_score($score, $ip);
			$status = $rating->status;
		}
	}
	if(!isset($_GET['update'])){ echo "<div class='rating_wrapper'>"; }
	?>
	<?php print_r($rating);?>
	
	<div class="sp_rating">
		<div class="rating">Rating:</div>
		<div class="base"><div class="average" style="width:<?php echo $rating->average; ?>%"><?php echo $rating->average; ?></div></div>
		<div class="votes"><?php echo $rating->votes; ?> votes</div>
		<div class="status">
			<?php echo $status; ?>
		</div>
	</div>
	<?php
	if(!isset($_GET['update'])){ echo "</div>"; }
}

if(isset($_GET['update'])&&isset($_GET['table'])){
	rating_form($_GET['table']);
}
?>
si je fait un <?php print_r($rating);?>, j'obtiens:
rating Object ( [average] => 80.0 [votes] => 1 [status] => [table] => '1' [path:rating:private] => C:\wamp\www\vote\rating/database/ratings.sqlite )
rating Object ( [average] => 0.0 [votes] => 0 [status] => [table] => '2' [path:rating:private] => C:\wamp\www\vote\rating/database/ratings.sqlite )
rating Object ( [average] => 100.0 [votes] => 1 [status] => [table] => '3' [path:rating:private] => C:\wamp\www\vote\rating/database/ratings.sqlite )


et le code modifié pour mon systeme:
<?php
class rating{

    public $average = 0;
    public $votes;
    public $status;
    public $table;

function __construct($table)
{
    $hote='localhost';           
    $nom_bd='aaaa';
    $utilisateur='root';             
    $mot_passe='';        

    try
    {   
        //connexion
        $dbh = new PDO('mysql:host='.$hote.';dbname='.$nom_bd, $utilisateur, $mot_passe);
        $dbh -> setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->table = $dbh->quote($table);	

        // recherche si un champ pour ce chien et cette question existe
        $table_check = $dbh->query("SELECT id_chien FROM vote WHERE id_chien=$this->table AND id_question='1'");
        $dnn = $table_check->fetch();	

        // test si $dnn contient un id_chien
        if(empty($dnn)) 
        {
            // je crée un premier vote dans la table vote
            $dbh->exec("INSERT INTO vote (id_question, id, ip_user, id_chien, note) VALUES ('1', '1', 'systeme', $this->table, '')");				
            // je crée un premier vote dans la table moyenne_votes pour enregistrer les moyennes
            $dbh->exec("INSERT INTO moyenne_votes (id_chien, id_question, nb_votes, moyenne) VALUES ($this->table, '1', '', '')"); 
        } 
        else 
        {
            $this->average = $table_check->fetchColumn(1);
        }
        
        // calcul du nombre de votes
        $this->votes = ($dbh->query("SELECT COUNT(*) FROM vote WHERE id_chien=$this->table")->fetchColumn()-1);

    }
        catch( PDOException $exception )
    {
        die($exception->getMessage());
    }
    $dbh = NULL;		
}





function set_score($score, $ip)
{
    try
    {
        //connexion
        $dbh = new PDO('mysql:host='.$hote.';dbname='.$nom_bd, $utilisateur, $mot_passe);
        $dbh -> setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        // recherche id vote avec (id-chien + id_question + ip_user)
	$voted = $dbh->query("SELECT id FROM votes WHERE id_chien=$this->table AND ip='$ip'");
	$dnn_2 = $voted->fetch();	
        
        // si cette combinaison n'existe pas
        if(empty($dnn)) {
				
	// j'insert le vote
        $dbh->exec("INSERT INTO vote (id_question, id, ip_user, rating, id_chien) VALUES ('1', '1', '.$ip.', $score, $this->table)");
	$this->votes++;
		
        // ???
	$statement = $dbh->query("SELECT rating FROM vote WHERE id_chien=$this->table");
	$total = $quantity = 0;
	$row = $statement->fetch();
	while($row = $statement->fetch())
        {
            $total = $total + $row[0];
            $quantity++;
	}
	$this->average = round((($total*20)/$quantity),0);
        $statement = $dbh->exec("UPDATE vote SET rating=$this->average WHERE id_chien=$this->table");
        $this->status = '(thanks!)';
	} 
        else 
        {
            $this->status = '(already scored)';
	}
			
	}catch( PDOException $exception ){
            die($exception->getMessage());
	}
	$dbh = NULL;
	}
   }

function rating_form($table){
	$ip = $_SERVER["REMOTE_ADDR"];
	if(!isset($table) && isset($_GET['table'])){
		$table = $_GET['table'];
	}
	$rating = new rating($table);
	$status = "<div class='score'>
				<a class='score1' href='?score=1&table=$table&user=$ip'>1</a>
				<a class='score2' href='?score=2&table=$table&user=$ip'>2</a>
				<a class='score3' href='?score=3&table=$table&user=$ip'>3</a>
				<a class='score4' href='?score=4&table=$table&user=$ip'>4</a>
				<a class='score5' href='?score=5&table=$table&user=$ip'>5</a>
			</div>
	";
	if(isset($_GET['score'])){
		$score = $_GET['score'];
		if(is_numeric($score) && $score <=5 && $score >=1 && ($table==$_GET['table']) && isset($_GET["user"]) && $ip==$_GET["user"]){
			$rating->set_score($score, $ip);
			$status = $rating->status;
		}
	}
	if(!isset($_GET['update'])){ echo "<div class='rating_wrapper'>"; }
	?>


	<div class="sp_rating">
		<div class="rating">Rating:</div>
		<div class="base"><div class="average" style="width:<?php echo $rating->average; ?>%"><?php echo $rating->average; ?></div></div>
		<div class="votes"><?php echo $rating->votes; ?> votes</div>
		<div class="status">
			<?php echo $status; ?>
		</div>
	</div>
	<?php
	if(!isset($_GET['update'])){ echo "</div>"; }
}

if(isset($_GET['update'])&&isset($_GET['table'])){
	rating_form($_GET['table']);
}

?>
et si je fait:<?php print_r($rating);?>, j'obtiens:

rating Object ( [average] => [votes] => 0 [status] => [table] => '1' )
rating Object ( [average] => [votes] => 0 [status] => [table] => '2' )
rating Object ( [average] => [votes] => 0 [status] => [table] => '3' )

j'arrive pas a m'en sortir, quelqu'un peut il m'aidé svp ? #-o

Re: sqlite vers sql

par juliette » 20 déc. 2011, 16:25

tranquillement ça avance et je pense comprendre...
j'ai donc 2 table, une qui enregistre les moyennes pour l'affichage et l'autre qui enregistre 1 votes par champs avec toutes les infos utiles pour n'autoriser qu'un votes par personne.

quand on enregistre un nouvel individu, aucun vote n’existe donc a l’affichage de sa page, une requete crée un premier champ dans chaque table pour permettre l’affichage...

voila le code:
                try
                {
                    //connexion
                    $dbh = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
                    $dbh->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                    // protection de la chaine chien pour une requete
                    $this->chien = $dbh->quote($vote_chien);

                    // js cherche si le chien a le vote avec l'ip admin
                    $vote_chien_check = $dbh->query("SELECT id FROM vote WHERE ip_user='admin' AND id_chien=$this->chien LIMIT 0, 1");
                                   
                    // si $vote_chien_check est vide
                    if(empty($vote_chien_check))
                    {
                        // je crée un premier vote dans la table vote
                        $dbh->exec("INSERT INTO vote (id_question, id, ip_user, id_chien, note) 
                                     VALUES ('1', '1', 'admin', $this->chien, '')");
                        // je crée un premier vote dans la table moyenne_votes
                        $dbh->exec("INSERT INTO moyenne_votes (id_chien, id_question, nb_votes, moyenne) 
                                                       VALUES ($this->chien, '1', '', '')");                        
                        
                    } 
                    
                    // ???                    
                    else 
                    {
                        $this->average = $vote_chien_check->fetchColumn(1);
                    }

                    // ???
                    $this->votes = ($dbh->query("SELECT nb_votes FROM moyenne_votes WHERE id_chien=$this->chien")->fetchColumn()-1);
		}catch( PDOException $exception ){
				die($exception->getMessage());
		}
		$dbh = NULL;		
	}

mon soucis la c'est la vérification de $vote_chien_check, si je met un "if(!empty($vote_chien_check))" le système semble marcher mais chaque fois que j'actualise la page, les champs sont créer de nouveaux et les votes augmentes et si je met "if(empty($vote_chien_check))" ce qui me parait plus correct la rien ne marche ???

Re: sqlite vers sql

par xTG » 19 déc. 2011, 22:10

$this->table doit être ta table de vote en gros pour que tu respectes ton schéma.

Re: sqlite vers sql

par juliette » 19 déc. 2011, 21:38

ah la je comprend plus rien, ou as tu vu mon shema de BDD ?

car en fait j'ai une table chien avec un id unique par chien...
et la table que je montre au début est la table votes...

quand je dis ca:
je te le dis comme je le comprend:
CREATE TABLE avec mysql crée une table, on est ok ?
quand j'ai ma table vote, j'insert (INSERT) 1 champ pour chaque vote et chaque champ contient l'id d'un chien...

la avec sqlite, cette ligne crée une table, enfin je pense...
$dbh->query("CREATE TABLE $this->table
le truc est que $this->table contient l'id d'un chien donc j'en déduis que sqlite crée une table pour chaque chien...

plus bas, j'ai une autre requête qui update quand l'id est 1
$statement = $dbh->query("UPDATE $this->table SET rating = $this->average WHERE id=1");
ce qui me fait encore croire que chaque chien a sa propre table avec un seul champ id1 qui est updater pour mettre les valeurs a jour après le vote ???
c'est en fait que je ceux savoir si le script que je montre fonctionne bien comme je le dis, je sais qu'il n'est pas adapter a mon système et je veux le faire...
a mon avis, ce que je ne comprend pas c'est justement ce qui te pose problème (la façon dont la personne a utilisé le code pour l’écrire...)

la ca fonctionne parfaitement pour sqllite MAIS dans les conditions de l'auteur... si tu reviens sur mon premier post j'avais demander si il ete possible de le commenter, j'ai presque fini mais il y a ce create table et le reste que j'explique que je me représente mal... si j'ai raison alors je progresse si non alors je n'ai absolument ien compris a ce script... (je ne parle pas du fonctionnement des différentes base mais bien du script lui même) #-o

Re: sqlite vers sql

par xTG » 19 déc. 2011, 21:22

Non justement je te dis que ton schéma de base de données est incorrect.
Tu devrais avoir une seule table Chien avec un champ identifiant un chien précis.
Car une table par chien c'est loin d'être bien.

Re: sqlite vers sql

par juliette » 19 déc. 2011, 21:09

ce n'est pas mon script, c'est un système de vote avec jquery que j'ai récupéré et veux le modifier pour l'utiliser sur la table de mon premier post...
mais avant je veux tout comprendre...

xTG me donne tu raison sur mon dernier message ?

Re: sqlite vers sql

par xTG » 19 déc. 2011, 20:27

Ce n'est pas le script qui est mauvais mais la façon dont tu l'utilises.
En effet c'est une aberration de mettre un chien comme le nom d'une table...
Revois ton modèle logique des données.

Sinon je me répète, SQLLite et MySQL utilise la même base SQL hormis quelques fonctions qui diffèrent.

Re: sqlite vers sql

par juliette » 19 déc. 2011, 19:50

je te le dis comme je le comprend:
CREATE TABLE avec mysql crée une table, on est ok ?
quand j'ai ma table vote, j'insert (INSERT) 1 champ pour chaque vote et chaque champ contient l'id d'un chien...

la avec sqlite, cette ligne crée une table, enfin je pense...
$dbh->query("CREATE TABLE $this->table
le truc est que $this->table contient l'id d'un chien donc j'en déduis que sqlite crée une table pour chaque chien...

plus bas, j'ai une autre requête qui update quand l'id est 1
$statement = $dbh->query("UPDATE $this->table SET rating = $this->average WHERE id=1");
ce qui me fait encore croire que chaque chien a sa propre table avec un seul champ id1 qui est updater pour mettre les valeurs a jour après le vote ???

Re: sqlite vers sql

par xTG » 19 déc. 2011, 18:58

Non la structure est exactement la même.

Re: sqlite vers sql

par juliette » 19 déc. 2011, 18:38

avec mysqlje crée une table puis je remplis avec des champs...
la avec sqlite, j'ai l'impression que ce sont les champs qui sont considéré comme table, ais-je raison ?

Re: sqlite vers sql

par xTG » 18 déc. 2011, 11:51

Cette requête est faite pour tester si la table existe dans la base de données.
Il tente donc de récupérer le premier vote.
Cela dit avec une connexion mysql tu vas générer une exception et donc le script ne vas pas fonctionner pareil pour la création.
Si tu n'as pas envie de t'embêter à remanier cette partie, il va falloir penser à créer manuellement la table toi même (via l'invite de commande mysql ou via l'outil web PhpMyAdmin).

Re: sqlite vers sql

par juliette » 17 déc. 2011, 17:02

dans le script, quelqu'un peut il me dire a quoi correspond cette ligne:
$table_check = $dbh->query("SELECT * FROM $this->table WHERE id='1'");
ce que je ne comprend pas c'est le WHERE id='1', d'ou vient il ?

Re: sqlite vers sql

par juliette » 17 déc. 2011, 13:45

merci,
tes lecture m’amène a croire que nous parlons de ces 4 lignes:
			$pathinfo = pathinfo(__FILE__);
			$this->path = realpath($pathinfo['dirname']) . "/database/ratings.sqlite";
			$dbh = new PDO("sqlite:$this->path");
			$this->table = $dbh->quote($table);
qui devrait etre transformer comme ca:
                        $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');
                        $dbh ->setAttribute  (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Re: sqlite vers sql

par xTG » 17 déc. 2011, 07:15

Oula...
Je parlais du constructeur de l'objet PDO.

http://www.siteduzero.com/tutoriel-3-14 ... n-php.html

Re: sqlite vers sql

par juliette » 16 déc. 2011, 22:18

quand tu dis chaîne de construction, tu parle bien des try{ } #-o