r   e   k   l   a   m   a

mysql: problem z zapytaniemw skrypcie rejestracyjnym

Wszystko co dotyczy tworzenia stron WWW.

mysql: problem z zapytaniemw skrypcie rejestracyjnym

Post przez Szarex » 09.02.2010 (Wt) 11:24

Witam.

Piszę sobie skrypt rejestracji. Plik który otrzymuje dane z formularza rejestracyjnego wygląda tak:
Kod: Zaznacz cały

<?php
  function DBConnect
()
  {
    $db_serv = 'localhost';
    $db_user = 'username';
    $db_pass = 'userpass';
    $db_base = 'galeria';
    if(!$db_lnk=mysql_connect($db_serv,$db_user,$db_pass)) { return false; };
    if(!mysql_select_db($db_base)) { return false; };
    return true;
  }
  
  function dataError
($f_login,$f_passw1,$f_passw2,$f_email,$f_sex,$f_city,$f_region)
  {
    if( (strlen($f_login)<3) || (strlen($f_login>20)) ) return 1;
    if( (strlen($f_passw1)<3) || (strlen($f_passw1)>20) || ($f_passw1 != $f_passw2) ) return 2;
    if( !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $f_email) ) return 3;
    if( !isSet($f_sex) ) return 4;
    if( empty($f_city) ) return 5;
    if( empty($f_region) ) return 6;
    return 0;
  }
  
  $login 
= $_POST['login_form'];           // echo("login = $login<br/>");
  $passw1 = $_POST['passw1_form'];         // echo("passw1 = $passw1<br/>");
  $passw2 = $_POST['passw2_form'];         // echo("passw2 = $passw2<br/>");
  $email = $_POST['email_form'];           // echo("email = $email<br/>");
  $sex = $_POST['sex_form'];               // echo("sex = $sex<br/>");
  $city = $_POST['city_form'];             // echo("city = $city<br/>");
  $region = $_POST['region_form'];         // echo("region = $region<br/>");
  $date_born=$_POST['date_born_form'];     // echo("date_born = $date_born<br/>");
  $description=$_POST['description_form']; // echo("description = $description<br/>");
    
  $error 
= dataError($login,$passw1,$passw2,$email,$sex,$city,$region);
  if($error==0)
  {
    echo("Formularz wypełniony prawidłowo! Wszystkie wymagane dane zostały podane<br/>");
    /* REJESTRACJA */
    if(DBConnect())
    {
      echo "Baza: Połączenie prawidłowe<br/>";
      $query = "SELECT COUNT(*) FROM users WHERE login='$login' OR email='$email'";
      echo "query: $query<br/>";
      if($reslut=mysql_query($query,$db_lnk)) { echo "zapytanie prawidłowe<br/>"; }
      else { echo "zapytanie nieprawidłowe<br/>"; };
    }
    else { echo "Błąd: Brak połączenia z bazą danych!<br/>"; };
  }
  else { header("Location: index.php?site=register_view&form_reg_err=$error");  };
?>



Moim zdaniem zapytanie wygląda na poprawne, tymczasem, skrypt cały czas pokazuje mi komunikat "zapytanie nieprawidłowe".
Tak wygląda baza danych i tabela users:
Obrazek

Kto mi powie dlaczego zapytanie jest nieprawidłowe?
Linux - 0 zł, Windows - kilkaset PLN, Uczciwość i poczucie posiadania legalnego oprogramowania: bezcenne
Avatar użytkownika
Szarex
 
Posty: 224
Dołączył(a): 04.04.2006 (Wt) 21:21
Lokalizacja: powiat tarnowski

Re: mysql: problem z zapytaniemw skrypcie rejestracyjnym

Post przez grzelix » 09.02.2010 (Wt) 12:53

Poradziłbym najpierw sprawdzić zapytanie w konsoli to wyeliminuje nam jedną niewiadomą bo teraz nie wiadomo czy to sql'ka jest błędna czy błąd jest w kodzie php (obstawiam to drugie ale na razie nie widzę jeszcze dokładnie co)
\\ When I wrote this, only God and I understood what I was doing
\\ Now, God only knows
grzelix
 
