Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] JEDNORAZOWE wykonanie zapytania do MySQL ...
Forum PHP.pl > Forum > PHP
modern-web
Witam serdecznie smile.gif
Posiadam skrypt na generowanie rekordów z bazy danych:
  1. <?php
  2.  
  3.  
  4. include "sprawdzacz.php";
  5.  
  6. include('config.php');
  7.  
  8.  
  9. $query1 = 'UPDATE token SET used_by = "'.session_id().'" WHERE used_by = 0 ORDER BY id ASC LIMIT 1;';
  10. mysql_query($query1);
  11.  
  12.  
  13. $query = 'SELECT token FROM token WHERE used_by = "'.session_id().'" ORDER BY id DESC LIMIT 1;';
  14. mysql_query($query);
  15.  
  16.  
  17.  
  18. $result=mysql_query($query);
  19.  
  20.  
  21.  
  22. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  23.  
  24.  
  25. {
  26.  
  27. $token=mysql_result($result,"token");
  28.  
  29. echo "$token";
  30.  
  31. }
  32.  
  33. ?>


Przy strukturze bazy danych:
  1. id token used_by
  2. 1 asewdsad 0
  3. 2 dsgsdgsds 0
  4. 3 sdfdsfsdfs 0
  5. 4 dsfsdfsghs 0

Podstawowo w used_by jest wartośc 0 lecz po wykonaniu zapytania zmienia się na identyfikator sesji...


Moje pytanie jest następujące:
Przy odświerzaniu strony zapytanie wykonuje się na nowo...
Jest jakiś sposób by wykonywał się TYLKO RAZ?
Nie wiem... COOKIES, SESJE, cokolwiek... byle by zabezpieczyć reszte kodów...
Zresztą zauważyłem, że można to zrobić tak:

1. wykonuje się zapytanie
2. zapisuje się ID Sesji w used_by
3. pokazuje się kod
4. zamiast po F5 (odświerzeniu) losował się nowy kod ustawić jakiś parametr by ten ID SESJI mógł zobaczyć kod, który uzyskał właśnie jego ID SESJI...

Takie coś chyba da się zrobić ale ja nie wiem jak sad.gif

Prosze o pomoc.
ersiu
za pomocą cookies.
"3600" <- czas trwania ciasteczka, ustawione na 1h.
ID SESSJI znajduje się w ciasteczku $_COOKIE["sesid"], jeżeli ciasteczko nie istnieje wtedy generuje nową wartość.

  1. <?
  2. include "sprawdzacz.php";
  3. include('config.php');
  4. if(!$_COOKIE["sesid"]){
  5. $ses = session_id();
  6. $query1 = 'UPDATE token SET used_by = "'.$ses.'" WHERE used_by = 0 ORDER BY id ASC LIMIT 1;';
  7. mysql_query($query1);
  8. setCookie("sesid", $ses, 3600);
  9. }
  10. $query = 'SELECT token FROM token WHERE used_by = "'.session_id().'" ORDER BY id DESC LIMIT 1;';
  11. mysql_query($query);
  12. $result=mysql_query($query);
  13. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  14. $token=mysql_result($result,"token");
  15. echo "$token";
  16. ?>
modern-web
Widzę, że wiesz o co mi chodzi.
Ale właśnie sprawdziłem Twój sposób - nie działa ;/
Zapytanie i tak się wykonuje... Generowane są kolejne kody ;|
Wie ktoś w czym jest błąd lub ma inna propozycję?
thek
Pomyśl tak.... Sprawdzanie istnienia wpisu o podanym session_id na samym starcie skryptu smile.gif Wiem, że to dodatkowe zapytanie do bazy, ale pamiętaj, że SELECT będący po UPDATE jest warunkowy. O co mi chodzi? Ów SELECT następuje tylko gdy UPDATE faktycznie się dokonał, a więc gdy mysql_affected_rows zwróci coś innego niż 0. Można więc napisać to tak:
- robimy zapytanie wyciągające kod o podanym session_id,
- jeśli dostaniemy coś, to znaczy, że kod już dla tego session_id istnieje i po prostu go wyświetlamy,
- jeśli kod nie istnieje to robimy update rezerwując jeden z puli pozostałych,
- jeśli mysql_affected_rows zwróci coś innego niż 0 to podajemy ten kod
- jeśli dostaniemy z mysql_affected_rows 0 to wyświetlamy info o braku wolnych kodów smile.gif

