Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][PostgreSQL] Problem z dodaniem danych do bazy
wariusz
post
Post #1





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


Witam mam prosty formularz, który należy wypełnić aby się zarejestrować można go zobaczyć na stronie:

www.trucki.pl/log/rejestracja.php

3 pola są obowiązkowe mianowicie login, hasło i mail. Po wypełnieniu pól (nieważne czy tylko obowiązkowe czy też dodatkowe) i naciśnięciu wyślij pojawiają się błędy:

  1. Warning: pg_exec() [function.pg-exec]: Query failed: ERROR: column "admin" does not exist in /home/cls/ftp/log/rejestracja.php on line 42
  2. false czyli nie ma takiego loginu, wynik jest:
  3. Warning: pg_numrows(): supplied argument is not a valid PostgreSQL result resource in /home/cls/ftp/log/rejestracja.php on line 49
  4. pg_numrows:
  5. Warning: pg_numrows(): supplied argument is not a valid PostgreSQL result resource in /home/cls/ftp/log/rejestracja.php on line 51
  6.  
  7. Warning: pg_exec() [function.pg-exec]: Query failed: ERROR: invalid input syntax for integer: "" in /home/cls/ftp/log/rejestracja.php on line 76


poniżej miejsca w kodzie gdzie są błędy:

  1. <?php
  2. 38  $db_handle = pg_connect("dbname =$pg_baza user=$pg_login password=$pg_haslo host=$pg_host");
  3. 39  if($db_handle)
  4. 40  {
  5. 41   $query="SELECT * FROM $pg_tabela WHERE login=$login";
  6. 42   $wynik = pg_exec ($db_handle, $query);
  7. 43   if($wynik){echo" true jest taki login wynik ".$wynik;}else{echo" false czyli nie ma takiego loginu, wynik jest: ".$wynik;}
  8. 44   //echo "wynik".$wynik;
  9. 45   pg_close();
  10. 46  }
  11. 47
  12. 48  else echo "Nie można połączyć się z serwerem PSQL";
  13. 49    $wynik_pg_numrows=pg_numrows($wynik);
  14. 50    echo "pg_numrows: ".$wynik_pg_numrows;
  15. 51    if (pg_numrows($wynik)<>0) { $blad++;
  16. 52      echo "<span style=\"color:red;\">Login już został przez kogoś użyty!.
  17. 53      Zaproponuj inny!</span><br />";
  18. 54    }
  19. 55  }
  20.  
  21. 69 $kod = uniqid(rand());
  22. 70    $haslo = md5($haslo); // zaszyfrowanie hasla
  23. 71    
  24. 72      $db_handle = pg_connect("dbname =$pg_baza user=$pg_login password=$pg_haslo host=$pg_host");
  25. 73      if($db_handle)
  26. 74      {
  27. 75    $query="INSERT INTO $pg_tabela VALUES(DEFAULT, '$login', '$haslo', '$kod', 1, '$imie', '$miejscowosc', NOW(), '$email', '$nazwa', '$telefon', '$wojewodztwo', '$produkty' )";
  28. 76        $wynik = pg_exec ($db_handle, $query);
  29. 77        pg_close();
  30. 78      }
  31. ?>


i jeszcze kod tworzący tabele w której są umieszczane wszystkie te informacje:

  1. CREATE TABLE dostawcy (
  2. lp_dostawcy INT NOT NULL DEFAULT NEXTVAL('public.dostawcy_lp_dostawcy_seq'::text) PRIMARY KEY,
  3. login VARCHAR(50) NOT NULL,
  4. haslo VARCHAR(32) NOT NULL,
  5. kod VARCHAR(32) NOT NULL,
  6. STATUS INT NOT NULL,
  7. imie VARCHAR(32),
  8. miejscowosc VARCHAR(32),
  9. data_dodania TIMESTAMP NOT NULL,
  10. email VARCHAR(120) NOT NULL,
  11. nazwa VARCHAR(32),
  12. telefon INT,
  13. wojewodztwo VARCHAR(32),
  14. produkty VARCHAR(100)
  15.  
  16. );


może ma ktoś jakiś pomysł co z tym może być nie tak ?
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat
ERROR: column "admin" does not exist

