Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Głosowanie zalogowanego usera
Forum PHP.pl > Forum > Przedszkole
LUCU
Witam!

PHP/mySQL działa tylko i wyłącznie lokalnie więc nie ma mowy o cookies i ip.
Mam problem ze skryptem, który będzie pozwalał tylko raz głosować zalogowanemu użytkownikowi.
Do rzeczy - 3 tabele :
Users, Utwory, Głosy

W tabeli Głosy mamy pola:
id_oceny
id_utworu
id_usera
ocena

W jaki sposób sprawdzić czy user głosował już wcześniej na utwór? Teoretycznie to proste bo wystarczy wysłać zapytanie czy id_usera oraz id_utworu znajduje się w tabeli Głosy ale słaby jestem i nie wiem w jaki sposób napisać kod, z góry dzięki za pomoc!
b4rt3kk
  1. SELECT COUNT(id_oceny) FROM glosy WHERE id_utworu="$id' AND id_usera='$user'


  1. if ($wynik_zapytania>0) echo 'juz glosowales'; else {
  2. // dodaj glos do bazy
  3. }


O to chodzi?
szalek01
Kod
SELECT id_oceny FROM oceny WHERE id_utworu = 10 AND id_usera = 13;

Jak coś znajdzie znaczy że user już głosował.

//ah byłem 2
LUCU
Dzięki za pomoc smile.gif Jest jeden motyw , który mi spokoju nie daje - mimo tego , że tabela 'głosy' jest pusta zawsze jest echo 'juz glosowales'

  1.  
  2. $id_usera = $_SESSION['id_usera'];
  3. $id_utworu = $_POST['id_utworu'];
  4.  
  5. $glosowal = mysql_query("SELECT COUNT(id_oceny) FROM glosy WHERE id_utworu='$id_utworu' AND id_usera='$id_usera'");
  6.  
  7. if ($glosowal>0)
  8. {
  9. echo 'już głosowałeś';
  10. }
  11. else
  12. {
  13.  
  14. if ($_POST['lubi'])
  15. {
  16. mysql_query("UPDATE `utwory` SET `lubi` = `lubi` + 1 WHERE id_utworu='$id_utworu'");
  17. mysql_query("INSERT INTO glosy VALUES ('','$id_usera','$id_utworu')");
  18.  
  19. }
  20. else if ($_POST['nielubi'])
  21. {
  22.  
  23. mysql_query("UPDATE `utwory` SET `nielubi` = `nielubi` + 1 WHERE id_utworu='$id_utworu'");
  24. mysql_query("INSERT INTO glosy VALUES ('','$id_usera','$id_utworu')");
  25. }
  26. header ("location: glosowanie.php");
  27. }
  28.  
  29. ?>
bostaf
Cytat(LUCU @ 8.10.2012, 21:47:08 ) *
mimo tego , że tabela 'głosy' jest pusta zawsze jest echo 'juz glosowales'

  1. $glosowal = mysql_query("SELECT COUNT(id_oceny) FROM glosy WHERE id_utworu='$id_utworu' AND id_usera='$id_usera'");
  2. if ($glosowal>0)

Zobacz w manualu, jaki rezultat zwraca funkcja mysql_query: "For SELECT [...] mysql_query() returns a resource on success, or FALSE on error." - zwraca zasób. Porównywanie do integera zawsze zwróci fałsz.
Zanim zaczniesz porównywać, musisz ten zasób obrobić, na przykład funkcją mysql_fetch_assoc:
  1. $glosowal = mysql_query("SELECT COUNT(id_oceny) FROM glosy WHERE id_utworu='$id_utworu' AND id_usera='$id_usera'");
  2. if(FALSE !== $glosowal)
  3. $wiersz_rezultatu = mysql_fetch_assoc($glosowal);
  4. $ile_ocen = (int) $wiersz_rezultatu['count(id_oceny)'];
  5. if ($ile_ocen > 0) {


Proponowałbym nieco prostszą metodę sprawdzenia w bazie, czy user głosował, bez COUNT - wtedy wynik zapytania zwróci 0 albo więcej wierszy i sprawdzenie sprowadzi się do policzenia ilości wierszy funkcją mysql_num_rows:
  1.  
  2. $q = mysql_query("SELECT id_oceny FROM glosy WHERE id_utworu='$id_utworu' AND id_usera='$id_usera'");
  3. $ile_ocen = mysql_num_rows($q);
  4. if($ile_ocen > 0) {


No i na koniec najważniejsze. Widzisz te czerwone ramki w opisach każdej funkcji mysql_ w manualu?
"Sugerowane alternatywy
Nie zaleca się stosowania tego rozszerzenia [mysql]. W zamian powinno używać się rozszerzenia MySQLi lub PDO_MySQL"
To nie jest czyjaś subiektywna opinia. To jest zalecenie twórców PHP.
b4rt3kk
num_rows jest mniej wydajny od COUNT, bo w pierwszym przypadku zapytanie pobiera wszystkie wyniki, w drugim są jedynie zliczane. W celu tylko sprawdzenia ilości wyników, bez konieczności ich przetwarzania nie należy stosować num_rows.

  1. $row=mysql_fetch_array(mysql_query("SELECT COUNT(id_oceny) as glosowal FROM glosy WHERE id_utworu='$id_utworu' AND id_usera='$id_usera'"));
  2. $glosowal = $row['glosowal'];
bostaf
Cytat(b4rt3kk @ 9.10.2012, 13:51:44 ) *
num_rows jest mniej wydajny od COUNT

Zdecydowanie. Chociaż subiektywnie objawia się to przy dużej ilości wierszy.
Dla przykładu wyniki eksperymentu z tabelą z 20 000 wierszy i z tabelą z 2 000 000 wierszy (tylko dwie takie same kolumny w obu):
  • 20 tys. wierszy
    • Liczenie z "COUNT(*)": około 0,0002 sek.
    • Liczenie z "SELECT id": około 0,0400 sek.
    Czyli COUNT(*) o dwa rzędy wielkości szybciej, ale różnica dla odbiorcy subiektywnie niezauważalna.
  • 2 mln. wierszy
    • Liczenie z "COUNT(*)": około 0,0002 sek.
    • Liczenie z "SELECT id": około 4,8000 sek.
    Różnica jest już powalająca.

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.