Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Sesja - błędy w kodzie
Forum PHP.pl > Forum > Przedszkole
ebate
Ot kod który ma działać (a powinien przynajmniej w zamyśle) następująco: losują się 2 zdjęcia, klikam na jakieś zdjęcie przez co dodaje wartość=1 do odpowiednich danych w bazie, a następnie losuje kolejne 2, itak w kólko.

Podany kod tak raczej nie działa, z sesjami bawię się od dziś więc jakby ktoś dojrzał jakieś błędy niech je napisze.
  1. require('conn.php');
  2.  
  3.  
  4.  
  5. $_SESSION['zdj_first']=("$wykonaj = mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1");
  6.  
  7.  
  8. while($wiersz = mysql_fetch_array($wykonaj))
  9.  
  10. {
  11.  
  12. echo '<a href=glosowaniem.php><img height="200" width="175" src="'.$wiersz['sciezka'].'"/></a>';
  13.  
  14. }");
  15.  
  16. $_SESSION['zdj_second']=("$wykonaj1 = mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1");
  17.  
  18.  
  19. while($wiersz1 = mysql_fetch_array($wykonaj1))
  20.  
  21. {
  22.  
  23. echo '<a href=glosowaniem.php><img height="200" width="175" name="przycisk" src="'.$wiersz1['sciezka'].'"/></a>';
  24.  
  25. }");
  26.  
  27. if($_SESSION['zm_sesji']) {
  28.  
  29. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='.$wiersz['sciezka'].'");
  30.  
  31. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='.$wiersz1['sciezka'].'");
  32.  
  33. }
  34.  
  35. if($_SESSION['zdj_second']) {
  36.  
  37. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='.$wiersz['sciezka'].'");
  38.  
  39. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='.$wiersz1['sciezka'].'");
  40.  
  41. }
  42.  
  43.  
kadlub
Nie wiem jaki masz błąd bo nie napisałeś ale
daje się na samym początku pliku
ebate
Rozumiem, że session_start(); ma być przed require('conn.php');. Poprawiony kod wygląda następująco:

  1. <?php
  2.  
  3. require('conn.php');
  4.  
  5.  
  6. $_SESSION['zdj_first']=("$wykonaj = mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1");
  7.  
  8. while($wiersz = mysql_fetch_array($wykonaj))
  9.  
  10. {
  11.  
  12. echo '<a href=glosowaniem.php><img height="200" width="175" src="'.$wiersz['sciezka'].'"/></a>';
  13.  
  14. }");
  15.  
  16. $_SESSION['zdj_second']=("$wykonaj1 = mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1");
  17.  
  18. while($wiersz1 = mysql_fetch_array($wykonaj1))
  19.  
  20. {
  21.  
  22. echo '<a href=glosowaniem.php><img height="200" width="175" name="przycisk" src="'.$wiersz1['sciezka'].'"/></a>';
  23.  
  24. }");
  25.  
  26.  
  27. if($_SESSION['zdj_first']) {
  28.  
  29. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='.$wiersz['sciezka'].'");
  30.  
  31. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='.$wiersz1['sciezka'].'");
  32.  
  33. }
  34.  
  35. if($_SESSION['zdj_second']) {
  36.  
  37. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='.$wiersz1['sciezka'].'");
  38.  
  39. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='.$wiersz['sciezka'].'");
  40.  
  41. }
  42.  
  43.  
  44. ?>

kadlub
działa questionmark.gif
a jak nie to jakie błędy??
ebate
Niestety, ciągle wyskakiwał błąd:
Parse error: syntax error, unexpected T_STRING in C:\xampp\htdocs\PIOTR\glosowaniem.php

Więc pousuwałem przy zmiennych $_SESSION znaki (""), a następnie znowu wyskoczył błąd:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\xampp\htdocs\PIOTR\glosowaniem.php on line 30
kadlub
  1.  
  2. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='".$wiersz['sciezka']."'");