Posty: 28
Dołączył(a): 17.06.2009 (Śr) 9:34
Lokalizacja: Wrocław

Re: mysql: problem z zapytaniemw skrypcie rejestracyjnym

Post przez Szarex » 09.02.2010 (Wt) 17:19

Skopiowałem to co wyrzuca poniższa instrukcja do konsoli w w programie MySQL Query Browser:

Kod: Zaznacz cały
echo "query: $query<br/>"; 


Wykonuje się prawidłowo.

Co ciekawe nawet jeżeli w zmiennej $query umieszczę takie trywialne zapytanie jak:
Kod: Zaznacz cały
SELECT * FROM users;


Skrypt pokazuje nieprawidłowe zapytanie. A w MySQL Query Browser działa idealnie.
Linux - 0 zł, Windows - kilkaset PLN, Uczciwość i poczucie posiadania legalnego oprogramowania: bezcenne
Avatar użytkownika
Szarex
 
Posty: 224
Dołączył(a): 04.04.2006 (Wt) 21:21
Lokalizacja: powiat tarnowski

Re: mysql: problem z zapytaniemw skrypcie rejestracyjnym

Post przez grzelix » 09.02.2010 (Wt) 18:09

Ja nie jestem specjalistą od php i prawdę mówiąc nigdy nie programowałem w czystym php. Ale ostatnio dość intesywnie pisze w Frameworku Symfony gdzie poznałem dość dobrze php. Wstęp jest dla tego bo sprawdzałem twój kod pod Symfony tylko tam są troszkę inne zasady pisania. Tutaj masz osobną funkcje która sprawdza połączenie w takim przypadku u mnie też nie działa (ale to może być winna stylu Symfony) nie mniej jeśli zadeklaruję kod tak żę zmienna $db_lnk jest inicjowana w tej samej funkcji gdzie potem następuje połączenie i wykonanie zapytania to jest ok.
\\ When I wrote this, only God and I understood what I was doing
\\ Now, God only knows
grzelix
 
Posty: 28
Dołączył(a): 17.06.2009 (Śr) 9:34
Lokalizacja: Wrocław

Re: mysql: problem z zapytaniemw skrypcie rejestracyjnym

Post przez Szarex » 09.02.2010 (Wt) 18:24

Patent żeby połączenie z serwerem i wybór bazy umieścić w osobnej funkcji poznałem w książce z której uczyłem się PHP. Tam funkcja DBConnect jest dodatkowo umieszczana w osobnym pliku, który jest includowany w każdym skrypcie wykonującym operacje na bazie. Tutaj funkcję DBConnect umieściłem w tym samym pliku, żeby było wszystko w jednym skrypcie dla prostoty testowania. Łatwiej skopiować i testować taki kod.

Ale w moim skrypcie akurat z tą funkcją nie ma problemu - zwraca zawtość true - połączenie z bazą i wybór tabeli jest prawidłowy. Tylko zapytanie nie chce się wykonać.
Linux - 0 zł, Windows - kilkaset PLN, Uczciwość i poczucie posiadania legalnego oprogramowania: bezcenne
Avatar użytkownika
Szarex
 
Posty: 224
Dołączył(a): 04.04.2006 (Wt) 21:21
Lokalizacja: powiat tarnowski

Re: mysql: problem z zapytaniemw skrypcie rejestracyjnym

Post przez api » 09.02.2010 (Wt) 19:06

oj, oj, oj. koszmarek :?
- może lepiej zmień książkę.

1. ta funkcja DBConnect() jest mało praktyczna, nie jest skalowalna w żadnym stopniu i będziesz przywiązany do tej jednej tabeli tylko.
2. jeżeli już byś koniecznie chciał to w takiej formie, to:
a) albo w tej funkcji zmienną $db_lnk zadeklaruj jako globalną
b) albo zamiast zwracać prawdę, zwracaj identyfikator połączenia ...czyli zamiast return true; daj return $db_lnk;

