Kingsley
(Tudor)
decembrie 20, 2017, 4:44pm
1
Am făcut un buton de like.
Ideea e că nu funcționează corect, adică pot apăsa de mai multe ori pe el.
session_start();
require 'connection.php';
$result = $pdo->prepare("SELECT FROM vote_logs WHERE voterID = :voterID AND topicID = :topicID");
$result->execute(
Array(
':voterID' => $_SESSION ['id'],
':topicID' => $_GET ['id']
)
);
$row = $result->fetch(PDO::FETCH_ASSOC);
if (!$row) {
$result = $pdo->prepare("UPDATE topics SET awesomes = awesomes + 1 WHERE id = :id");
$result->execute(
Array(
':id' => $_GET ['id']
)
);
$result = $pdo->prepare("INSERT INTO vote_logs (voterID, topicID) VALUES (:voterID, :topicID)");
$result->execute(
Array(
':topicID' => $_GET ['id'],
':voterID' => $_SESSION ['id']
)
);
} else {
$result = $pdo->prepare("UPDATE topics SET awesomes = awesomes - 1 WHERE id = :id");
$result->execute(
Array(
':id' => $_GET ['id']
)
);
$result = $pdo->prepare("DELETE FROM vote_logs WHERE voterID = :voterID AND topicID = :topicID");
$result->execute(
Array(
':voterID' => $_SESSION ['id'],
':topicID' => $_GET ['id']
)
);
}
Înainte, aveam un sistem tot de Like, ceva mai basic (adică nu puteai sa-ti retragi like-ul cum e acum), si functiona perfect…
require 'connection.php';
session_start();
$result = $pdo->prepare("SELECT topicID FROM vote_logs WHERE voterID = :voterID");
$result->execute(
Array(
':voterID' => $_SESSION ['id']
)
);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$topicID = $row['topicID'];
}
if ($topicID != $_GET ['id']) {
$result = $pdo->prepare("UPDATE topics SET awesomes = +1 WHERE id = :id");
$result->execute(
Array(
':id' => $_GET ['id']
)
);
$result = $pdo->prepare("INSERT INTO vote_logs (voterID, topicID) VALUES (:voterID, :topicID)");
$result->execute(
Array(
':topicID' => $_GET ['id'],
':voterID' => $_SESSION ['id']
)
);
}
header('Location: /home.php');
cred ca poti sa incerci sa iti faci o variabila $contor
. care va fi 1 la o singura apasare. Numai cand acea variabila este 1, faci insertul in baza de date
este o idee, daca imi mai vine ceva in minte actualizez raspunsul
Ionut, el vrea ca un buton de like sa trimita doar ‘un like’. asa cum este pe fb sau Devforum
Kingsley, de ce nu adaugi retragerea like ului la sistemul tau ?
Alta resursa suplimentara
php
Cred ca si cu js poti face, dar nu stiu cum
1 Like
iamntz
(Ionuț Staicu)
decembrie 20, 2017, 5:32pm
9
@Kingsley : un titlu ar trebui să spună despre ce este vorba în discuție și ar fi frumos să formeze o propoziție. Scurtă, ce-i drept, dar să sune măcar vag a propoziție, nu a cuvinte cheie.
Faptul că ai dificultăți în a-ți rezuma problema la o propoziție simplă nu înseamnă decât că nu îți înțelegi problema. Eu unul ți-am citit primul comentariu de vreo două-trei ori și tot nu pot spune că-s sigur că am înțeles ce vrei tu să faci.
Dacă am înțeles bine, tu vrei ca un utilizator să facă toggle la un . Adică apeși o dată, ai , mai apeși o dată, ai Așa e?
1 Like
Kingsley
(Tudor)
decembrie 20, 2017, 5:34pm
10
Nu ai dislike, pur si simplu Like-ul tau este retras, exact cum este pe Facebook.
iamntz
(Ionuț Staicu)
decembrie 20, 2017, 5:48pm
11
Deci e așa cum am zis, faci toggle la un like.
În cazul ăsta, eu văd lucrurile cam așa:
Structura tabelei vote_logs
:
voterID | topicID | status
Toate coloanele sunt de tipul int
Acum, logica sună cam așa:
$vot = SELECT FROM vote_logs WHERE voterID = :voterID AND topicID = :topicID
if !$vot
INSERT INTO vote_logs (voterID, topicID, status) VALUES (:voterID, :topicID, 1)
else
UPDATE vote_logs SET status= IF(status=1, 0, 1) WHERE ...;
// https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_if
Are sens?
Ce ai tu aici:
UPDATE topics SET awesomes = +1 WHERE id = :id:
Nu prea are sens, pentru că, de fapt, vei avea voturile în două locuri: în tabela topics
și în tablea vote_logs
.
2 Likes
Kingsley
(Tudor)
decembrie 20, 2017, 5:58pm
12
@iamntz tot aceeași problemă.
iamntz
(Ionuț Staicu)
decembrie 20, 2017, 8:17pm
14
Aceeași problemă… care ? Pâna acum am mers doar pe ghici… Arată ce ai făcut și încearcă să explici mai bine ce (nu) merge…
2 Likes
Kingsley
(Tudor)
decembrie 20, 2017, 8:27pm
15
Este exact aceeași problemă ca și înainte.
<?php
require 'connection.php';
session_start();
$result = $pdo->prepare("SELECT FROM vote_logs WHERE voterID = :voterID AND topicID = :topicID");
$result->execute(
Array(
':voterID' => $_SESSION ['id'],
':topicID' => $_GET ['id']
)
);
$row = $result->fetch(PDO::FETCH_ASSOC)
if (!$row) {
$result = $pdo->prepare("INSERT INTO vote_logs (voterID, topicID, status) VALUES (:voterID, :topicID, 1)");
$result->execute(
Array(
':voterID' => $_SESSION ['id'],
':topicID' => $_GET ['id']
)
);
} else {
$result = $pdo->prepare("UPDATE vote_logs SET status = IF(status = 1, 0, 1) WHERE voterID = :voterID AND topicID = :topicID");
$result->execute(
Array(
':voterID' => $_SESSION ['id'],
':topicID' => $_GET ['id']
)
);
}
?>
iamntz
(Ionuț Staicu)
decembrie 20, 2017, 8:45pm
16
Tu ce crezi, e o problemă de SQL sau de PHP? Vezi și tu cum arată query-urile alea compilate, rulează-le în CLI, vezi ce rezultă…
2 Likes
daca ceea ce ai postat aici e copy-paste exact din cod si eroarea pe care o primesti e ceva de genul Parse error: syntax error, unexpected ‘if’ , e din cauza ca iti lipeste un ; de la sfarsitul liniei 14
si query-ul de la select e gresit. nu este specificat ce anume sa selecteze din tabela
1 Like
Kingsley
(Tudor)
decembrie 20, 2017, 9:08pm
18
Eroarea e din cauza că tot am dat undo la code, încercând diferite metode, n-am observat.
Cat despre query, eu vreau să verific dacă există sau nu un rând în db ce corespunde condiției, nu să extrag o anumită dată.
serghei
(Serghei Amelian)
decembrie 20, 2017, 11:27pm
19
Eşti absolut sigur că $row este “false” daca nu este returnat niciun rand?
1 Like
O alta abordare
vezi cum l-a gandit mai intai, iar apoi incerca sa implementezi si tu. poti sa folosesti ce este acolo ca model
Reiterez: NU copy paste direct fara sa intelegi !
Spor !
1 Like
Kingsley
(Tudor)
decembrie 21, 2017, 1:44pm
22
Am rezolvat, tot folosind ideea lui @iamntz , mulțumită lui @serghei (am făcut debugging pe $row și am observat unde e problema; trebuia să pun * pentru count la prima interogare).
Salutare!
Mda … se pare ca in mai toate cazurile postate de tine, e problema de sintaxa. amestecata cu neatentie = confuzie.
Incearca sa-ti activezi ‘umilul’ debug ptr. php:
php.ini - display_errors = On
Asa vei putea detecta mult mai repede scaparile de sintaxa…
Spor
5 Likes