Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Problem z if
Forum PHP.pl > Forum > Przedszkole
Manifested01
Więc tak zrobiłem taki mały system głosowania: ktos wchodzi na link ktory dostał w emailu i wtedy dodaje się głos do kolumny licznik. Wszystko by było ok gdyby nie to że przy odswiezeniu dodaje się następny głos co się troche mija z celem:P
Dodałem więc kolumne user_activated default 0. Chodzi mi o to że musze napisac małą funkcje if ze jezeli user_activated == 0 to executuje skrypt a jak 1 to jest die tongue.gif . Napisałem coś takiego ale nie mam pojecia czemu za kazdym razem wyświetla mi się że "twój głos był już aktywowany" dla rekordów które mają 0 na 100% tongue.gif z góry dziękuje za pomoc. A tutaj kod:

  1. <?php
  2. include ('lib/dbc.php');
  3. $result = mysql_query("SELECT user_activated FROM Glosy WHERE emailglos='{$_GET[usr]}'");
  4.  
  5. if (!isset($_GET['usr']) && !isset($_GET['code']) && !isset($_GET['id']) )
  6.  
  7. $msg = &#092;"ERROR: Invalid code...\";
  8.  
  9. if(mysql_num_rows($result) ==1)
  10. {
  11. die (&#092;"Twój głos był już aktywowany.\");
  12. }
  13.  
  14. else
  15. exit();
  16.  
  17. $rsCode = mysql_query(&#092;"SELECT activation_code from Glosy where emailglos='$_GET[usr]'\") or die(mysql_error());
  18.  
  19. list($acode) = mysql_fetch_array($rsCode);
  20.  
  21. if ($_GET['code'] == $acode)
  22. {
  23.  
  24. mysql_query(&#092;"update petycje set licznik =licznik+1 where id='$_GET[id]'\") or die(mysql_error());
  25.  
  26. mysql_query(&#092;"update Glosy set user_activated=1 where emailglos='$_GET[usr]'\") or die(mysql_error());
  27.  
  28.  
  29.  
  30. echo &#092;"
  31. [b]Dziękujemy [/b]
  32. Twoje głos zostało aktywowany. &#092;";
  33. } else
  34. { echo &#092;"Niepoprawny kod\"; }
  35.  
  36.  
  37. ?>
Spawnm
user_activated = 0
szukasz usera który ma jeszzce zapisane 0 tak więc przy num_rows dostaniesz 1 ;]
a u ciebie wtedy leci block zamiast programu, daj odwrotnie.
Manifested01
Nie jestem pewny ale jednak bede chyba obstawiał przy swoim:
to nie jest szukanie tylko test

jeśli user ma 0 (default) to znaczy ze pierwszy raz wchodzi na tą strone
i dodaje się +1 do licznika i jego pole user_activated sie updatuje do 1

a jesli ma już 1 to poprostu ma się wyświetlić "Już aktywowałeś swój głos"
nexis
Zrobiłbym to na dwóch tabelach o następującej budowie:

Kod
++++++++++++++++++++++++
+      invitation      +
++++++++++++++++++++++++
+ email + vARCHAR(128) +
+ code  + VARCHAR(32)  +
++++++++++++++++++++++++

++++++++++++++++++++++++
+         vote         +
++++++++++++++++++++++++
+ email + VARCHAR(128) +
++++++++++++++++++++++++


oraz poniższym kodzie:

  1. <?php
  2. // Sprawdzenie danych na wejściu
  3. if (!isset($_GET['email'], $_GET['code']) {
  4.   exit('Niepoprawny e-mail lub kod!');
  5. }
  6. // Sprawdzenie zgodności
  7. $query  = sprintf("SELECT COUNT(*) FROM `invitation` WHERE `email` = '%s' AND code = '%s'",
  8.                  mysql_real_escape_string($_GET['email']),
  9.                  mysql_real_escape_string($_GET['code']));
  10. $result = mysql_query($query);
  11. $row    = mysql_fetch_array($result, MYSQL_NUM);
  12. if (1 != $row[0]) {
  13.   exit('Nie możesz oddać głosu!');
  14. }
  15. // Oddanie głosu
  16. $query = sprintf("INSERT INTO `vote` (`email`) VALUES ('%s')",
  17.                 mysql_real_escape_string($_GET['email']));
  18. if (!mysql_query($query)) {
  19.   exit('Wystąpił błąd podczas oddawania głosu!');
  20. }
  21. // Usunięcie zaproszenia
  22. $query  = sprintf("DELETE FROM `invitation` WHERE `email` = '%s' AND code = '%s'",
  23.                  mysql_real_escape_string($_GET['email']),
  24.                  mysql_real_escape_string($_GET['code']));
  25. mysql_query($query);
  26. echo 'Dziękujemy za oddanie głosu!';
  27. ?>
Manifested01
dzięki nexis ale moja strona juz funkcjonuje i przenoszenie rekordów i generalnie struktury tabel kosztowało by mnie za dużo pracy
wolałbym więc edytować ten mój kod mysle ze to kwestia } albo jakiegos glupie błędu
PanGuzol
funkcja mysql_num_rows() zwraca Ci ilość pobranych rekordów a nie wartość pola user_activated.
Jeśli chcesz użyć tej funkcji to musisz dodać w zapytaniu SQL warunek WHERE user_activated=1
lub jeśli chcesz zostawić takie zapytanie odczytać wartość zwróconego rekordu funkcjami mysql_fetch_
Manifested01
czyli teraz ma byc tak ze jezeli result = 1
to die
a jak nie to executuje reszte skryptu

  1. <?php
  2. include ('lib/dbc.php');
  3. $result = mysql_query(&#092;"SELECT user_activated FROM Glosy WHERE emailglos='{$_GET[usr]}'\") or die(mysql_error());
  4.  
  5. if (!isset($_GET['usr']) && !isset($_GET['code']) && !isset($_GET['id']) )
  6.  
  7.  
  8. $msg = &#092;"ERROR: Invalid code...\";
  9.  
  10. if (mysql_fetch_array($result) == 1)
  11. {
  12.  
  13. } else {
  14.  
  15.  
  16. $rsCode = mysql_query(&#092;"SELECT activation_code from Glosy where emailglos='$_GET[usr]'\") or die(mysql_error());
  17.  
  18. list($acode) = mysql_fetch_array($rsCode);
  19.  
  20. if ($_GET['code'] == $acode)
  21. {
  22.  
  23. mysql_query(&#092;"update petycje set licznik =licznik+1 where id='$_GET[id]'\") or die(mysql_error());
  24.  
  25. mysql_query(&#092;"update Glosy set user_activated=1 where emailglos='$_GET[usr]'\") or die(mysql_error());
  26.  
  27.  
  28.  
  29.  
  30. echo &#092;"
  31. [b]Dziękujemy [/b]
  32. Twój głos został aktywowany. &#092;";
  33. } else
  34. { echo &#092;"Niepoprawny kod lub Twój głos był już aktywowany. \";
  35.  
  36.  
  37.  
  38. }
  39.  
  40.  exit();
  41. ?>


i błąd Parse error: syntax error, unexpected $end in /home/users/sobolczyk_moja/www/w/activatevote.php on line 70


PanGuzol
Brakuje Ci jednego nawiasu }

mysql_fetch_array zwróci Ci tablicę

array( 0 => wartość, 'user_activated' => wartość)

więc nie wystarczy porównać wyniku zwróconego przez tą funkcje, musisz jeszcze odwołać się do któregoś z elementów zwróconej tablicy.
Manifested01
nie mam pojecia co z tym zrobic przeczytalem o mysql fetch array ale nic mi to nie dało...

  1. <?php
  2. include ('lib/dbc.php');
  3.  
  4. if (!isset($_GET['usr']) && !isset($_GET['code']) && !isset($_GET['id']) )
  5.  
  6.  
  7. $msg = "ERROR: Invalid code...";
  8.  
  9. $query  = mysql_query("SELECT user_activated FROM Glosy WHERE emailglos='{$_GET[usr]}'") or die(mysql_error());
  10. $result = mysql_fetch_array($query);
  11. if ($result == 1) {
  12. exit('Nie możesz oddać głosu!');
  13. } else {
  14.  
  15. }
  16.  
  17.  
  18. $rsCode = mysql_query("SELECT activation_code from Glosy where emailglos='$_GET[usr]'") or die(mysql_error());
  19.  
  20. list($acode) = mysql_fetch_array($rsCode);
  21.  
  22. if ($_GET['code'] == $acode)
  23. {
  24.  
  25. mysql_query("update petycje set licznik =licznik+1 where id='$_GET[id]'") or die(mysql_error());
  26.  
  27. mysql_query("update Glosy set user_activated=1 where emailglos='$_GET[usr]'") or die(mysql_error());
  28.  
  29.  
  30.  
  31.  
  32. echo "<h3>Dziękujemy </h3>Twój głos został aktywowany. </a>";
  33. } else
  34. { echo "Niepoprawny kod lub Twój głos był już aktywowany. ";
  35.  
  36.  
  37.  
  38. }
  39.  
  40.  exit();
  41. ?>


teraz po odswieżeniu sie dodaje kolejny głos...
PanGuzol
  1. <?php
  2. if($result[0] == 1)
  3. ?>

lub
  1. <?php
  2. if($result['user_activated'] == 1)
  3. ?>
Manifested01
dzięki bardzo już działa smile.gif 1 opcja zadziałała

ale teraz mam jeszcze jeden problem:

w tej funkcji chodzi o to że jesli email był już dodany do bazy to nie mozna oddac głosu w ogóle
a ja bym chciał zrobić cos takiego że email moze sie powtarzać ale do róznych głosowań
czyli powinno być cośtakiego czyli

email: cos@o2.pl id:7
email: cos@o2.pl id:7 takie cos 2 razy nie moze byc ale np

email: cos@o2.pl id:7
email: cos@o2.pl id:3 takie coś moze byc

where emailglos='$_POST[emailglos]' and idglos='$_POST[id]'

  1. <?php
  2. $rs_duplicates = mysql_query("select emailglos from Glosy where emailglos='$_POST[emailglos]'");
  3.    $duplicates = mysql_num_rows($rs_duplicates);
  4.    
  5.    if ($duplicates > 0)
  6.    {    
  7.    //die ("ERROR: User account already exists.");
  8.    echo "Już oddałes głos z tego emaila.";
  9.    exit();
  10.    }
  11. ?>
PanGuzol
Podałeś dobry warunek ale w kodzie go nie zastosowałeś, użyłeś tylko jednego warunku z dwóch.

PS: poczytaj sobie o SQL Injection
Manifested01
heh no ok ale możesz mi powiedzieć jak w takim razie użyć drugiego ?

i czy zrobiłem jakis konkretny kod z sql injection?
PanGuzol
Dokładnie tak jak napisałeś
  1. WHERE emailglos='$_POST[emailglos]' AND idglos='$_POST[id]'


Wrzucasz do zapytania wartości przesłane przez użytkownika bez sprawdzenia ich, czyli twój kod jest podatny na atak SQL Injection.
Manifested01
ok a skoro to jest dział Przedszole
możesz mi powiedzieć jak je "sprawdzić" ?
piotrooo89
filtracja danych mysql_real_escape_string
Manifested01
dobra przeczytałem ten artykul w manualu ale nie umiem zaadaptować tego w moim skrypcie
probowalem pare razy wszystko konczylo sie błędami ale nie bede pokazywal kodu bo na 120% zrobilem cos maksymalnie głupiego
więc jesli ktos byłby tak miły i mi to zedytował to bede umiał na przyszłosc i na pewno ktos z tego skorzysta jeszcze...
piotrooo89
Cytat(Manifested01 @ 28.02.2009, 11:00:53 ) *
  1. <?php
  2. $result = mysql_query("SELECT user_activated FROM Glosy WHERE emailglos='{$_GET[usr]}'");
  3.  
  4. $rsCode = mysql_query("SELECT activation_code from Glosy where emailglos='$_GET[usr]'") or die(mysql_error());
  5.  
  6. mysql_query("update petycje set licznik =licznik+1 where id='$_GET[id]'") or die(mysql_error());
  7.  
  8. mysql_query("update Glosy set user_activated=1 where emailglos='$_GET[usr]'") or die(mysql_error());
  9. ?>


w tych wszystkich miejscach pobierasz coś z tablicy super globalnej GET. filtruj tak (jest to mój sposób).

  1. <?php
  2. $usr = mysql_real_escape_string($_GET['usr']);
  3. $id = mysql_real_escape_string($_GET['id']);
  4. $result = mysql_query("SELECT user_activated FROM Glosy WHERE emailglos='".$usr."'");
  5.  
  6. $rsCode = mysql_query("SELECT activation_code from Glosy where emailglos='".$usr."'") or die(mysql_error());
  7.  
  8. mysql_query("update petycje set licznik =licznik+1 where id='".$id."'") or die(mysql_error());
  9.  
  10. mysql_query("update Glosy set user_activated=1 where emailglos='".$usr."'") or die(mysql_error());
  11. ?>
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.