W zmiennej $login masz zapewne wpisane "admin". Zmień zawartość tej zmiennej na 'admin' (czyli musisz ją otoczyć apostrofami) i powinno śmigać.
Go to the top of the page
+Quote Post
wariusz
post
Post #3





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


ta zmiana o której mówisz niestety nic nie daje:
jest tak:
  1. <?php
  2. 41   $query="SELECT * FROM $pg_tabela WHERE login=$login";
  3. ?>

zmieniłem na :
  1. <?php
  2. 41   $query="SELECT * FROM $pg_tabela WHERE login='$login' ";
  3. ?>

i zrobiłem jeszcze kilka innych kombinacji ale nie działa.

próbowałem również zmienić w miejscu gdzie jest przypisywana wartość wprowadzona do formularza :

jest tak:
  1. <input type="text" name="login" value="$login" /></td>


próbowałem zamiast cudzysłowów dać apostrofy lub w ogóle bez niczego ale nadal nie działa?

Ten post edytował wariusz 23.10.2008, 08:24:11
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Napisałem Ci, że w zmiennej masz już zapisane ". Twoja modyfikacja sprawiła, że masz teraz '"admin"'. Jeśli nie wiesz gdzie i co zmienić zrób tak:
  1. <?php
  2. $query="SELECT * FROM $pg_tabela WHERE login=".str_replace('"', "'", $login);
  3. ?>

Przekopiuj tą linijkę bo możesz pomieszać " z '. Jest tak: ' " ' zmieniane na " ' " (oczywiście bez spacji).
Go to the top of the page
+Quote Post
wariusz
post
Post #5





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


po wstawieniu tej linijki, którą mi podałeś nadal jest ten sam błąd.
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Możesz wyechować to zapytanie?
  1. <?php
  2. // ...
  3. $query="SELECT * FROM $pg_tabela WHERE login=".str_replace('"', "'", $login);
  4. echo $query;
  5. $wynik = pg_exec ($db_handle, $query);
  6. // ...
  7. ?>
Go to the top of the page
+Quote Post
wariusz
post
Post #7





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


po echo wypisuje:

  1. SELECT * FROM dostawcy WHERE login=admin
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Aj, poszedłem w złą stronę:
  1. <?php
  2. $query="SELECT * FROM $pg_tabela WHERE login='$login'";
  3. ?>

Tak też wywala błąd z unknown column? Nie powinno...
Go to the top of the page
+Quote Post
batman
post
Post #9





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Ludzie, zacznijcie w końcu poprawnie i bezpiecznie używać stringów.
  1. <?php
  2. $query = "SELECT * FROM $pg_tabela WHERE login='".$login."'";
  3. ?>

Ponadto użyj funkcji mysql_real_escape_string.


edit
Nie zauważyłem, że używasz postgresa - użyje funkcji pg_escape_string.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
wariusz
post
Post #10





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


to już próbowałem wcześniej ale po wklejeniu Twojej linijki wyskakuje:

  1. SELECT * FROM dostawcy WHERE login='admin'
  2.  
  3. true jest taki login wynik Resource id #2pg_numrows: 0


ta linijka true jest... wygląda na to jakby był już taki login w bazie a baza jest nadal pusta?questionmark.gif

po wklejeniu linijki od Batmana wyskakuje:

  1. SELECT * FROM dostawcy WHERE login='admin'
  2. true jest taki login wynik Resource id #2pg_numrows: 0
Go to the top of the page
+Quote Post
batman
post
Post #11





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Jeszcze jedna rzecz. Nie pg_exec, a pg_query.


edit
No i oczywista rzecz. Źle sprawdzasz, czy login istnieje. Dopiero przejrzałem Twój kod nieco dokładniej i oto co znalazłem.
  1. <?php
  2. $query="SELECT * FROM $pg_tabela WHERE login=$login";
  3. $wynik = pg_exec ($db_handle, $query);
  4. ?>

Wynik zawsze będzie różny od false, ponieważ zapytanie wykonuje się poprawnie. Jeśli chcesz sprawdzić, czy login jest już bazie, to albo robisz to przy użyciu pg_num_rows lub poprzez pobranie wiersza (pg_fetch_*) i sprawdzenie, czy tablica nie jest pusta.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
wariusz
post
Post #12





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


