par
Karl_R » 02 juin 2021, 16:36
Biens le bonjour,
Je suis tout nouveau sur php et encore plus par rapport a OOP je me suis dit que c'est un bon exercice de trouver un bout de code et d'essayer de le comprendre + le faire marcher pour que je puisse commencer a ecrire mon propre code. Du coup j'ai trouver ce petit bout qui fait (si j'ai bien compris) la gestion de Like/Dislike dans une BDD.
Code : Tout sélectionner
<?php
class=User
class Vote {
private $pdo;
private $formerVote;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
private function recordExists($ref, $ref_id) {
$req = $this->pdo->prepare("SELECT * FROM $ref WHERE id=?");
$req->execute([$ref_id]);
if ($req->rowCount() == 0) {
throw new Exception('Impossible de voter pour un acteur qui n\'exist pas');
}
}
public function like($ref, $ref_id, $user_id) {
if ($this->vote($ref, $ref_id, $user_id, 1)) {
$sql_part = "";
if ($this->formerVote) {
$sql_part = ", dislike_count = dislike_count - 1";
}
$req = $this->pdo->prepare("UPDATE $ref SET like_count = like_count + 1 $sql_part WHERE id=?");
$req->execute([$ref_id]);
return true;
}
return false;
}
public function dislike($ref, $ref_id, $user_id) {
if ($this->vote($ref, $ref_id, $user_id, -1)) {
$sql_part = "";
if ($this->formerVote) {
$sql_part = ", like_count = like_count - 1";
}
$req = $this->pdo->prepare("UPDATE $ref SET dislike_count = dislike_count + 1 $sql_part WHERE id=?");
$req->execute([$ref_id]);
return true;
}
return false;
}
private function vote($ref, $ref_id, $user_id, $vote) {
$this->recordExists($ref, $ref_id);
$req = $this->pdo->prepare("SELECT id, vote FROM votes WHERE ref=? AND ref_id=? AND user_id=?");
$req->execute([$ref, $ref_id, $user_id]);
$vote_row = $req->fetch();
if ($vote_row) {
if ($vote_row['vote'] == $vote) {
return false;
}
$this->formerVote = $vote_row;
// If user changed like to dislike or vise versa, update this id in `votes`
$this->pdo->prepare("UPDATE votes SET vote = ? WHERE id = {$vote_row['id']}")->execute([$vote]);
return true;
}
$req = $this->pdo->prepare("INSERT INTO votes SET ref=?, ref_id=?, user_id=?, vote = $vote"); // To add variables in SQL query, using "double quotes"
$req->execute([$ref, $ref_id, $user_id]);
return true;
}
// Option 2: Add and update the count in table `acteurs`
/*public function updateCount($ref, $ref_id) {
$req = $this->pdo->prepare("SELECT COUNT(id) as count, vote FROM votes WHERE ref=? AND ref_id=? GROUP BY vote");
$req->execute([$ref, $ref_id]);
$votes = $req->fetchAll();
// If no votes found, keep 0 as record
$counts = [
'-1' => 0,
'1' => 0
];
foreach ($votes as $vote) {
// $count['-1'] = $vote[COUNT(id)] = 1
$counts[$vote['vote']] == $vote['count'];
}
$req = $this->pdo->query("UPDATE $ref SET like_count = {$counts[1]}, dislike_count = {$counts[-1]} WHERE id = $ref_id");
return true;
}*/
/**
* Permet d'ajouter une class is-liked ou is-disliked suivant un enregistrement
* @param $vote mixed false/enregistrement
*/
public static function getClass($vote) {
if ($vote) {
// Ternaire/ternary operator
return ($vote['vote'] == 1) ? 'is-liked' : 'is-disliked';
}
return null;
}
}
?>
Du coup j'ai compris le system de Class Nom_CLass
//Propriete
//Method
1)Mais ce que je ne comprend pas c'est ca requette Preparer :
UPDATE $ref SET like_count = like_count + 1 $sql_part WHERE id=?"
Pour moi $ref c'est la base de donner. Si c'est bien le cas, es une bonne pratique de nommer ca colonne comme cela?
2) D'où viennent les $ref, $ref_id si ils ont pas étais définie au préalable.
3) Apres quelques heures de lectures Jai recrée une BDD au nom de 'votes' tables au noms de:
id (int)
réf (varchar)
vote (int)
j'ai surement rater quelques chose mais je serais ravis d'en discuter pour comprendre plus.
Je vous remercie

