Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Dodawanie rekordu do bazy na podstawie zmiennych
Forum PHP.pl > Forum > Przedszkole
Matt23
Witam,
mam taki kodzik

  1. <?
  2.  
  3.  
  4. if($_POST['kod'] ['kwota'] ['user'])
  5. {
  6.  
  7. $KWOTA = $_POST['kwota'];
  8. $KOD = $_POST['kod'];
  9. $USER = $_POST['user'];
  10.  
  11. if(ctype_digit($KWOTA) && ctype_alnum($KOD)){
  12. $handle = fopen("http://proserwer.pl/p_api.php?c=3&i=72122&z=9816741327899623&f=$KWOTA&k=$KOD", 'r');
  13. $status = trim(fgets($handle, 8));
  14. fclose($handle);
  15. if(!$status == 'ok'){
  16.  
  17. $sql_conn = mysql_connect($adres_bazy, $baza_user, $baza_pass);
  18.  
  19. $spr=mysql_query("SELECT * from codes where code = '$KOD'"); //sprawdzenie czy kod został użyty
  20.  
  21. if(mysql_num_rows($spr)==1){
  22.  
  23. echo "Ten kod został już wykorzystany. Jeśli uważasz, że zaszła pomyłka, skontaktuj się z administratorem";
  24.  
  25. }
  26. else
  27. {
  28. $nick = mysql_query("SELECT * FROM users WHERE name LIKE '$USER'"); //czy wprowadzony w formularzu użytkownik istnieje
  29.  
  30. if(mysql_num_rows($nick) == 0)
  31. {
  32. echo "Nie ma takiego użytkownika!";
  33. }
  34. }
  35. else
  36. {
  37.  
  38. $pid = mysql_query("SELECT id FROM users WHERE name LIKE '$USER'"); //pobranie id usera
  39. $userid = $pid
  40.  
  41. $zapytanie = "INSERT INTO codes (`userid`, `user`, `code`, `money`, `expires`, `ip`, `data`) VALUES ('$userid', '$USER', '$KOD', '$KWOTA', '30', '".$_SERVER['REMOTE_ADDR']."', '".date('d-m-Y H:i:s T')."')"; //utowrzenie rekordu ze wcześniej pobranym id usera, nazwą, kodem, kwotą, ilością dni, ip i datą (główne pole "id" typu AI)
  42. $sprawdzenie = mysql_query($zapytanie);
  43.  
  44. $vip = "UPDATE users SET `vipactive`='1' WHERE name LIKE '$user'"; // dalszy ciąg przyznawania VIPa, teraz w tabeli users dodanie wartosci
  45. $vipes = $vip;
  46.  
  47. $czas = "UPDATE users SET expires=IF(expires>NOW(),expires,NOW())+INTERVAL 30 DAY"; //wstawienie czasu daty wygaśnięcia VIPa,
  48. $czasp = $czas;
  49. }
  50.  
  51. if((!$sprawdzenie) && (!$vipes) && (!$czasp)) //sprawdzenie czy rekordy dodane
  52. {
  53. echo "Bliżej nieznany błąd";
  54. }
  55. else
  56. {
  57. echo "Gratulacje, '$USER' aktywował konto VIP na 30 dni.";
  58. }
  59. }
  60. else
  61. {
  62. echo "Coś się spartoliło";
  63. }
  64. }
  65. }
  66.  
  67. ?>


Problem w tym, że po załadowaniu strony nie wyświetla się nic, nawet formularz, który znajduje się przed kodem php.

Na tyle na ile sie orientuję do 15. linijki wszystko jest ok (sprawdzałem dając echo tekst). Coś zepsułem w reszcie kodu. Byłbym wdzięczny, jakby mi ktos pomógł (kilka godzin się z tym męczę)

Większość pól w bazie typu varchar. Jedynie pola id w obu tabelach typu int, oraz pole expires typu date. Reszta pól, bez wzgledu czy to IP, data, czy tekst mają typ varchar.
Damonsson
Temat: Jak poprawnie zadac pytanie
Matt23
@up

Nie wiem, czym zawiniłem.
Turson
Włącz wyświetlanie błędów error_reporting to zobaczysz błąd w warunku
  1. if($_POST['kod'] ['kwota'] ['user'])

mianowicie powinno być
  1. if(isset($_POST['kod']) && isset($_POST['kwota']) && isset($_POST['user']))


W linii 40. zgubiłeś średnik


  1. if((!$sprawdzenie) && (!$vipes) && (!$czasp)) //sprawdzenie czy rekordy dodane
  2. {
  3. echo "Bliżej nieznany błąd";
  4. }

Tutaj błąd logiczny, powinno być or a nie and

Datę powinno się trzymać w typie kolumny do tego przeznaczonym, czyli date/datetime/timestamp a nie varchar
Matt23
@up

Dzięki za pomoc. Szkoda, że wcześniej nie zauważyłem, że raportowanie błędów jest wyłączone - sam nie wiem co myślałem. Wychodzi na to, że źle zastosowałem konstrukcję if i else, co juz poprawiłem. Niestety nie mogę sprawdzić poprawności działania skryptu, ponieważ baza mi siadła (uroki darmowych hostingów).

