Szybkie ćwiczenie w PHP bez frameworków, aby nie zapomnieć jak się w czystym PHP koduje. Query params, http_build_query oraz wysyłanie nagłówków. Alternatywna, ładniejsza składnia dla echo oraz bloków if-else. Niby nic, ale jednak coś!
Prosty formularz z metodą GET – piszemy
W pliku PHP piszemy prosty formularz z metodą GET:
<?php
?>
<form method="GET">
<input type="text" name="q" id="q" value="">
<button type="submit">Search</button>
</form>
Możemy wysłać. Do naszego URLa doklei się „q=szukanafraza”. Okej, teraz sprawdźmy, czy mamy jakieś query params i wyświetlajmy formularz tylko, gdy nie mamy:
<?php if (empty($_GET)) : ?>
<form method="GET">
<input type="text" name="q" id="q" value="">
<button type="submit">Search</button>
</form>
<?php endif; ?>
Korzystamy z alternatywnej, ładnej składni do pisania if-else bloków z HTMLem wewnątrz. Okej, wyświetlmy szukaną frazę:
<?php if (empty($_GET)) : ?>
<form method="GET">
<input type="text" name="q" id="q" value="">
<button type="submit">Search</button>
</form>
<?php elseif (!empty($_GET['q'])) : ?>
<?= "Szukana fraza: " . $_GET['q'] ?>
<?php else : ?>
<form method="GET">
<input type="text" name="q" id="q" value="">
<button type="submit">Search</button>
</form>
<?php endif; ?>
Rozbudowaliśmy sobie nasz if-elseif-else blok, do robienia echo również używamy skróconej wersji składni.
Warto zaznaczyć, że isset nie sprawdza, czy wartość nie jest pusta, zaś !empty tak, dlatego używamy tutaj !empty.
Dodajemy link do wyszukiwania w google – httpbuildquery
Okej, teraz wyświetlimy sobie link do tego:
<?php elseif (!empty($_GET['q'])) : ?>
<?php $q = $_GET['q']; ?>
<?= "Szukana fraza: $q "?>
<?= '<a href="https://www.google.com/search?q='.$q.'">Wyszukaj w Google</a>';?>
<?php else : ?>
Zapisujemy q do zmiennej. Następnie tworząc link mamy tradycyjne dla czystego PHP głupoty – link musi być w cudzysłowie pojedynczym, bo nazwy atrybutów wymagają podwójnego.
Bardzo brzydko, choć to tylko prosty kod, nie „uciekać” rzeczy wprowadzonych przez GET (których w ogóle powinniśmy unikać, chyba że liczby rzutowane do (int) przed użyciem).
<?php elseif (!empty($_GET['q'])) : ?>
<?php $q = htmlspecialchars($_GET['q']); ?>
<?= "Szukana fraza: $q "?>
<?= '<a href="https://www.google.com/search?q='.$q.'">Wyszukaj w Google</a>';?>
<?php else : ?>
Jako tako powinno działać, choć w czystym PHP zazwyczaj nie piszemy, a jeżeli to robimy, to musimy wszystko sprawdzić 10 razy. Czystym PHP programiści innych języków straszą juniorów, jakby nie wiedząc, że w PHP programujesz albo we frameworku albo własny framework udowadniając sobie, że umiesz.
Możemy wypróbować nasz formularz nawet z więcej niż jednym słowem. Zadziała.
Teraz spróbujemy przekierować na stronę Google używając headera location:
<?php elseif (!empty($_GET['q'])) : ?>
<?php
$q = htmlspecialchars($_GET['q']);
header("Location: https://www.google.com/search?q=$q");
exit;
?>
<?php else : ?>
Nie wierzę. Też działa (na wiecej niż 2 wyrazy). „Kiedyś nie działało, ale teraz działa” – nigdy nie miałem jeszcze takiego problemu.
Tym niemniej szybka sztuczka jak to się robi poprawnie:
<?php elseif (!empty($_GET['q'])) : ?>
<?php
$q = htmlspecialchars($_GET['q']);
$url = "https://www.google.com/search?" . http_build_query(['q' => $q]);
header("Location: $url");
exit;
?>
<?php else : ?>
PHP to przede wszystkim frameworki, ale nie tylko frameworki, więc warto czasem choć trochę poćwiczyć to i owo.