ebate
W końcu nie wywala błędów. Tylko, że dalej jest pewnie problem. W zamyśle po kliknięciu na jedno ze zdjęć dodaje 1 punkt do odpowiedniego pola bazie (wygrana lub przegrana). Niestety, nic nie dodaje. Czy błędem jest to, że aktualnie pole wygrana bądź przegrana nie mają żadnej wartości?
kadlub
pokaż kod po wszystkich poprawkach
ebate
  1. <?php
  2.  
  3. require('conn.php');
  4.  
  5.  
  6. $_SESSION['zdj_first']=$wykonaj = mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1");
  7.  
  8. while($wiersz = mysql_fetch_array($wykonaj))
  9.  
  10. {
  11.  
  12. echo '<a href=glosowaniem.php><img height="200" width="175" src="'.$wiersz['sciezka'].'"/></a>';
  13.  
  14. };
  15.  
  16. $_SESSION['zdj_second']=$wykonaj1 = mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1");
  17.  
  18. while($wiersz1 = mysql_fetch_array($wykonaj1))
  19.  
  20. {
  21.  
  22. echo '<a href=glosowaniem.php><img height="200" width="175" name="przycisk" src="'.$wiersz1['sciezka'].'"/></a>';
  23.  
  24. };
  25.  
  26.  
  27. if($_SESSION['zdj_first']) {
  28.  
  29. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='".$wiersz['sciezka']."'");
  30.  
  31. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='".$wiersz1['sciezka']."'");
  32.  
  33. }
  34.  
  35. if($_SESSION['zdj_second']) {
  36.  
  37. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='".$wiersz1['sciezka']."'");
  38.  
  39. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='".$wiersz['sciezka']."'");
  40.  
  41. }
  42.  
  43.  
  44. ?>
kadlub
myślę że jak losujesz z bazy jeden rekord to pętle while nie są ci potrzebne w warunkach zapytania masz .$wiersz['sciezka']. a to chyba będzie dostępne tylko wewnątrz pętli a i jeszcze jedno nie wiem skąd skrypt ma wiedzieć kiedy został wciśnięty przycisk.
ebate
No właśnie nad tym głowie się już trochę. Może pomoże Ci to, co nospor napisał:

Przedewszystkim, to w sesji musisz zapisać wylosowane rekordy. Przecież jak user kliknie w obrazek, to ty po przeładowaniu strony znowu losujesz i wylosowane rekordy są już inne niż z paczki dwóch co koleś klikał.

Po kliknieciu sprawdzasz w sesji, czy dany klik jest i jak jest to juz wszystko masz co chciałeś. Jednemu dajesz wygrana a drugiem przegrana
mortus
1. Identyfikator użytkownika, którego zdjęcie zostało kliknięte musisz przekazać w adresie url:
  1. <a href="glosowaniem.php?id=ID">...</a>

2. Do wylosowania dwóch unikalnych użytkowników posłuż się zapytaniem:
  1. SELECT * FROM `user` WHERE `plec` = 'mężczyzna' ORDER BY RAND() LIMIT 2

Pamiętaj jednak, że przy dużej liczbie rekordów w bazie danych tego rodzaju zapytania są bardzo wolne.
3. W sesji zapisujesz identyfikator wyniku zapytania, a powinieneś raczej zapisać po prostu odpowiedni wiersz z bazy danych
  1. // korzystając z powyższego zapytania
  2. $wynik = mysql_query($zapytanie);
  3. while($wiersz = myslq_fetch_assoc($wynik)) {
  4. $_SESSION['wylosowani_uzytkownicy'][$wiersz['id']] = $wiersz;
  5. // a tutaj wyświetlanie adresu url w odpowiedniej formie (wspomniałem wyżej) oraz zdjęcia
  6. }

4. Teraz po kliknięciu na któreś ze zdjęć w tablicy $_GET['id'] powinieneś mieć identyfikator użytkownika, którego zdjęcie zostało kliknięte. Porównujesz ten identyfikator z danymi zapisanymi w sesji (a dokładniej w $_SESSION['wylosowani_uzytkownicy']) i wykonujesz odpowiednie UPDATE-y.
5. W zapytaniach UPDATE powinieneś się posługiwać raczej identyfikatorami (id), które są przechowywane w sesji, aniżeli ścieżką do zdjęcia/obrazka, jak to robisz teraz.
kadlub
Cytat(mortus @ 5.11.2011, 14:05:57 ) *
Porównujesz ten identyfikator z danymi zapisanymi w sesji (a dokładniej w $_SESSION['wylosowani_uzytkownicy']) i wykonujesz odpowiednie UPDATE-y.