Jednak nie zgodzę się co do rzekomego błędu w 4. linijce. Taka sama konstrukcja, działa bez problemu w innym moim skrypcie.
Turson
Działa, bo tam też masz wyłaczone raportowanie błędów. Powinieneś ujrzeć błąd Warning: Illegal string offset
Matt23
Faktycznie, również był błąd, a error wyrzucał "Undefined index: adres" (pierwsza zmienna). Co ciekawe, tę metodę pobierania danych formularza doradził mi ktos na tym forum ;p

Z drugiej strony, skoro ta metoda działa, to chyba jest to error na wyrost?

Mam jeszcze pytanie, czy mam możliwość właczenia odgórnego raportowania błędów w mojej sytuacji, czy muszę korzystać z pliku do sprawdzania, jak robie to teraz? (wrzucenie odpowiedniego kodu na początek pliku php nie pokazuje błędów)
Turson
Z założenia kod nie powinien mieć błędów. Bodajże w php.ini możesz globalnie włączyć raportowanie błędów.
Matt23
Ok, ale z tego co sie orientuje, to muszę mieć specjalne uprawnienia do tego? Chociaż nie jestem pewien.

Zauważyłem jeszcze, że ten sam error dostaję ze zmienną get: "if($_GET['s']){"

Kiedy przeprawię tę linijkę w analogiczny sposób do reszty, dostaję błąd o wadliwej klamrze.
viking
Nie musisz mieć żadnych ekstra uprawnień.
Turson
Cytat(Matt23 @ 22.04.2014, 20:02:40 ) *
Ok, ale z tego co sie orientuje, to muszę mieć specjalne uprawnienia do tego? Chociaż nie jestem pewien.

Zauważyłem jeszcze, że ten sam error dostaję ze zmienną get: "if($_GET['s']){"

Kiedy przeprawię tę linijkę w analogiczny sposób do reszty, dostaję błąd o wadliwej klamrze.

if($_GET['s']) zwraca prawdę lub fałsz, a ty masz sprawdzić czy zmienna istnieje, czyli
  1. if(isset($_GET['s']))
Matt23
@up

Źle przepisałem poprzednim razem, dzięki za naprowadzenie.

  1. $pid = mysql_query("SELECT id FROM users WHERE name LIKE '$USER'");
  2. $userid = $pid;
  3.  
  4. $zapytanie = "INSERT INTO codes (`userid`, `user`, `code`, `money`, `expires`, `ip`, `data`) VALUES ('$userid', '$USER', '$KOD', '$KWOTA', '30', '".$_SERVER['REMOTE_ADDR']."', '".date('d-m-Y H:i:s T')."')";
  5. $sprawdzenie = mysql_query($zapytanie);
  6.  
  7. $vip = "UPDATE users SET `vipactive`='1' WHERE name LIKE '$user'";
  8. $vipes = $vip;
  9.  
  10. $czas = "UPDATE users SET expires=IF(expires>NOW(),expires,NOW())+INTERVAL 30 DAY";
  11. $czasp = $czas;
  12. }
  13.  
  14. if((!$sprawdzenie) || (!$vipes) || (!$czasp))
  15. {
  16. echo "Bliżej nieznany błąd";
  17. }
  18. else



Ech, errory - parser nie identyfikuje zmiennych z 14. linijki.

A zapytania i tak się nie nie wykonują, więc chyba są schrzanione, tylko nie wiem gdzie.

Przy okazji, po zmianie wersji php z 5.5 na 5.3 znikła połowa errorów związanych z połączeniem do bazy.
Turson
W insercie masz $userid, sprawdź jak pobiera się rekordy z bazy danych, bo samo mysql_query nie wystarczy.
Update nie robisz, to zwykły string, brakuje mysql_query
Matt23
Rozpaczliwie szukając błędu zakomentowałem resztę kodu i zrobiłem z pierwszym zapytaniem coś takiego

  1. $pid = mysql_query("SELECT id FROM users WHERE `name` = '$USER'");
  2. $userid = mysql_num_rows($pid);
  3. echo $userid;


Jak się pewnie każdy domyślił, nie wyświetla się nic. Nie wiem dlaczego, skoro po wpisaniu zapytania do bazy, lecz zamiast zmiennej podałem jedną z istniejących wartości dla `name`, wyświetla się prawidłowy wynik.

Czy ktoś mógłby mi wskazać gdzie robię błąd?
Turson
Jesteś pewien, że chodzi o pobranie ilości wierszy a nie rekordów? mysql_fetch_assoc
Matt23
Racja, nie tej wartości szukałem. Wieczorem się z tym rozprawię. Przynajmniej postaram się.

Dobra, stanęło na tym.

  1. $pid = mysql_query("SELECT id FROM users WHERE `name` = '$USER'");
  2. while($row = mysql_fetch_assoc($pid))
  3. {
  4. echo $row['id'];
  5. }


