Logică pentru un buton de vot

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
:slight_smile:

Kingsley, de ce nu adaugi retragerea like ului la sistemul tau ?

Alta resursa suplimentara

Cred ca si cu js poti face, dar nu stiu cum

1 Like

@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 :+1:. Adică apeși o dată, ai :+1:, mai apeși o dată, ai :-1: Așa e?

1 Like

Nu ai dislike, pur si simplu Like-ul tau este retras, exact cum este pe Facebook.

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

@iamntz tot aceeași problemă.

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

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']
            )
    	);
   	}

?>

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

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

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 !
:slight_smile:

1 Like

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