sqlite vers sql

Mammouth du PHP | 790 Messages

16 déc. 2011, 20:49

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:
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

16 déc. 2011, 21:10

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

Mammouth du PHP | 790 Messages

16 déc. 2011, 22:18

quand tu dis chaîne de construction, tu parle bien des try{ } #-o
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

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

Mammouth du PHP | 790 Messages

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);
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 790 Messages

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 ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

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).

Mammouth du PHP | 790 Messages

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 ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

19 déc. 2011, 18:58

Non la structure est exactement la même.

Mammouth du PHP | 790 Messages

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 ???
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

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.

Mammouth du PHP | 790 Messages

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 ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

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.

Mammouth du PHP | 790 Messages

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
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

19 déc. 2011, 22:10

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