Chyba prosty algorytm? winksmiley.jpg
modern-web
Próbowałem przyporządkować mysql_affected_rows do tego skryptu. Wyskakiwał błąd... nie pamiętam treści...
Nie do końca Ciebie rozumiem... Przed UPDATE mam zrobić jeszcze inne zapytanie czy jak?
Miło by było gdybyś podał jakiś przykład
thek
Tak... Przed UPDATE sprawdź czy istnieje w bazie już rekord z określonym session_id. Jeśli tak, to znaczy, że kod już jest w bazie i nie musisz rezerwować go dla owego usera, Tak więc wtedy UPDATE możesz sobie darować. A chyba o to Ci chodziło z tego co wywnioskowałem smile.gif Zauważ, że wtedy przy przeładowaniu już kod z podanym session_id znajdzie i nie zarezerwuje nowego. No chyba, że w międzyczasie zajdzie sytuacja z regeneracja id sesji. No ale to niezwykle rzadkie przypadki.

Pseudokod:
  1. $res = query('SELECT kod FROM codes WHERE used by = \''.session_id().'\'');
  2. if( $res AND sql_num_rows($res) > 0 ) {
  3. //wyświetl ów kod
  4. } else {
  5. $nowy = query( 'UPDATE token SET used_by = \''.$sesion_id().'\' WHERE used_by = 0 ORDER BY id ASC LIMIT 1' );
  6. if( $nowy AND sql_affected_rows() > 0 ) {
  7. $kod = query( 'SELECT token FROM token WHERE used_by = \''.session_id().'\' ORDER BY id DESC LIMIT 1' );
  8. if( $kod AND sql_num_rows( $kod ) > 0 ) {
  9. //wyświetl kod
  10. } else {
  11. //komunikat błędu
  12. }
  13. } else {
  14. //komunikat błędu
  15. }
  16. }
modern-web
Rozumiem, ze w tym przypadku wszędzie zastosować muszę frazę if( $kod AND sql_num_rows( $kod ) > 0 ) zamiast. mysql_query($query1); ?
Bo zapytanie już chyba wiem jak zbudowac. A } else { chyba są tutaj zbędne ;0

Zapytanie przed UPDATE bedziewiec takie?:
  1. $query2 = query('SELECT token FROM token WHERE used_by = \''.session_id().'\'');
  2. if( $query2 AND sql_num_rows($query2) > 0 ) {
thek
Jedynymi rzeczami jakie musisz zrobić to wstawienie odpowiedniej partii kodu w miejsca przeze mnie opisane, czyli wyświetlanie kodu lub błędu. No i oczywiście zastosowanie mssql, mysql, mysqli czy pgsql bądź innych w zależności od stosowanej bazy danych.

Przyjrzyj się strukturze pseudo-kodu i przeanalizuj co on robi a sam odpowiesz sobie na pytanie "Co muszę poprawić/dopisać?". To naprawdę nie jest trudne. Myślę, że sobie z tym powinieneś poradzić gdy po prostu spokojnie siądziesz i popatrzysz co on ma robić. To nie jest fizyka kwantowa tylko kilka prostych warunków, które w zależności od wyniku coś wykonują bądź nie.
modern-web
Ok. Zrobiłem tak jak radziłeś...
Cały czas wyskakuje mi błąd w } else {

KOD:
  1. <?php
  2.  
  3.  
  4. include "sprawdzacz.php";
  5.  
  6. include('config.php');
  7.  
  8.  
  9. $res = query('SELECT token FROM token WHERE used by = \''.session_id().'\'');
  10. if( $res AND sql_num_rows($res) > 0 )
  11.  
  12. {
  13. echo "<center>$token</center>";
  14. } else {
  15.  
  16. $nowy = query( 'UPDATE token SET used_by = \''.session_id().'\' WHERE used_by = 0 ORDER BY id ASC LIMIT 1' );
  17. if( $nowy AND sql_affected_rows() > 0 )
  18.  
  19. $kod = query( 'SELECT token FROM token WHERE used_by = \''.session_id().'\' ORDER BY id DESC LIMIT 1' );
  20. if( $kod AND sql_num_rows( $kod ) > 0 )
  21.  
  22. $result=mysql_query($query);
  23.  
  24.  
  25.  
  26. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  27.  
  28.  
  29. {
  30.  
  31. $token=mysql_result($result,"token");
  32.  
  33. echo "<center>$token</center>";
  34.  
  35. }
  36.  
  37. } else {
  38. BLAD 1
  39. }
  40. } else {
  41. BLAD 2
  42. }
  43. }
  44.  
  45. ?>

