Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Dodawanie rekordu do bazy na podstawie zmiennych
Matt23
post
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 24)
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Temat: Jak poprawnie zadac pytanie
Go to the top of the page
+Quote Post
Matt23
post
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


@up

Nie wiem, czym zawiniłem.
Go to the top of the page
+Quote Post
Turson
post
Post #4





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


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





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Działa, bo tam też masz wyłaczone raportowanie błędów. Powinieneś ujrzeć błąd Warning: Illegal string offset
Go to the top of the page
+Quote Post
Matt23
post
Post #7





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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)
Go to the top of the page
+Quote Post
Turson
post
Post #8





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


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





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


Nie musisz mieć żadnych ekstra uprawnień.
Go to the top of the page
+Quote Post
Turson
post
Post #11





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


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


Ten post edytował Turson 22.04.2014, 19:08:39
Go to the top of the page
+Quote Post
Matt23
post
Post #12





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


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
Go to the top of the page
+Quote Post
Matt23
post
Post #14





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jesteś pewien, że chodzi o pobranie ilości wierszy a nie rekordów? mysql_fetch_assoc
Go to the top of the page
+Quote Post
Matt23
post
Post #16





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 267
Pomógł: 6
Dołączył: 8.04.2013

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


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
Go to the top of the page
+Quote Post
Matt23
post
Post #18





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


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





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


Zwracałem ci na to uwagę dopiero co. Czytasz komentarze?
Go to the top of the page
+Quote Post
Matt23
post
Post #22





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


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





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


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ł.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 2.10.2025 - 18:14