Zwrócenie błędu gdy brak parametru w zmiennej $_GET

0

Cześć, ogólnie wszystko działa, poprawnie dane z bazy są wyciągane natomiast jak wyrzucić błąd podczas gdy użytkowik nie poda tablicy client żadnego id? Np. www.example.pl?client= albo gdy nie ma takiego id w bazie? Nie mogę tego rozgryźć na złączonych tabelach.
Z góry dzięki za podpowiedzi.

$get_id = $db->prepare("SELECT b.desc, a.id, a.id_nfc, a.name, a.surname, a.phone FROM `users` AS `a` JOIN `cars_job` AS `b` ON a.id_nfc = b.id_user WHERE a.id_nfc = :id_nfc");
$get_id->bindValue(":id_nfc", $_GET['client'], PDO::PARAM_STR);

if(!$get_id->execute()){
  	print_r($get_id->errorInfo());
}

foreach ($get_id as $row) {
	switch($_GET['client']) {
		case ''.$row['id_nfc'].'':
			echo '
				<p>Witaj: '.$row['name'].' '.$row['surname'].'</p> 
				<p>Twoje id to: '.$row['id_nfc'].'</p>
				<p>Numer telefonu: '.$row['phone'].'
			';
			echo '
				<p>Twoje usługi:</p> 
				<p>'.$row['desc'].'</p>
			';
		break;
		default:
				echo 'Brak użytkownika w bazie';
		break;
							
	}
}
2

Możesz użyć rowCount() żeby sprawdzić ilość wczytanych recordów.

Inne rady:

  1. Użyj htmlSpecialChars() kiedy sklejasz plain tekst (jak dane z bazy) z HTML'em (np z tekstem w <p>)
  2. Raczej nie wsadzaj danych prosto z bazy do widoku - przekaż je jako parametr w funkcji, tak jak niżej
  3. Jeśli execute() się nie udał, to najlepiej jest przerwać aplikację całkiem, bo to jest błąd który nie powinien się wydarzyć - nie ma sensu tego obsługiwać. Więc albo rzuć wyjątek, albo zwróć kod 500 i nie wykonuj kodu dalej.
  4. ten switch nie ma sensu, byłoby dużo czytelniej jakbyś dał if po prostu
  5. Nie ma sensu iterować po recordach, bo jak się domyślam jest tylko jeden record w bazie w tabeli users który pasuje do id? Więc możesz po prostu założyć że zwrócony jest jeden record, albo 0 (jeśli ktoś podał nieistniejące id).

Ja bym to zrobił tak:

<?php

function render(string $id, string $name, string $surname, string $phone, string $description): void
{
    echo '<p>Witaj: ' . \htmlSpecialChars($name) . ' ' . \htmlSpecialChars($surname) . '</p> 
          <p>Twoje id to: ' . \htmlSpecialChars($id) . '</p>
          <p>Numer telefonu: ' . \htmlSpecialChars($phone) . '
          <p>Twoje usługi:</p> 
          <p>' . htmlSpecialChars($description) . '</p>';
}

function fetchUser($db, string $clientId): ?array
{
    $query = $db->prepare("SELECT b.desc, a.id, a.id_nfc, a.name, a.surname, a.phone FROM `users` AS `a` JOIN `cars_job` AS `b` ON a.id_nfc = b.id_user WHERE a.id_nfc = :id_nfc");
    $query->bindValue(":id_nfc", $clientId, PDO::PARAM_STR);
    if (!$query->execute()) {
        throw new Exception('Failed to execute database query');
    }
    if ($query->rowCount() === 0) {
        return null;
    }
    return $query->fetch(PDO::FETCH_ASSOC);
}

$user = fetchUser($db, $_GET['client']);
if ($user === null) {
    http_response_code(404);
} else {
    render($user['id_nfc'], $user['name'], $user['surname'], $user['phone'], $user['desc']);
}

1

Wystarczy tak:

if ( !isset ( $_GET['client'] ) ) {
  // komunikat o błędzie
}
2

Połącz oba rozwiązania. Po co pytać bazę jeśli dane nie przesłane.
@malomiasteczkowy zaproponuj lepsze rozwiązanie.

0
jurek1980 napisał(a):

Połącz oba rozwiązania. Po co pytać bazę jeśli dane nie przesłane.
@malomiasteczkowy zaproponuj lepsze rozwiązanie.

No tutaj najlepiej jest wejsc w jakikolwiek mini MVC framework. Obojetne jaki ale zeby uczyc sie juz prawidlowego podejscia. Zapewne wszyscy sie z tym zgodza, ze jesli i tak i tak cos programujesz to co szkodzi sprobowac zrobic to w pewnych ustalonych i sprawdzonych zasadach?

2
malomiasteczkowy napisał(a):

No tutaj najlepiej jest wejsc w jakikolwiek mini MVC framework. Obojetne jaki ale zeby uczyc sie juz prawidlowego podejscia. Zapewne wszyscy sie z tym zgodza, ze jesli i tak i tak cos programujesz to co szkodzi sprobowac zrobic to w pewnych ustalonych i sprawdzonych zasadach?

Nie można wtedy samemu kształcić swoich umiejętności projektowania software'u, która jest niezbędna jak chcesz być dobrym programistą. Nie mówiąc o tym że frameworki mają swoje zalety, ale mają też dużo wad.

Jeśli stworzyłeś już swoje systemy, i wiesz na co się porywasz biorąc framework - to wszystko w porządku (to czy zrobisz tight-coupling z tym frameworkiem to Twoja sprawa). Ale jak jesteś początkującym, i nigdy nie zaprojektowałeś żadnego systemu, to framework nałoży na Ciebie klapki na oczy - do tego stopnia, że potem ludziom się wydaje że "warsztwy" albo MVC to jedyny (albo nawet dobry) sposób projektowania apek webowych.

1
malomiasteczkowy napisał(a):

No tutaj najlepiej jest wejsc w jakikolwiek mini MVC framework. Obojetne jaki ale zeby uczyc sie juz prawidlowego podejscia. Zapewne wszyscy sie z tym zgodza, ze jesli i tak i tak cos programujesz to co szkodzi sprobowac zrobic to w pewnych ustalonych i sprawdzonych zasadach?

Być może to jedyny formularz jaki potrzebuje OP I do tego chcesz mini framework?
Jak nie napiszesz czegoś choć raz trochę bardziej od podstaw to potem nie wiesz jak to działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1