Próbowałem wiele sposobów... wszystko przyporządkowałem poprawnie - w każdym razie tak sądzę.
Wiesz może co w tym kodzie powoduje ten błąd? Zawsze zapytanie zwracało błąd w wersach 20+ więc początek zrobiłem chyba poprawnie.
Pr0100
nic dziwnego że nie działa jak masz

  1. if (true) {
  2.  
  3. } else {
  4.  
  5. } else {
  6.  
  7. }
modern-web
Czyli tych }else{ nie powinno być... Dobrze rozumiem? Albo jakieś sugestie?
thek
Popatrz na wcięcia u mnie w pseudokodzie. Specjalnie stosuje je, by inni widzieli jaki blok jest gdzie. Na jakim poziomie zagnieżdżenia się on zaczyna, kończy i znajduje. Źle pozagnieżdżałeś te IFy w sobie i stąd masz błędy.
modern-web
Chodzi Tobie o brak { w 2 i 3 IFie (na końcu)? Fakt; tutaj chyba tez mam błąd haha.gif
Co do rozmieszczenia to są chyba dobrze. Może sprecyzowalbys dokładniej w którym fragmencie... Zawezi to mój obszar poszukiwań...
thek
to swoja drogą z tymi dwoma {, ale zauważ, ze potem masz otwarcie i zamknięcie bloku "z powietrza". Gdzie? Wokół
$token=mysql_result($result,"token");
echo "<center>$token</center>";
masz { i } które nie sa kompletnie z niczym związane. Popatrz na ten kod teraz:
  1. <?php
  2. include "sprawdzacz.php";
  3. include('config.php');
  4. $res = query('SELECT token FROM token WHERE used by = \''.session_id().'\'');
  5. if( $res AND sql_num_rows($res) > 0 ) {
  6. //tu brak mysql_result dla tokena
  7. echo "<center>$token</center>";
  8. } else {
  9. $nowy = query( 'UPDATE token SET used_by = \''.session_id().'\' WHERE used_by = 0 ORDER BY id ASC LIMIT 1' );
  10. if( $nowy AND sql_affected_rows() > 0 ) {
  11. $kod = query( 'SELECT token FROM token WHERE used_by = \''.session_id().'\' ORDER BY id DESC LIMIT 1' );
  12. if( $kod AND sql_num_rows( $kod ) > 0 ) {
  13. $result=mysql_query($query);
  14. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  15. $token=mysql_result($result,"token");
  16. echo "<center>$token</center>";
  17. } else {
  18. BLAD 1
  19. }
  20. } else {
  21. BLAD 2
  22. }
  23. }
  24. ?>
i powiedz, który lepiej się czyta? Twój z wszystkim pociągniętym do marginesu lewego czy może mój z wcięciami? smile.gif
modern-web
Bez porównania Twój łatwiej się czyta winksmiley.jpg

No dobrze. Poprawiłem na:
  1. <?php
  2. include "sprawdzacz.php";
  3. include('config.php');
  4. $res = mysql_query('SELECT token FROM token WHERE used by = \''.session_id().'\'');
  5. if( $res AND sql_num_rows($res) > 0 ) {
  6. $token=mysql_result($result,"token");
  7. echo "<center>$token</center>";
  8. } else {
  9. $nowy = mysql_query( 'UPDATE token SET used_by = \''.session_id().'\' WHERE used_by = 0 ORDER BY id ASC LIMIT 1' );
  10. if( $nowy AND sql_affected_rows() > 0 ) {
  11. $kod = mysql_query( 'SELECT token FROM token WHERE used_by = \''.session_id().'\' ORDER BY id DESC LIMIT 1' );
  12. if( $kod AND sql_num_rows( $kod ) > 0 ) {
  13. $result=mysql_query($query);
  14. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  15. $token=mysql_result($result,"token");
  16. echo "<center>$token</center>";
  17. } else {
  18. BLAD
  19. }
  20. } else {
  21. BLAD
  22. }
  23. }
  24. ?>

I tym razem pokazuje się podobny error jak poprzednio...
  1. Parse error: syntax error, unexpected '}' IN /home/modernwe/public_html/dotpay_kod_skrypty/main.php ON line 19

Wers 19 tyczy się } po pierwszym "BLAD" ;/
A i... zmieniłem na mysql_query smile.gif
Co tym razem radzisz szefie ;>? haha.gif
thek
Linie w tym kodzie ostatniego posta: 5, 10, 12... Czy istnieje funkcja sql_num_rows lub sql_affected_rows? winksmiley.jpg Przecież pisałem, że to pseudo-kod. dodaj przed nimi my by utworzyło mysql a powinno pójść.
modern-web
Nie działa... TEN SAM BŁĄD:
  1. Parse error: syntax error, unexpected '}' IN /home/modernwe/public_html/dotpay_kod_skrypty/main.php ON line 19

thek
Ech... Bo nie można na pałe tam wpisać BLAD... PHP nie wie co to takiego. Wpisz zamiast obu BLAD:
  1. echo 'Tu wyskoczy błąd, który muszę obsłużyć';
modern-web
Dobra wiadomość... Poprzednia błąd zniknął ;D, a zła ze mam kolejny ;/
  1. Warning: mysql_result(): supplied argument IS NOT a valid MySQL result resource IN /home/modernwe/public_html/dotpay_kod_skrypty/main.php ON line 15

Przecież mysql_result to prawidłowy argument MySQL :|
thek
A chociaż popatrzyłeś co wysyłasz do mysql_result jako zmienna czy nie? Bo jak dla mnie ten fragment Ci bruździ.
  1. if( $kod AND mysql_num_rows( $kod ) > 0 ) {
  2. $result=mysql_query($query);
  3. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  4. $token=mysql_result($result,"token");
  5. echo "<center>$token</center>";
  6. }
A czemu? Skoro wynik zapytania masz w $kod, to skąd Ci się bierze nagle mysql_query($query)?
Tam masz mieć po prostu:
  1. if( $kod AND mysql_num_rows( $kod ) > 0 ) {
  2. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  3. $token=mysql_result($kod,"token");//lub $token = mysql_result($kod, 0);
  4. echo "<center>$token</center>";
  5. }
. Bo tak masz zmienne w kodzie ni z gruchy ni z pietruchy smile.gif I pomyśl trochę sam też, bo można pomoc jeden raz, drugi, trzeci, ale nie jest nikt kompilatorem, by Ci non stop poprawiać proste błędy i wskazywać gdzie są. Chcesz być programistą PHP choć w minimalnym stopniu? Naucz się to zauważać sam.
modern-web
Nad tym teraz pomyślałem...:
Jakim cudem to może być złe umieszczone? mysql_result znowu mi tu szwankuje... Tym razem po "Wygenerowany kod".
  1. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  2. $token = mysql_result($result,"token");
  3. echo "<center>$token</center>";
  4. } else {


Błąd:
  1. Warning: mysql_result(): supplied argument IS NOT a valid MySQL result resource IN /home/modernwe/public_html/dotpay_kod_skrypty/main.php ON line 14


P.S.
Polecisz jakiej dobre tutoriale/kursy programowania w języku PHP?
thek
Ech... Przyjrzałeś się choć dobrze temu co wkleilem i co napisałem? Czy odróżniasz $result od $kod ?

Co do tutoriali, kursów to ja się uczyłem z dokumentacji i manuala wspomaganych przez google, bo taki mam "nawyk", ale dla większości to bardzo ciężka lektura do przełknięcia zważywszy na ilość stron do choćby pobieżnego przejrzenia.
modern-web
Faktycznie... $result = $kod. Teraz się wyświetla ale po odswiezeniu losuje się nowy kod ;/ punkt wyjścia...
thek
Sprawdź więc co za zapytania idą do bazy. Dzięki temu namierzysz ewentualny błąd. Od strony logiki oznaczało by to bowiem, że co odświeżenie zmienia się u Ciebie session_id. A tak może być jedynie gdy sesja ma ustawiony wysoki współczynnik regeneracji. Tyle, że to nie jest defaultowe ustawienie, a wątpie, że cokolwiek zmieniałeś.
modern-web
Nic nie zmienialem wiec musi to być błąd kodu...
  1. <?php
  2. include "sprawdzacz.php";
  3. include('config.php');
  4. $res = mysql_query('SELECT token FROM token WHERE used by = \''.session_id().'\'');
  5. if( $res AND mysql_num_rows($res) > 0 ) {
  6. $token = mysql_result($result,"token");
  7. echo "<center>$token</center>";
  8. } else {
  9. $nowy = mysql_query( 'UPDATE token SET used_by = \''.session_id().'\' WHERE used_by = 0 ORDER BY id ASC LIMIT 1' );
  10. if( $nowy AND mysql_affected_rows() > 0 ) {
  11. $kod = mysql_query( 'SELECT token FROM token WHERE used_by = \''.session_id().'\' ORDER BY id DESC LIMIT 1' );
  12. if( $kod AND mysql_num_rows( $kod ) > 0 ) {
  13. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  14. $token = mysql_result($kod,"token");
  15. echo "<center>$token</center>";
  16. } else {
  17. echo 'Tu wyskoczy b??d, który musz? obs?u?y?';
  18. }
  19. } else {
  20. echo 'Tu wyskoczy b??d, który musz? obs?u?y?';
  21. }
  22. }
  23. ?>


Wydaje mi się ze błąd jest w kolejności zapytania... Albo nie wiem ;/
thek
Pizę jeszcze raz... Wyświetl sobie JAK wyglądają zapytania idące do bazy. Poza tym myślałem, że po naprowadzeniu Cię z tym $kod przejrzysz całość ponownie. To nie jedyne bowiem miejsce gdzie tego samego babola walnąłeś. W szale poprawek poprawiłeś to w jednym miejscu źle, a w innym zapomniałeś to zrobić. Przejrzyj jeszcze raz zamiast co i rusz wklejać kod. Pisałem już, że forum i użytkownicy tutaj to nie "inteligentny interpreter php" który napisze Ci gdzie błąd i jak go poprawić. Naucz myśleć samodzielnie zanim będziemy musieli ten temat zamknąć bo zwyczajnie traktujesz forum teraz jak własne podwórko wrzucając co i rusz nowe wersje bez przemyślenia. Popatrz na błędy jakie Ci wypluwa interpreter i zacznij myśleć zanim po raz kolejny wciśniesz Dodaj Odpowiedź. Dostałeś niemal gotowca ode mnie, a i tak robisz proste błędy logiczne. To świadczy o naprawdę słabych podstawach PHP u Ciebie i powinieneś się za to wziąć jak najszybciej.
modern-web
Faktycznie pominalem ten fragment o ile się nie mylę...
  1. <?php
  2. include "sprawdzacz.php";
  3. include('config.php');
  4. $res = mysql_query('SELECT token FROM token WHERE used by = \''.session_id().'\'');
  5. if( $res AND mysql_num_rows($res) > 0 ) {
  6. $token1 = mysql_result($res,"token1");
  7. echo "<center>$token1</center>";
  8. } else {

W kodzie błędów nie widzę. Warningi nie wyswietlaja się już ale mysql_num_rows jakby nie działa ;/
thek
Właśnie dlatego mówiłem: "Sprawdzaj JAKIE zapytanie idzie do bazy." Jeśli idzie z jakimś bykiem to nigdy nie dowiesz się jakim, jeśli nie zobaczysz jak ono wygląda i nie sprawdzisz czy choćby session_id się nie zmienia. Pisałem o współczynniku regeneracji sesji. Poczytaj o tym, a sam zobaczysz, że takie coś MOŻE mieć miejsce. Trochę własnej inwencji w wyszukiwaniu błędów. Od strony kodu w zasadzie nie można się już przyczepić do czegoś konkretnego. Jeśli istnieje, to właśnie w wyniku jakichś drobiazgów. Jeśli bowiem po sprawdzeniu nie znajduje żadnych kodów z podanym session_id, to znaczy, że brak ich w bazie faktycznie lub... wcale sesja nie istnieje! Bo session_id() w przypadku braku sesji zwraca ciąg pusty. Dlatego możesz miec przez to głupoty w zapytaniu. I stąd ciągle się upraszam o sprawdzenie tego zapytania.
modern-web
PROBLEM ROZWIĄZANY!!!
przy $res było used by zamiast used_by smile.gif

Dziękuję za pomoc Thek. Znasz się na tym jak nikt inny ;D



TEMAT DO ZAMKNIĘCIA
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.