Bonsoir a tous,
Je souhaiterais incrementer des clics dans MySQL pour avoir le résultats des clics dans le BO, mais peut etre que je fais trop compliqué, je n'ai pas de message d'erreur le clic en FRONT incremente bien mais ne remonte pas dans la BDD.
Si vous pouviez m'aider ce serait cool...
mon model:
public static function countClicsPost($id){
$bdd = new DatabaseConnector('projet6','localhost', 'root','root');
// Préparation de la requête
$req = $bdd->getDb()->prepare("UPDATE posts SET clicks = :clicks + 1 WHERE id = :id");
// Execution de la requete
$req->bindValue(':id', $id);
$req->execute();
var_dump($req);
}
mon js:
$(document).on('click', '.increment-btn', function () {
var idPost = $(this).attr('id');
var i = 0;
$.ajax({
url: "content/ajax/clicks.php",
method: 'post',
data: {id: idPost},
beforeSend: function () {
},
error: function () {
alert('Une erreur technique est apparue');
}, success: function(result) {
i++;
document.getElementById('inc').value = i;
}
});
});
mon fichiers clicks.php
require "../../model/DatabaseConnector.php";
require "../../model/Posts.php";
$clicks = Posts::getPostById($_POST['id']);
$clicks->setClicks();
$clicks->countClicsPost();
Merci d'avance
Salut,
On dirait que c'est juste une erreur d'inatention.
Pour ta requête préparée,
tu as juste oublié le bindValue
pour "clicks".
C'est étrange d'ailleurs, tu n'avais pas un message d'erreur dessus ?
Merci SLK de ta réponse je l'ai effectivement modifié :
public function countClicsPost(){
$bdd = new DatabaseConnector('projet6','localhost', 'root','root');
// Préparation de la requête
$req = $bdd->getDb()->prepare("UPDATE posts SET clicks = :clicks + 1 WHERE id = :id or die(print_r($bdd->errorInfo())");
// Execution de la requete
$req->bindValue(':clicks', $this->_clicks);
$req->bindValue(':id', $this->_id);
$req->execute();
}
Mais ca ne fonctionne toujours pas
quand on voit $this->_clicks
, que représente "$this" ?
Si tu es dans un pattern MVC, j'imagine que cette fonction est dans un controller.
Donc _clicks
, et _id
sont des attributs de ce controller ?
Mais ça me parait étrange qu'un id soit un attribut, du coup c'est toujours le même quoi.
C'est vraiment ce qu'on veut ?
C'est dans mon model pas dans mon controller, pour mes update et insert into ca fonctionne en tout cas.
MVC, donc la fonction pour le UPDATE est dans mon model,
en front on a le bouton pour le clic,
mon js pour le clic avec ajax qui revoit vers mon fichier clicks.php qui lui appel la fonction pour UPDATER le clique...
D'accord.
Par contre je me pose toujours la question : $this->_id
est l'identifiant de quoi ?
Parce-que là on update toujours le même id hein c'est ça ?
Ça me parait étrange, mais c'est possible, c'est juste pas commun.
C'est bien le comportement qu'on veut ?
Ensuite,
tu n'as pas un message d'erreur ?
Dans ta class "DatabaseConnector",
quand tu créer un nouvel objet PDO,
est-ce que tu as activé les erreurs ?
Genre comme ça :
<?php
$pdo = new PDO(paramètres...);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // montre les erreurs
?>
Est-ce que tu as un message d'erreur qui pourrait nous aider ?
C'est ca le probleme pas de message d'erreur en console ou par xdebug, comme l'objectif est de compter les clics en front peut etre que mon PB vient de mon fichier clicks.php :
$clicks->setClicks();
$clicks->countClicsPost($_POST['id']);
ou mon model que je viens de modifer mais encore sans resultat :
public function countClicsPost($id){
$bdd = new DatabaseConnector('projet6','localhost', 'root','root', setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION));
// Préparation de la requête
$req = $bdd->getDb()->prepare("UPDATE posts SET clicks = :clicks + 1");
// Execution de la requete
//$req->bindValue(':id', $id);
//$req->bindValue(':clicks', $this->_clicks);
//$req->bindValue(':id', $this->_id);
$req->execute();
}
D'accord.
Est-ce que tu peux modifier/montrer tout ça ?
1) Rajouter des DEBUG sur $clicks
, est-ce qu'il y a ce qu'il faut ? :
$clicks = Posts::getPostById($_POST['id']);
echo '<pre>';
print_r($clicks);
echo '</pre>';
$clicks->setClicks();
echo '<pre>';
print_r($clicks);
echo '</pre>';
$clicks->countClicsPost();
2) Avant l'update, vérifies bien sur phpMyAdmin, que l'id que tu veux update est bien celui que tu utilise ?
$req->bindValue(':clicks', $this->_clicks);
var_dump($this->_id);
$req->bindValue(':id', $this->_id);
3) Montre le code la fonction setClicks
Je pense à une autre chose :
dans la partie AJAX :
url: "content/ajax/clicks.php",
Est-ce que l'url est bonne ?
Il ne faut pas un /
au début, c'est bon ?
[EDIT]
tiens tu as aussi :
data: {id: idPost},
Mais je ne vois pas "id" déclaré quelque part. Est-ce qu'il l'est, hors de la fonction ?
Oui je regarde justement ce PB dans mon js
dans ma vue:
<input type="text" id="inc_<?=$post->getId(); ?>" value="0"/>
<button type="button" class="increment-btn" >Increment</button>
j'ai une erreur dans ma concole = Uncaught TypeError: Cannot set property 'value' of null
j'ai ajouté l'id dans mon js:
success: function(result) {
i++;
document.getElementById('inc_'+idPost).value = i;
alert("OK");
}
Ah,
comme ça semble être bien écrit, j'imagine que les ID ne sont pas les même.
Vérifies pour voir.
var_dump($post->getId());
<input type="text" id="inc_<?=$post->getId(); ?>" value="0"/>
<button type="button" class="increment-btn" >Increment</button>
success: function(result) {
i++;
alert('idPost : ' + idPost);
document.getElementById('inc_'+idPost).value = i;
alert("OK");
}
Je me pose toujours cette même question sur l'ID ^^
Par contre je me pose toujours la question : $this->_id est l'identifiant de quoi ?
Parce-que là on update toujours le même id hein c'est ça ?
Ça me parait étrange, mais c'est possible, c'est juste pas commun.
C'est bien le comportement qu'on veut ?
Peut-être que ça ne vient pas de la hein, mais ça me tracasse toujours.
Si ça se trouve le problème viens de là.
[EDIT]
Mince, je dois y aller... Je reviens dans environ 2 heures...
Désolé, j'espère que tu vas trouver ^^
le comportement c'est que le clic doit etre comptabilisé et doit correspondre a un post par son id l'action du clic doit remonter dans la BDD + 1 apres je recupere le nombre de clic pour l'afficher en BO
OK MERCI ET BONNE SOIREE ET MERCI DE TON AIDE ET DE TA PATIENCE