Biens le bonjour,
Je suis tout nouveau sur php et encore plus par rapport a OOP je me suis dit que c'est un bon exercice de trouver un bout de code et d'essayer de le comprendre + le faire marcher pour que je puisse commencer a ecrire mon propre code. Du coup j'ai trouver ce petit bout qui fait (si j'ai bien compris) la gestion de Like/Dislike dans une BDD.
[code]
<?php
class=User
class Vote {
private $pdo;
private $formerVote;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
private function recordExists($ref, $ref_id) {
$req = $this->pdo->prepare("SELECT * FROM $ref WHERE id=?");
$req->execute([$ref_id]);
if ($req->rowCount() == 0) {
throw new Exception('Impossible de voter pour un acteur qui n\'exist pas');
}
}
public function like($ref, $ref_id, $user_id) {
if ($this->vote($ref, $ref_id, $user_id, 1)) {
$sql_part = "";
if ($this->formerVote) {
$sql_part = ", dislike_count = dislike_count - 1";
}
$req = $this->pdo->prepare("UPDATE $ref SET like_count = like_count + 1 $sql_part WHERE id=?");
$req->execute([$ref_id]);
return true;
}
return false;
}
public function dislike($ref, $ref_id, $user_id) {
if ($this->vote($ref, $ref_id, $user_id, -1)) {
$sql_part = "";
if ($this->formerVote) {
$sql_part = ", like_count = like_count - 1";
}
$req = $this->pdo->prepare("UPDATE $ref SET dislike_count = dislike_count + 1 $sql_part WHERE id=?");
$req->execute([$ref_id]);
return true;
}
return false;
}
private function vote($ref, $ref_id, $user_id, $vote) {
$this->recordExists($ref, $ref_id);
$req = $this->pdo->prepare("SELECT id, vote FROM votes WHERE ref=? AND ref_id=? AND user_id=?");
$req->execute([$ref, $ref_id, $user_id]);
$vote_row = $req->fetch();
if ($vote_row) {
if ($vote_row['vote'] == $vote) {
return false;
}
$this->formerVote = $vote_row;
// If user changed like to dislike or vise versa, update this id in `votes`
$this->pdo->prepare("UPDATE votes SET vote = ? WHERE id = {$vote_row['id']}")->execute([$vote]);
return true;
}
$req = $this->pdo->prepare("INSERT INTO votes SET ref=?, ref_id=?, user_id=?, vote = $vote"); // To add variables in SQL query, using "double quotes"
$req->execute([$ref, $ref_id, $user_id]);
return true;
}
// Option 2: Add and update the count in table `acteurs`
/*public function updateCount($ref, $ref_id) {
$req = $this->pdo->prepare("SELECT COUNT(id) as count, vote FROM votes WHERE ref=? AND ref_id=? GROUP BY vote");
$req->execute([$ref, $ref_id]);
$votes = $req->fetchAll();
// If no votes found, keep 0 as record
$counts = [
'-1' => 0,
'1' => 0
];
foreach ($votes as $vote) {
// $count['-1'] = $vote[COUNT(id)] = 1
$counts[$vote['vote']] == $vote['count'];
}
$req = $this->pdo->query("UPDATE $ref SET like_count = {$counts[1]}, dislike_count = {$counts[-1]} WHERE id = $ref_id");
return true;
}*/
/**
* Permet d'ajouter une class is-liked ou is-disliked suivant un enregistrement
* @param $vote mixed false/enregistrement
*/
public static function getClass($vote) {
if ($vote) {
// Ternaire/ternary operator
return ($vote['vote'] == 1) ? 'is-liked' : 'is-disliked';
}
return null;
}
}
?>
[/code]
Du coup j'ai compris le system de Class Nom_CLass
//Propriete
//Method
1)Mais ce que je ne comprend pas c'est ca requette Preparer :
UPDATE $ref SET like_count = like_count + 1 $sql_part WHERE id=?"
Pour moi $ref c'est la base de donner. Si c'est bien le cas, es une bonne pratique de nommer ca colonne comme cela?
2) D'où viennent les $ref, $ref_id si ils ont pas étais définie au préalable.
3) Apres quelques heures de lectures Jai recrée une BDD au nom de 'votes' tables au noms de:
id (int)
réf (varchar)
vote (int)
j'ai surement rater quelques chose mais je serais ravis d'en discuter pour comprendre plus.
Je vous remercie :)