3.
Kod: Zaznacz cały
if($reslut=mysql_query($query,$db_lnk)) { echo "zapytanie prawidłowe<br/>"; }
nie zadziała teraz, bo zmienna $db_link mnie istnieje!

-będzie istniała dopiero w przypadku pkt2. a)
-albo w przypadku pkt2. b)
...gdy if(DBConnect()) zmienisz na if($db_lnk=DBConnect())
api
 
Posty: 820
Dołączył(a): 13.04.2005 (Śr) 14:40

Re: mysql: problem z zapytaniemw skrypcie rejestracyjnym

Post przez Szarex » 09.02.2010 (Wt) 21:16

OK. Zrezygnowałem na razie z funkcji i napisałem to tak:

Kod: Zaznacz cały

<?php
  $db_serv 
'localhost'$db_user 'root'$db_pass '#mysql4rt!'$db_base 'galeria';
  
$db_status=true;
  
$db_lnk=mysql_connect($db_serv,$db_user,$db_pass);
  if(
$db_lnk==false) { $db_status=false; };
  if(!
mysql_select_db($db_base)) { $db_status=false; };
    
  function 
dataError($f_login,$f_passw1,$f_passw2,$f_email,$f_sex,$f_city,$f_region)
  {
    if( (
strlen($f_login)<3) || (strlen($f_login>20)) ) return 1;
    if( (
strlen($f_passw1)<3) || (strlen($f_passw1)>20) || ($f_passw1 != $f_passw2) ) return 2;
    if( !
eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"$f_email) ) return 3;
    if( !isSet(
$f_sex) ) return 4;
    if( empty(
$f_city) ) return 5;
    if( empty(
$f_region) ) return 6;
    return 
0;
  }
  
  
$login $_POST['login_form'];           // echo("login = $login<br/>");
  
$passw1 $_POST['passw1_form'];         // echo("passw1 = $passw1<br/>");
  
$passw2 $_POST['passw2_form'];         // echo("passw2 = $passw2<br/>");
  
$email $_POST['email_form'];           // echo("email = $email<br/>");
  
$sex $_POST['sex_form'];               // echo("sex = $sex<br/>");
  
$city $_POST['city_form'];             // echo("city = $city<br/>");
  
$region $_POST['region_form'];         // echo("region = $region<br/>");
  
$date_born=$_POST['date_born_form'];     // echo("date_born = $date_born<br/>");
  
$description=$_POST['description_form']; // echo("description = $description<br/>");
    
  
$error dataError($login,$passw1,$passw2,$email,$sex,$city,$region);
  if(
$error==0)
  {
    echo(
"Formularz wypełniony prawidłowo! Wszystkie wymagane dane zostały podane<br/>");
    
/* REJESTRACJA */
    
if($db_status)
    {
      echo 
"Baza: Połączenie prawidłowe<br/>";
      
$query "SELECT COUNT(*) FROM users WHERE login='$login' OR email='$email'";
      echo 
"query: $query<br/>";
      if(
$reslut=mysql_query($query,$db_lnk)) { echo "zapytanie prawidłowe<br/>"; }
      else { echo 
"zapytanie nieprawidłowe<br/>"; };
    }
    else { echo 
"Błąd: Brak połączenia z bazą danych!<br/>"; };
  }
  else { 
header("Location: index.php?site=register_view&form_reg_err=$error");  };
?>



Działa na razie chociaż nie wygląda to rewelacyjnie.
Linux - 0 zł, Windows - kilkaset PLN, Uczciwość i poczucie posiadania legalnego oprogramowania: bezcenne
Avatar użytkownika
Szarex
 
Posty: 224
Dołączył(a): 04.04.2006 (Wt) 21:21
Lokalizacja: powiat tarnowski


Powrót do Webmastering

Kto przegląda forum

Użytkownicy przeglądający ten dział: Zopsesen i 0 gości