sprawdzania poprawności odbywa się tak:

  1. <?php
  2. else echo "Nie można połączyć się z serwerem PSQL";
  3.    $wynik_pg_numrows=pg_numrows($wynik);
  4.    echo "pg_numrows: ".$wynik_pg_numrows;
  5.    if (pg_numrows($wynik)<>0) { $blad++;
  6.      echo "<span style=\"color:red;\">Login już został przez kogoś użyty!.
  7.      Zaproponuj inny!</span><br />";
  8.    }
  9. ?>

i chyba po tym co podałeś jest ok został tylko jeden błąd :

  1. Warning: pg_query() [function.pg-query]: Query failed: ERROR: invalid input syntax for integer: "" in /home/cls/ftp/log/rejestracja.php on line 81


  1. <?php
  2. 74 $kod = uniqid(rand());
  3. 75    $haslo = md5($haslo); // zaszyfrowanie hasla
  4. 76    
  5. 77      $db_handle = pg_connect("dbname =$pg_baza user=$pg_login password=$pg_haslo host=$pg_host");
  6. 78      if($db_handle)
  7. 79      {
  8. 80        $query="INSERT INTO $pg_tabela VALUES(DEFAULT, '$login', '$haslo', '$kod', 1, '$imie', '$miejscowosc', NOW(), '$email', '$nazwa', '$telefon', '$wojewodztwo', '$produkty' )";
  9. 81        $wynik = pg_query ($db_handle, $query);
  10. 82        pg_close();
  11. 83      }
  12. ?>
Go to the top of the page
+Quote Post
batman
post
Post #13





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Pamiętaj, że poniższy kod zawsze Ci zwróci "true jest taki login", ponieważ funkcja zwraca false tylko w przypadku błędu w zapytaniu.
  1. <?php
  2. $query="SELECT * FROM $pg_tabela WHERE login=$login";
  3. $wynik = pg_exec ($db_handle, $query);
  4. if($wynik){echo" true jest taki login wynik ".$wynik;}else{echo" false czyli nie ma takiego loginu, wynik jest: ".$wynik;}
  5. ?>



A co o drugiego problemu:
  1. <?php
  2. echo $query;
  3. ?>
i będziesz wiedział gdzie jest błąd. Z komunikatu błędu wynika, że zapisujesz do pola typu int pusty ciąg.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
wariusz
post
Post #14





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


query wypisuje mi:

  1. INSERT INTO dostawcy VALUES(DEFAULT, 'admin', 'aaaaaaaaggggggggg', '209gkjfdkljglsk45353495834' ,1, '', '', NOW(), 'mail', '', '', 'Województwo', '')


nie wiem dlaczego wypiuje "Default" nie powinno już się generować jakaś liczba w bazie ta kolumna to:

  1. lp_dostawcy INT NOT NULL DEFAULT NEXTVAL('public.dostawcy_lp_dostawcy_seq'::text) PRIMARY KEY,


ale nawet jak za default wpiszę jakąś liczbę to błąd zostaje,?
Go to the top of the page
+Quote Post
batman
post
Post #15





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




To co się wyświetliło to jest tylko to, co leci do bazy. Dopiero na bazie wykonują się odpowiednie operacje.
A problemem są puste stringi - ''
Któreś z pól ma tym integer i dlatego generuje błąd. Musisz zrzutować odpowiednią zmienną na int-a:
  1. <?php
  2. (int)$zmienna
  3. ?>


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
wariusz
post
Post #16





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


problem z int nie występuje jak typ pola telefon zmieniłem na varchar (nie wiem czy takie pole powinno być takiego typu).
Ale wyskoczył kolejny błąd :

  1. Warning: pg_query() [function.pg-query]: Query failed: ERROR: relation "public.dostawcy_lp_dostawcy_seq" does not exist in /home/cls/ftp/log/rejestracja.php on line 82


nie wiem czy nie chodzi ciągle do tego default?
Go to the top of the page
+Quote Post
batman
post
Post #17





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




To może być problem z DEFAULT. Nie używałem go już dłuższy czas. Zawsze podaję nazwy kolumn, do których zapisuję dane.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
wariusz
post
Post #18





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 16.07.2008

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


witam użyłem typu serial i dodałem nazwy kolumn i wszystko działa dzięki wielkie za pomoc dla batmana i phpion
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 14:57