Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][PostgreSQL] Problem z dodaniem danych do bazy
Forum PHP.pl > Forum > Przedszkole
wariusz
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 ?
phpion
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ć.
wariusz
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?
phpion
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).
wariusz
po wstawieniu tej linijki, którą mi podałeś nadal jest ten sam błąd.
phpion
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. ?>
wariusz
po echo wypisuje:

  1. SELECT * FROM dostawcy WHERE login=admin
phpion
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...
batman
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.
wariusz
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
batman
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.
wariusz
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. ?>
batman
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.
wariusz
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,?
batman
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. ?>
wariusz
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?
batman
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.
wariusz
witam użyłem typu serial i dodałem nazwy kolumn i wszystko działa dzięki wielkie za pomoc dla batmana i phpion
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.