hmmm nie wiem czy to będzie działało bo po kliknięciu na link zostaną wylosowane nowe rekordy i przypisane do sessi a w get będzie wynik wcześniejszego losowania więc ten warunek nie będzie spełniony
mortus
Cytat(kadlub @ 5.11.2011, 14:49:17 ) *
hmmm nie wiem czy to będzie działało bo po kliknięciu na link zostaną wylosowane nowe rekordy i przypisane do sessi a w get będzie wynik wcześniejszego losowania więc ten warunek nie będzie spełniony

Przecież można najpierw porównać $_GET['id'] z zawartością sesji, a dopiero później wylosować nowe wartości, a można nawet i ich nie losować. Punkty nie oznaczały kolejności działań.
ebate
A więc oto mój aktualny kod. Niestety, w dalszym ciągu nie dodaje punktów w bazie

  1. <?php
  2.  
  3.  
  4. require('conn.php');
  5.  
  6. $wynik = mysql_query("SELECT * FROM `user` WHERE `plec` = 'mężczyzna' ORDER BY RAND() LIMIT 2");
  7.  
  8. while($wiersz = mysql_fetch_assoc($wynik))
  9.  
  10. {
  11.  
  12. $_SESSION['wylosowani_uzytkownicy'][$wiersz['id']] = $wiersz;
  13.  
  14. echo '<a href="glosowaniem.php?id=ID"><img height="200" width="175" name="przycisk" src="'.$wiersz['sciezka'].'"/></a>';
  15.  
  16. }
  17.  
  18. if($_SESSION['wylosowani_uzytkownicy']==$_GET['id'])
  19.  
  20. {
  21.  
  22. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE id='".$_GET['id']==$_GET['id']."'");
  23.  
  24. }
  25.  
  26.  
  27. ?>


Zaktualizowałem kod
kadlub
  1. $wykonaj=mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1")or die(mysql_error());
  2. $wiersz = mysql_fetch_array($wykonaj);
  3.  
  4. $wykonaj1=mysql_query("SELECT * FROM user WHERE plec='meżczyzna' ORDER BY rand() limit 1")or die(mysql_error());
  5. $wiersz1 = mysql_fetch_array($wykonaj1);
  6.  
  7. echo '<a href=glosowaniem.php?pierwszy=1&wyg='.$wiersz['sciezka'].'&prze='.$wiersz1['sciezka'].'><img height="200" width="175" src="'.$wiersz['sciezka'].'"/></a>';
  8. echo '<a href=glosowaniem.php?drugi=1&wyg='.$wiersz['sciezka'].'&prze='.$wiersz1['sciezka'].'><img height="200" width="175" name="przycisk" src="'.$wiersz1['sciezka'].'"/></a>';
  9.  
  10. if(isset($_GET['pierwszy'])) {
  11.  
  12. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='".$_GET['wyg']."'")or die(mysql_error());
  13.  
  14. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='".$_GET['prze']."'")or die(mysql_error());
  15.  
  16. }
  17.  
  18. if(isset($_GET['drugi'])) {
  19.  
  20. mysql_query("UPDATE user SET wygrana=wygrana+1 WHERE sciezka='".$_GET['prze']."'") or die(mysql_error());
  21.  
  22. mysql_query("UPDATE user SET przegrana=przegrana+1 WHERE sciezka='".$_GET['wyg']."'")or die(mysql_error());
  23.  
  24.  
  25. }


zobacz to tylko jest z tym jeden problem po kliknięciu odświeżenia strony zaktualizuje znów ten rekord


ebate
Powiem Ci że.... DZIAŁA!

Wszystko jest ok,tylko, jak wspomniałeś, Po kliknięciu rozdaje odpowiednio po punkcie i losuje inne zdjecia (jak powinno być), zaś przy ręcznym odświeżaniu dodaje punkty poprzednim zdjęciom, które dostało ostatnio punkty i losuje nowe, więc prawie wszystko jest OK!

I dzięki wszystkim za dotychczasowe poświęcenie mi waszego czasu.

Kurcze, nie rozumiem dlaczego tak się dzieje. Przecież przy odświeżaniu zaczyna się nowa sesja, więc nie powinno nic dodawać.
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.