Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Głosowanie zalogowanego usera
-LUCU-
post
Post #1





Goście







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!
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


  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?


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
szalek01
post
Post #3





Grupa: Zarejestrowani
Postów: 129
Pomógł: 17
Dołączył: 17.09.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował szalek01 5.10.2012, 01:10:48


--------------------
PDO nie gryzie....
Go to the top of the page
+Quote Post
-LUCU-
post
Post #4





Goście







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. ?>
Go to the top of the page
+Quote Post
bostaf
post
Post #5





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #6





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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


Ten post edytował b4rt3kk 9.10.2012, 12:54:50


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
bostaf
post
Post #7





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 09:52