Mapa całego działu: od własnych funkcji do bazy danych i błędów
Najczęstsze pomyłki w kodzie i jak ich uniknąć
Ćwiczenie zbiorcze przy komputerze - łączymy formularz, bazę danych i obsługę błędu w jednym pliku
Pytania z egzaminu zawodowego INF.03 do samodzielnego sprawdzenia
Rozgrzewka · 3 minuty
Rozgrzewka: błędy w PHP
Jakie trzy rodzaje błędów z poprzedniej lekcji pojawiają się dopiero w trakcie działania strony (nie liczymy błędu składni)?
Czym różni się skutek ostrzeżenia (Warning) od skutku błędu krytycznego (Fatal error)?
Gdzie w XAMPP szukamy zapisanych błędów, gdy nie są pokazywane na stronie?
Część 1 · Cały dział jedną osią
Mapa działu: od funkcji do błędów
Siedem tematów, siedemnaście lekcji, jedna linia: każdy kolejny temat budował na poprzednim. Funkcje nauczyły was pisać wielokrotnie używany kod. Klasy spakowały ten kod razem z danymi. Formularz i baza dały wam prawdziwe dane do przetwarzania. A błędy nauczyły czytać, co poszło nie tak.
Część 2 · Jeden przepływ, całe dwa działy
Od formularza do gotowej strony
Ten przepływ łączy wszystko, co przerobiliście w formularzach i bazie danych: dane wpisane w przeglądarce trafiają do PHP, PHP rozmawia z bazą danych, a wynik wraca do przeglądarki jako zwykły HTML.
Część 3 · Co musisz umieć
Checklist: 8 rzeczy do opanowania
Część 4 · Zanim zaczniesz pisać
Najczęstsze pomyłki
Częsty błąd
Co się dzieje
Poprawka
= zamiast == w warunku
warunek jest zawsze prawdziwy, a zmienna dostaje nową wartość
do porównania używaj == albo ===
brak return w funkcji
funkcja kończy działanie, ale zwraca NULL zamiast wyniku
dodaj return $result; na końcu funkcji
empty("0")
zwraca true - tekst „0” jest traktowany jak puste pole
do liczb lepiej sprawdzić $field === ""
brak WHERE w UPDATE/DELETE
zapytanie działa na wszystkich wierszach tabeli naraz
zawsze dodaj WHERE id = ...
include zamiast require dla pliku krytycznego
brak pliku (np. połączenia z bazą) daje tylko ostrzeżenie, strona jedzie dalej i psuje się gdzie indziej
do plików bez których strona nie działa użyj require
Egzamin INF.03 (1/2)
Tak pytają na egzaminie
1. W języku PHP zmienna $_GET jest zmienną
predefiniowaną, używaną do przekazywania danych do skryptów PHP poprzez adres strony.
predefiniowaną, używaną do gromadzenia wartości formularza po nagłówkach zlecenia HTTP (danych z formularza nie można zobaczyć w adresie).
zdefiniowaną przez twórcę strony, służącą do przekazywania danych z formularza przez adres strony.
zwykłą, zdefiniowaną przez twórcę strony.
2. Jaką wartość zwróci funkcja empty($a); zapisana w języku PHP, gdy zmienna $a przyjmie wartość liczbową równą 0?
0
TRUE
NULL
FALSE
3.$x = 59.85; var_dump($x); Funkcja PHP var_dump() wyświetla informację na temat zmiennej: jej typ i wartość. Wynikiem dla przedstawionego fragmentu kodu jest
int(59)
float(59.85)
string(5) "59.85"
array(2) { [0]=> int(59) [1]=> int(85) }
CKE, E.14, styczeń 2015, zadanie 31 · CKE, E.14, czerwiec 2019, zadanie 38 · CKE, EE.09, styczeń 2023, zadanie 6 (bank pytań, przedmiot strony, temat php)
Egzamin INF.03 (2/2)
Tak pytają na egzaminie
4.$a = new mysqli('b', 'c', 'd', 'e') W języku PHP, aby połączyć się z bazą danych MySQL przy pomocy biblioteki mysqli, stosując zamieszczony zapis, w miejscu litery 'c' należy zapisać
hasło użytkownika.
nazwę bazy danych.
nazwę użytkownika.
lokalizację serwera bazy danych.
5. Aby przesłać dane za pomocą funkcji mysqli_query() w skrypcie PHP, który wstawia do bazy danych dane pobrane z formularza ze strony internetowej, jako jednego z parametrów należy użyć kwerendy
INSERT INTO
UPDATE
SELECT
ALTER
6. Zadaniem funkcji PHP o nazwie mysql_num_rows() jest
ponumerować rekordy w bazie danych.
zwrócić kolejny rekord z wynikami zapytania.
zwrócić liczbę wierszy znajdujących się w wyniku zapytania.
zwrócić rekord, którego numer podany został w parametrze funkcji.
CKE, E.14, czerwiec 2020, zadanie 38 · CKE, EE.09, czerwiec 2020, zadanie 22 · CKE, E.14, czerwiec 2016, zadanie 36 (bank pytań, przedmiot strony, temat php)
Ćwiczenie zbiorcze przy komputerze · 15 minut
Ćwiczenie: search-product.php
W folderze htdocs swojego serwera utwórzsearch-product.html: jedno pole <input name="searchName">, method="get", action="search-product.php" (wzorzec z contact.html, lekcja „Formularze 1/2”).
Utwórz search-product.php. Odbierz $_GET["searchName"] i sprawdź empty() jak w contact.php z lekcji „Formularze 2/2” - gdy puste, pokaż komunikat i zakończ.
Połącz się z bazą shop tak jak w connect-database.php (mysqli_report, mysqli_connect, if (!$db) die(...)).
Zbuduj i wykonaj "SELECT * FROM products WHERE name = '...'" (wzorzec z product-list.php i add-product.php).
Jeśli !$result, wypisz mysqli_error($db) jak w lekcji „Bazy danych 5/5”. W przeciwnym razie: gdy mysqli_num_rows($result) === 0, wypisz „Brak wyników.”; inaczej w pętli while z mysqli_fetch_assoc() wypisz name i price każdego pasującego produktu.
Zapisz plik i sprawdź go w przeglądarce. Jeśli prowadzisz repozytorium, zrób commit „Dodaje search-product.php”.
Ma działać w trzech przypadkach: nazwa istniejącego produktu pokazuje wiersz z ceną; nazwa nieistniejąca pokazuje „Brak wyników.”; puste pole pokazuje komunikat o pustym polu, bez zapytania do bazy.
Cały plik
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$searchName = $_GET["searchName"] ?? "";
if (empty($searchName)) {
echo "Wpisz nazwę produktu do wyszukania.";
} else {
$db = mysqli_connect("localhost", "root", "", "shop");
if (!$db) {
die("Brak połączenia z bazą.");
}
$query = "SELECT * FROM products WHERE name = '" . $searchName . "'";
$result = mysqli_query($db, $query);
if (!$result) {
echo mysqli_error($db);
} elseif (mysqli_num_rows($result) === 0) {
echo "Brak wyników.";
} else {
while ($row = mysqli_fetch_assoc($result)) {
echo $row["name"] . " - " . $row["price"] . " zł\n";
}
}
}
Na koniec
Sprawdź się
Jakie są trzy poziomy widoczności właściwości w klasie PHP i czym się różnią?
Co się dzieje ze stroną, gdy zabraknie pliku dołączanego przez require, a co przy include?
Dlaczego zapytanie UPDATE albo DELETE bez klauzuli WHERE jest niebezpieczne?
To domyka dział od funkcji do bazy danych. Na następnej lekcji: nowy temat.
Poza szkołą
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Jedna funkcja w tym samym pliku
Setki funkcji pogrupowane w klasy i katalogi, wczytywane automatycznie przez autoloader (np. w Laravel).
nadal w użyciu
Klasa Product, właściwości public
Standard PSR-1: nazwy klas w StudlyCaps - tej konwencji trzymają się Laravel i Symfony.
nadal w użyciu
mysqli_connect() i dane logowania wprost w kodzie
Framework łączy się z bazą raz przez ORM (tłumaczy kod PHP na SQL), dane logowania trzyma w osobnym pliku (np. .env).
zastępowane (frameworkiem)
Zapytanie INSERT sklejone z tekstu i $_POST
Zapytania przygotowane (mysqli_prepare + bind_param) albo PDO (inna biblioteka do baz danych) - dane nigdy nie wchodzą wprost do tekstu zapytania.
nadal w użyciu (dobra praktyka)
Błąd krytyczny zatrzymuje całą stronę bez obsługi
Framework łapie każdy błąd centralnie i pokazuje jedną spójną stronę błędu.