Page 1 sur 2

sqlite vers sql

Posté : 16 déc. 2011, 20:49
par juliette
salut,
suite a des critiques de la part de Berzemus sur un script trop vieux, je passe a utre chose...
j'ai trouver un script de remplacement qui me parait être correct mais le soucis est qu'il enregistre dans un fichier texte hors moi j'ai une table:
CREATE TABLE IF NOT EXISTS `vote` (
  `id_vote` int(11) NOT NULL AUTO_INCREMENT,
  `id_question` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `id_chien` int(11) NOT NULL,
  `note` int(11) NOT NULL,
  `signup_date` date NOT NULL,
  PRIMARY KEY (`id_vote`),
  KEY `fk_questionnaire1` (`id_question`),
  KEY `fk_user2` (`id`),
  KEY `fk_chien3` (`id_chien`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=607 ;
pourriez vous m'aider a transformer ce script pour qu'il enregistre comme je le veux dans ma table ?

voici le code:
<?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 = '(Merci !)';
			} else {
				$this->status = '(Deja vote)';
			}
			
		}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">Moyenne:</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']);
}
?>
Dans l'ensemble je pense comprendre la logique mais avec sqlite je n'arrive pas a faire les modifs...
Je sais que j'abuse mais serait il possible de me le commenter de façon a bien comprendre et trouver les modifs a appliquer ? voir même ce supprimer ce qui ne me sert a rien pour une BDD...

merci d'avance :oops:

Re: sqlite vers sql

Posté : 16 déc. 2011, 21:10
par xTG
SQLLite est une base de données portable.
De plus ce code utilise une librairie d'abstraction d'accès aux bases de données, à savoir PDO.
Il te suffit donc de modifier la chaîne de connexion du constructeur PDO pour pouvoir utiliser une base de données MySQL, PostgreSQL ou même Oracle.
Voilà un peu de lecture :
http://www.siteduzero.com/tutoriel-3-34 ... x-bdd.html

Re: sqlite vers sql

Posté : 16 déc. 2011, 22:18
par juliette
quand tu dis chaîne de construction, tu parle bien des try{ } #-o

Re: sqlite vers sql

Posté : 17 déc. 2011, 07:15
par xTG
Oula...
Je parlais du constructeur de l'objet PDO.

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

Re: sqlite vers sql

Posté : 17 déc. 2011, 13:45
par juliette
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

Posté : 17 déc. 2011, 17:02
par juliette
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

Posté : 18 déc. 2011, 11:51
par xTG
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

Posté : 19 déc. 2011, 18:38
par juliette
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

Posté : 19 déc. 2011, 18:58
par xTG
Non la structure est exactement la même.

Re: sqlite vers sql

Posté : 19 déc. 2011, 19:50
par juliette
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

Posté : 19 déc. 2011, 20:27
par xTG
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

Posté : 19 déc. 2011, 21:09
par juliette
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

Posté : 19 déc. 2011, 21:22
par xTG
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

Posté : 19 déc. 2011, 21:38
par juliette
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

Posté : 19 déc. 2011, 22:10
par xTG
$this->table doit être ta table de vote en gros pour que tu respectes ton schéma.