Nie ma takiego użytkownika

PHP  Założony przez  Patryk Stefański.

Witam, podczas tworzenia strony z profilem, napotkałem na błąd, kiedy wpisuję ID użytkownika, którego nie ma w bazie to chciałbym aby wyświetliła się informacja na ten temat, a obecnie nic się nie dzieje, tylko renderuje się strona bez zmiennych

profile.php
if (isset($_GET['uid'])) {
          $uid $_GET['uid'];
            try {
                /**
                 * Pobieranie wszystkich informacji o użytkowniku z dołączeniem tabeli group
                 */
                $sql "SELECT *, DATE_FORMAT(created, '%d.%m.%Y') AS created from _users JOIN _groups on _users.gid = _groups.gid WHERE _users.uid=:uid";
                $query $dbh->prepare($sql);
                $query->bindValue(':uid'$uid);
                $query->execute();
                $profile $query->fetch(PDO::FETCH_ASSOC);
                /**
                 * Pobieranie liczby wszystkich użytkowników
                 */
                $sql2 "SELECT uid FROM _users";
                $query2 $dbh->prepare($sql2);
                $query2->execute();
                $NumberOfUsers $query2->fetchColumn();

                
                
if ($uid == || $uid $NumberOfUsers) {
                    $u_404 1;
                }
                else { 

profile.tpl
{if !empty($u_404)}
  <section class="container-fluid mt-5">
    <div class="col-sm text-center">
      <p>Nie ma takiego użytkownika</p>
      <a href="../index.php">Powrót</a>
    </div>
  </section>
{else} 
?p=profile&uid=1
   


?p=profile&uid=0
   
Ten kod to tragedia :D ...
Wyświetla się dobrze - pusta strona - bo masz warunek w szablonie.

Poza tym, nie rozumiem tego:
if ($uid == || $uid $NumberOfUsers) {
                    
$u_404 1;
                } 
Po co Tobie ten warunek? Wystarczy sprawdzić czy $profile nie jest puste.
@topic faktycznie zmieniłem w szablonie if na inny warunek i działa
Zapytam z ciekawości, czemu kod tragedia ?
(30.11.2019, 21:16)Patryk Stefański napisał(a): czemu kod tragedia ?
1. Operowanie na superglobalnych:
if (isset($_GET['uid'])) {
          
$uid $_GET['uid']; 
2. Brak jakiejkolwiek filtracji danych - SQL Injection.
3. Wrzucasz za dużo kodu do try/catch.
4. Niepotrzebnie robisz dwa zapytania.
5. Brak SOLID.
1. Nie bardzo rozumiem.
2. Jest to narazie podstawa, testy żeby sprawdzić czy działa, będę używał filtracji danych przez PDO
3. To jak mogę ten kod zooptymalizować
try {
                
/**
                 * Pobieranie wszystkich informacji o użytkowniku z dołączeniem tabeli group
                 */
                
$sql "SELECT *, DATE_FORMAT(created, '%d.%m.%Y') AS created from _users JOIN _groups on _users.gid = _groups.gid WHERE _users.uid=:uid";
                
$query $dbh->prepare($sql);
                
$query->bindValue(':uid'$uid);
                
$query->execute();
                
$profile $query->fetch(PDO::FETCH_ASSOC);
                    
$uid $profile['uid'];
                    
$u_404 ;
                    
// Zmiana hasła
                    
if (isset($_POST['new-pass1'])) {
                        
$validation true;

                        
$newpass filter_input(INPUT_POST'new-pass'FILTER_SANITIZE_STRING);
                        
$newpass1 filter_input(INPUT_POST'new-pass1'FILTER_SANITIZE_STRING);
                        if (
$newpass != $newpass1) {
                            
$validation false;
                            
$_SESSION['changepass-error'] = "Podane hasła się od siebie różnią !";
                            echo 
'<script>window.location.href = "?p=profile&uid=.'.$uid.'.&changepass=0"</script>';
                        }
                        if ((
strlen($newpass)<8) || (strlen($newpass)>20)) {
                            
$validation false;
                            
$_SESSION['changepass-error'] = "Hasło musi posiadać od 8 do 20 znaków!";
                            echo 
'<script>window.location.href = "?p=profile&uid='.$uid.'&changepass=0"</script>';
                        }
                        
$pass_hash password_hash($newpass1PASSWORD_DEFAULT);
                        if (
$validation == true) {
                            try {
                                
$query $dbh->prepare('UPDATE `users` SET `password`=:password WHERE `name`=:name');
                                
$query->bindValue(':name'$name);
                                
$query->bindValue(':password'$pass_hash);
                                
$query->execute();
                                
$_SESSION['changepass'] = "Zmiana hasła udana";
                                echo 
'<script>window.location.href = "?p=profile&uid='.$uid.'&changepass=1"</script>';
                            } catch (
PDOException $error) {
                                exit(
'Zmiana hasła nie udana. Database error' $error->getMessage());
                            }
                        }
                    } 
// Zmiana emaila
                    
elseif (isset($_POST['old-email']) && isset($_POST['new-email'])) {
                        
$validation true;

                        
$email filter_input(INPUT_POST'old-email'FILTER_VALIDATE_EMAIL);
                        
$email filter_var($emailFILTER_SANITIZE_EMAIL);
                        
$email1 filter_input(INPUT_POST'new-email'FILTER_VALIDATE_EMAIL);
                        
$email1 filter_var($email1FILTER_SANITIZE_EMAIL);

                        if (empty(
$email) || empty($email1)) {
                            
$validation false;
                            
$_SESSION['changeemail-error'] = "Twój email nie jest poprawny !";
                            echo 
'<script>window.location.href = "?p=profile&uid='.$uid.'&changeemail=0"</script>';
                        }
                        try {
                            
$query $dbh->prepare('SELECT * FROM users WHERE email=:email1');
                            
$query->bindValue(':email1'$email1PDO::PARAM_STR);
                            
$query->execute();
                            
$Checkemail $query->fetchColumn();
                            if (
$Checkemail 0) {
                                
$validation false;
                                
$_SESSION['changeemail-error'] = 'Email jest już zajęty';
                                echo 
'<script>window.location.href = "?p=profile&uid='.$uid.'&changeemail=0"</script>';
                            }
                            if (
$validation == true) {
                                
$query $db->prepare('UPDATE `users` SET `email`=:email1 WHERE `name`=:name');
                                
$query->bindValue(':name'$name);
                                
$query->bindValue(':email1'$email1);
                                
$query->execute();
                                
$_SESSION['changeemail'] = "Zmiana emaila udana";
                                echo 
'<script>window.location.href = "?p=profile&uid='.$uid.'&changeemail=1"</script>';
                            }
                        } catch (
PDOException $error) {
                            exit(
'Zmiana emaila nie udana. Database error' $error->getMessage());
                        }
                    }

                    
$adm_info "Jesteś Administratorem i możesz edytować użytkowników";
                    
$smarty->assign('name'$profile['name']);
                    
$smarty->assign('uid'$profile['uid']);
                    
$smarty->assign('created'$profile['created']);
                    
$smarty->assign('uid1'$uid1);
                    
$smarty->assign('email'$profile['email']);
                    
$smarty->assign('adm_info'$adm_info);
                    
$smarty->assign('gid'$profile['gid']);
                    
$smarty->assign('u_404'$u_404);
                    
$smarty->assign('avatar'$profile['avatar']);
                    
$smarty->display("profile.tpl");
            } catch (
PDOException $error) {
                exit(
$error->getMessage());
            } 
4. Poprawione
5. Poczytam o tym
1. + 2. https://www.php.net/manual/en/function.filter-input.php
https://www.php.net/manual/en/function.filter-var.php
3. Ogólnie sporo roboty tu, no ale jak już się zabrałeś za OOP :D
3.1. Odbieranie danych przenieś do Controllera, a zapytania do Repository.
3.2 try/catch używa się tylko tam, gdzie faktycznie może wystąpić Exception. Przypisywanie do zmiennych, ->prepare() i ->bind() ich nie rzucają.
3.3. Na produkcji nie wyświetlasz jedynie treści błędu, więc exit() nie jest tu zalecanym rozwiązaniem.



Użytkownicy przeglądający ten wątek:

1 gości