Nic się nie wyświetla, zero błędów. Ten kod jest zły, czy zapytanie.
Xart
Ten kod jest wadliwy...

  1. $pid = mysql_query("SELECT id FROM `users` WHERE `name` = '$user' "); // nazwy kolumn bierzesz w ` a nie były tego przy users
  2. while($row = mysql_fetch_assoc($pid)) { // a klamra do pętli to gdzie ?
  3. {
  4. echo $row['id'];
  5. }
  6. } // zamknięcie pętli
Matt23
  1. if(!$status == 'ok'){
  2.  
  3. $sql_conn = mysql_connect($adres_bazy, $baza_user, $baza_pass);
  4.  
  5. $spr=mysql_query("SELECT * from codes where code = '$KOD'");
  6.  
  7. if(mysql_num_rows($spr)==1){
  8.  
  9. echo "Ten kod został już wykorzystany. Jeśli uważasz, że zaszła pomyłka, skontaktuj się z administratorem";
  10.  
  11. }
  12. elseif(mysql_num_rows($spr)==0)
  13. {
  14. $nick = mysql_query("SELECT * FROM users WHERE name LIKE '$USER'");
  15.  
  16. if(mysql_num_rows($nick) == 0)
  17. {
  18. echo "Nie ma takiego użytkownika!";
  19. }
  20. }
  21. else
  22. {
  23.  
  24. $pid = mysql_query("SELECT id FROM `users` WHERE `name` = '$USER' ") or die(mysql_error());
  25. while($row = mysql_fetch_assoc($pid)) {
  26. {
  27. $x = $row['id'];
  28. echo $x;
  29. }
  30. }
  31. /*
  32. zakomentowane
  33. */
  34. }
  35.  
  36. /*
  37. zakomentowane
  38. */
  39. }
  40. else
  41. {
  42. echo "Coś się spartoliło";
  43. }
  44. }
  45. }
  46.  
  47. ?>


@up

Nie rozumiem dlaczego nadal nie wyświetla mi id, nawet gdy dam echo $row['id'];. W oddzielnym skrypcie, gdzie jest tylko kod na pobranie id z bazy wyświetla się bez problemu. Tutaj nic, żadnych errorów. Zła konstrukcja reszty kodu?
viking
Zrób var_dump(mysql_num_rows($spr)) i zobacz jaki jest wynik. Bo może zwraca więcej niż 1 albo false.

Po drugie: SELECT * FROM users WHERE name LIKE '$USER' Dlaczego sprawdzasz w ten sposób? Jeśli masz użytkowników tom, tomasz, tomx to będzie prawda prawda dla nich wszystkich.

Po trzecie. Pewnie da radę to jednym zapytaniem zapisać zamiast tak męczyć bazę.
Matt23
Zastanawia mnie, czy w tej konstrukcji wykonuje się ostatni "else" (14) jeśli pierwszy "if" (2) się niepotwierdza?

  1.  
  2. if(!$status == 'ok'){
  3.  
  4. kod php
  5.  
  6. if(mysql_num_rows($spr)==1){
  7.  
  8. kod php
  9. }
  10. elseif(mysql_num_rows($spr)==0)
  11. {
  12. kod php
  13. }
  14. else
  15. {
  16. kod php
  17. }
  18. }


Może problem leży w tym, że warunki z ostatniego else, czyli te dodające wpisy do bazy nie wykonują się z powodu złej konstrukcji całego kodu?
viking
Zwracałem ci na to uwagę dopiero co. Czytasz komentarze?
Matt23
Nie doszukałem się od Ciebie żadnej wzmianki na temat ifów...

A var dump $spr zwraca int(1) - chyba dobrze.

Zresztą powinno być dobrze, bo sprawdzenie czy użytkownik istnieje działa, oraz sprawdzenie czy kod został wykorzystany również działa. Chrzani sie przy pobraniu id od zmiennej $USER, mimo że w osobnym skrypcie, który też miał za zadanie pobrać to id wszystko działa i się wyświetla.
viking
Byłą, pierwsze zdanie. Teraz przeczytaj drugie. Znajdź różnicę międzu kolumna = wartość a kolumna like wartość. Póki co wybierasz losowe dane więc dostajesz losowe wyniki.
Matt23
Tą informację akurat odebrałem i mimo że jeszcze nie przeprawiłem, to ze skryptu korzystam z nowej bazy w której jest 4 userów, z zupełnie innymi nickami. Rozumiem, ze przy większej ilości jest istotne czy używam Like, czy nie, ale tutaj jeszcze nie powinno mi powodować problemów.

Ok, dzięki za pomoc, a w szczególności za jej brak. Rozumiem, że powiedzenie mi gdzie dokładnie zrobiłem błąd, jest zbyt wymagające i najlepiej gdybym rzucił za to groszem. Ale może to i dobrze, ze "pomoc" się skończyła. Bawienie się w kotka i myszkę wymownymi odpowiedziami przez tydzień skutecznie mnie zniechęciło. That's all.
viking
Nie wiem jak inni ale ja osobiście pogubiłem się jaki masz obecnie kod i jaki jest z nim problem. A dając zdawkowe informacje nie oczekuj że będę zgadywał.
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.