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;
}
}
?>
//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