← Lekcje
PHP · lekcja 25

Powtórka:
PHP od funkcji do bazy danych

Dzisiaj:

  1. Mapa całego działu: od własnych funkcji do bazy danych i błędów
  2. Najczęstsze pomyłki w kodzie i jak ich uniknąć
  3. Ćwiczenie zbiorcze przy komputerze - łączymy formularz, bazę danych i obsługę błędu w jednym pliku
  4. Pytania z egzaminu zawodowego INF.03 do samodzielnego sprawdzenia
Rozgrzewka · 3 minuty

Rozgrzewka: błędy w PHP

  1. Jakie trzy rodzaje błędów z poprzedniej lekcji pojawiają się dopiero w trakcie działania strony (nie liczymy błędu składni)?
  2. Czym różni się skutek ostrzeżenia (Warning) od skutku błędu krytycznego (Fatal error)?
  3. 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.

Funkcje własna funkcja, return lekcje 08-10 Wbudowane gotowe funkcje na tekst, liczby lekcje 11-12 OOP klasa, obiekt, konstruktor lekcje 13-15 Formularz $_POST, $_GET, empty() lekcje 16-17 Baza danych connect, SELECT, INSERT/UPDATE/DELETE lekcje 18-22 Include include, require lekcja 23 Błędy notice, warning, fatal error lekcja 24
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.

PRZEGLĄDARKA formularz HTML method="post"/"get" PHP odbiera dane $_POST / $_GET sprawdza empty(), filter_var() BAZA DANYCH SELECT / INSERT / UPDATE / DELETE przez mysqli_query() PHP buduje HTML z wyniku zapytania albo z komunikatu błędu odpowiedź wraca do przeglądarki jako zwykła strona HTML
Część 3 · Co musisz umieć

Checklist: 8 rzeczy do opanowania

Własna funkcja z parametrem i return lekcje 08-10 Funkcja wbudowana na tekst albo liczby lekcje 11-12 Klasa, obiekt, właściwość, metoda lekcja 13 Konstruktor i widoczność public/private lekcje 14-15 Odbiór $_POST/$_GET i empty() lekcje 16-17 Połączenie z bazą i SELECT w pętli lekcje 18-19 INSERT/UPDATE/DELETE i obsługa błędu lekcje 20-22 include/require i trzy rodzaje błędów lekcje 23-24
Część 4 · Zanim zaczniesz pisać

Najczęstsze pomyłki

Częsty błądCo się dziejePoprawka
= zamiast == w warunkuwarunek jest zawsze prawdziwy, a zmienna dostaje nową wartośćdo porównania używaj == albo ===
brak return w funkcjifunkcja kończy działanie, ale zwraca NULL zamiast wynikudodaj return $result; na końcu funkcji
empty("0")zwraca true - tekst „0” jest traktowany jak puste poledo liczb lepiej sprawdzić $field === ""
brak WHERE w UPDATE/DELETEzapytanie działa na wszystkich wierszach tabeli narazzawsze dodaj WHERE id = ...
include zamiast require dla pliku krytycznegobrak pliku (np. połączenia z bazą) daje tylko ostrzeżenie, strona jedzie dalej i psuje się gdzie indziejdo 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ą

  1. predefiniowaną, używaną do przekazywania danych do skryptów PHP poprzez adres strony.
  2. predefiniowaną, używaną do gromadzenia wartości formularza po nagłówkach zlecenia HTTP (danych z formularza nie można zobaczyć w adresie).
  3. zdefiniowaną przez twórcę strony, służącą do przekazywania danych z formularza przez adres strony.
  4. 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?

  1. 0
  2. TRUE
  3. NULL
  4. 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

  1. int(59)
  2. float(59.85)
  3. string(5) "59.85"
  4. 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ć

  1. hasło użytkownika.
  2. nazwę bazy danych.
  3. nazwę użytkownika.
  4. 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

  1. INSERT INTO
  2. UPDATE
  3. SELECT
  4. ALTER

6. Zadaniem funkcji PHP o nazwie mysql_num_rows() jest

  1. ponumerować rekordy w bazie danych.
  2. zwrócić kolejny rekord z wynikami zapytania.
  3. zwrócić liczbę wierszy znajdujących się w wyniku zapytania.
  4. 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

  1. W folderze htdocs swojego serwera utwórz search-product.html: jedno pole <input name="searchName">, method="get", action="search-product.php" (wzorzec z contact.html, lekcja „Formularze 1/2”).
  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.
  3. Połącz się z bazą shop tak jak w connect-database.php (mysqli_report, mysqli_connect, if (!$db) die(...)).
  4. Zbuduj i wykonaj "SELECT * FROM products WHERE name = '...'" (wzorzec z product-list.php i add-product.php).
  5. 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.
  6. 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ę

  1. Jakie są trzy poziomy widoczności właściwości w klasie PHP i czym się różnią?
  2. Co się dzieje ze stroną, gdy zabraknie pliku dołączanego przez require, a co przy include?
  3. 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 lekcjiW produkcjiStatus
Jedna funkcja w tym samym plikuSetki funkcji pogrupowane w klasy i katalogi, wczytywane automatycznie przez autoloader (np. w Laravel).nadal w użyciu
Klasa Product, właściwości publicStandard PSR-1: nazwy klas w StudlyCaps - tej konwencji trzymają się Laravel i Symfony.nadal w użyciu
mysqli_connect() i dane logowania wprost w kodzieFramework łą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 $_POSTZapytania 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ługiFramework łapie każdy błąd centralnie i pokazuje jedną spójną stronę błędu.narzędzia