[PHP] - Funkcja nie działa prawidłowo

Witam was z kolejnym problemem. Oto kod klasy, która rejestruje użytkownika. Na początku dopowiem, iż problem pojawił się, gdy zacząłem pisanie kodu, który sprawdza czy taki username/email już istnieje w bazie.

 

<?php /* *======================= * REGISTRATION CLASS ! * ====================== */ include_once '/../registration.php'; include_once '/../db_connect/db_connect.php'; class registration { private $db; function __construct() { $this->db = new db_connect(); $this->db = $this->db->connecting(); } function cryptPass($password1, $rounds = 9){ ...sól... } function registration_method($username, $password1, $password2, $email, $date) { if(!empty($username) && !empty($password1) && !empty($password2)) { if(strlen($username) > 20 || strlen($username) < 3 || strlen($password1) > 20 || strlen($password1) < 6 || $password1 != $password2) { echo '
Registration unsuccessfully. Entered data are incorrect. ◄ Back
'; } else { $qUserName = $this->db->query("SELECT username FROM users WHERE username = '$username'"); $qUserEmail = $this->db->query("SELECT email FROM users WHERE email = '$email'"); echo 'dsadasd'; if($qUserName->rowCount() == 1 || $qUserEmail->rowCount() == 1) { $qUserName->fetch(PDO::FETCH_ASSOC); $qUserEmail->fetch(PDO::FETCH_ASSOC); echo "lololo"; if( $qUserName['username'] == $username ) { echo '
Registration unsuccessfully. An user arleady use this username. ◄ Back
'; } elseif ($qUserEmail['email'] == $email) { echo '
Registration unsuccessfully. An user arleady use this email. ◄ Back
'; } else { echo '
Registration successfully. Entered data are correct.
Now, check out your e-mail box and activate your account on our site. See you later !
'; $password = $this->cryptPass($password1); // hashed password $this->db->query("INSERT INTO users(username, password, email, date) VALUES ('$username', '$password', '$email', '$date')"); $activating_link = 'http://localhost/szkola-web/activating.php?acc='.$username.'&email='.$email.''; echo $activating_link; /* SENDING AN EMAIL FOR ACTIVATE AN ACCOUNT */ $text = '

Hello '.$username.'



You are welcome in Szkoła WEB. You\'ve created arleady an account, but you can\'t still be logged in ! For activate your account, click here.



Greets you Szkoła WEB

'; $header = 'MIME-Version: 1.0' . "\r\n"; $header .= 'Content-type: text/html; charset=utf-8' . "\r\n"; /* END OF THE MAIL */ mail($email, 'Activating an account by SzkołaWEB', $text, $header); if(isset($_SESSION['logged_admin'])) { header('Location: http://localhost/cms-szkola/admin/users.php'); } } } } } } }

 

Problem najprawdopodobniej znajduje się tutaj

 

$qUserName = $this->db->query(“SELECT username FROM users WHERE username = ‘$username’”);
$qUserEmail = $this->db->query(“SELECT email FROM users WHERE email = ‘$email’”);

 

Ponieważ, jak to wypiszę funkcją print_r to wychodzi mi tylko Array(). Zaraz po tym kodzie mam echo ‘dsadasd’; i to właśnie to wyrzuca mi php.

Proszę, pomóżcie bo już nie wytrzymuje.

Pozdrawiam

Nie bardzo wiem jaka logika kryje się za tym $this->db->query ale strzelam, że dodajesz dwa zapytania zaraz po sobie i potem próbujesz wyciągnąć z nich rowCount. IMHO najlepiej zrób to w jednym zapytaniu, np.

$check = $this->db->query("SELECT username, email FROM users WHERE username = '$username' OR email = '$email' ");

To wcześniej testowałem i nie działa.

A czy działa sprawdzanie wyłącznie jednego parametru?

To zapytanie

$check = $this->db->query("SELECT username, email FROM users WHERE username = '$username' OR email = '$email' ");

daje coś takiego

PDOStatement Object ( [queryString] => SELECT username, email FROM users WHERE username = 'nbnbnbnb' OR email = 'asas@as.as' )

UP to Array() jak pobiorę dane, a po każdym query to wyskakuje ten błąd co powyżej jest podany.

a niby po co mi ta informacja?

 

 

Średnio siedzę w PDO więc zapytam (podpowiadając jednocześnie), gdzie te query ($qUserName i $qUserEmail) są execute’d ??

No przecież podałem całą klasę. Te query są w pierwszym spoilerze(post #1) w metodzie registration_method w drugim IF’ie. One chyba nie muszą być ‘wykonywane’, ponieważ ‘wykonywanie’ występuje, gdy używamy metody prepare , a ja używam query.

Kurde, zmusiłeś mnie żebym się skupił :stuck_out_tongue:

 

Reasumując, masz dwa zapytania, wykonują się bez błędów, oba zwracają puste tablicę, czy tak?

Tak

No to może faktycznie w bazie nie ma rekordów o takich kryteriach?

Haha :stuck_out_tongue: To ma sprawdzać czy jest czy nie ma. To jest zwykłe zablokowanie rejestracji na istniejący już nick/email. Tzn. jeżeli w bazie jest użytkownik joe i on ma email joe@gmail.joe to już nikt nie może się zarejestrować na takie dane. Dlatego mam najpierw SELECT, potem IF’a gdzie sprawdzam czy wynik SELECT’a daje 1(taki nick/email już istnieje) czy też daje 0(takiego emaila/nicka nie ma w bazie i można się zarejestrować). Tylko, że SELECT wyrzuca błąd.

A przed chwilą potwierdziłeś “…masz dwa zapytania, wykonują się bez błędów, oba zwracają puste tablicę…”. To gdzie w końcu leży problem?

No jak zrobię query , to takie coś wypisuje mi print_r:

PDOStatement Object ( [queryString] => SELECT username, email FROM users WHERE username = 'nbnbnbnb' OR email = 'asas@as.as' )

A na kiego grzyba robisz print_r ?? Sprawdzasz rowCount i widać czy jest równe zeru czy nie. Zapytam ponownie, gdzie leży problem ??

OMG. Nie wiem gdzie leży problem, ponieważ PHP nie wypluwa error’ów. Zobacz sobie, gdzie mam w kodzie te dwa query pobierające nick i email. Zaraz po nich mam echo i po kliknięciu ‘rejestruj’ właśnie to echo się wykonuje. Nie wiem dlaczego metoda kończy jakby działanie na tym echo.

Czyli nie wykonuje się nic po tych warunkach z rowCountami, tak?

 

Sprawdzałeś co zwracają te dwa rowCount’y  ??

No rowCount() działa(tzn. jak znajdzie to wypisuje 1), ale rejestracja nadal nie ;/

Synek, synek - bo widzę po loginie żeś młody - napisz konkretnie, co się wykonuje a co nie, bo Ty chyba w ogóle nie próbujesz tego debugować. Najpierw piszesz, że masz problem z tymi zapytaniami ‘dsadasd’, potem że tam nie ma błędów, teraz że rowCount są ok … jesteś konkretnie zakręcony. Napisz konkretnie co się wykonuje, a co nie. Masz tam kilka razy echo to chyba widzisz na czym stoisz … jak nie, to prawym i “pokaż źródło strony”, bo ja niestety za Ciebie tego nie kliknę.

 

“No rowCount() działa(tzn. jak znajdzie to wypisuje 1)”  - ■■■■ a nie “jak”. Co konkretnie się pojawia jak wpiszesz “print_r($qUserName->roundCount()); print_r($qUserEmail->rowCout());” ?? 

Czy “lololo” się pojawia?? Czy masz alert-success czy alert-danger ??

 

P.S.

Moja rada … się nie obraź, tylko przemyśl … odpuść sobie, bo się do tego nie nadajesz. Na roku mam paru kolesi z podobnym zacięciem co Ty, ale z nich programiści nie będą. Za chiny ludowe, nie rozumieją co robią i co mają przed oczami.

Znalazłem błąd ! Oto wycinek kodu:

$qUserName = $this->db->query(“SELECT username, email FROM users WHERE username = ‘$username’ OR email = ‘$email’”);
$qUserEmail = $this->db->query(“SELECT email FROM users WHERE email = ‘$email’”);

echo ‘dsadasd’;

if($qUserName->rowCount() == 1 || $qUserEmail->rowCount() == 1) {

$qUserName->fetch(PDO::FETCH_ASSOC);
$qUserEmail->fetch(PDO::FETCH_ASSOC);

 

  1. Pobieram podany nick, podany przez osobę.(jeżeli jest już taki w bazie to rowCount zwraca 1, jeżeli nie to rowCount zwraca 0)

  2. Pobieram podany email, podany przez osobę.(jeżeli jest już taki w bazie to rowCount zwraca 1, jeżeli nie to rowCount zwraca 0)

  3. Sprawdzam czy pobrane dane już istnieją w bazie.

  4. Pobieram nick I email, kiedy w IF’ie mam ||.

Czyli gdy np gdy nick->rowCount będzie == 1 a email->rowCount == 0, to php nie pobierze mi maila, a ja takowego próbowałem pobrać. Teraz mam taki kod i on działa.

 

$qUserName = $this->db->query(“SELECT username, email FROM users WHERE username = ‘$username’ OR email = ‘$email’”);
$qUserNameRow = $qUserName->rowCount();

$qUserEmail = $this->db->query(“SELECT email FROM users WHERE email = ‘$email’”);
$qUserEmailRow = $qUserEmail->rowCount();

if($qUserNameRow == 1) {

echo ‘

Registration unsuccessfully. An user arleady use this username. ◄ Back
’;

} elseif ($qUserEmailRow == 1) {

echo ‘

Registration unsuccessfully. An user arleady use this email. ◄ Back
’;

} else {

 

Programowanie to jednak nie tylko sam kod, trza jeszcze trzeźwo myśleć.

A wiesz, że jedno query masz swoje pierwotne, a drugie z mojego przykładu ??

 

Ja nigdzie nie napisałem, że programowanie to sam kod, więc ■■■ ??

 

Porada na przyszłość z gatunku dobre praktyki; metoda która się nie mieści na jednym ekranie monitora, jest za długa … należy ją rozbić na mniejsze.