Certyfikat ZendPHP

Baza Danych I SQL

Bazy danych to narzędzie do utrwalania danych, do których zamierzasz się regularnie odnosić i które musisz przechowywać przez długi czas. PHP używa rozszerzeń do interakcji z wieloma bazami danych. Na przykład do interakcji z bazą danych MySQL można użyć funkcji udostępnianych przez rozszerzenie mysqli.

Uwaga : Na końcu mysqli znajduje się "i". Jest to zamiennik przestarzałego rozszerzenia mysql. Funkcje takie jak "przygotowane wyciągi" są dostępne tylko z nowym rozszerzeniem.

PHP oferuje również warstwy abstrakcji, które zapewniają warstwę aplikacji między twoim kodem a bazą danych. W tym kursie przyjrzymy się PDO (PHP Data Objects). Skupimy się na relacyjnych bazach danych, ale warto o tym wspomnieć, przekazując alternatywę dla relacyjnych baz danych. MongoDB to bardzo popularna baza danych NoSQL, która przyczyniła się do stworzenia sterownika dla PHP, który umożliwia połączenie z bazą danych. Będziemy koncentrować się na natywnych relacyjnych bazach danych, a sterownik MongoDB prawdopodobnie nie zostanie uwzględniony w badaniu Zend. Od egzaminu Zend wymaga się podstawowej znajomości języka SQL. Zakładanym środowiskiem będzie MySQL, jeśli pytanie nie określi inaczej.

Podstawy bazy danych

Zacznijmy od upewnienia się, że niektóre pojęcia relacyjnych baz danych są jasne.

Klucze

Klucze nakładają ograniczenia, takie jak PRIMARY i UNIQUE. Klucz podstawowy można zdefiniować w jednej lub wielu kolumnach. Gwarantuje to, że każdy wiersz w bazie danych będzie miał unikalną kombinację wartości dla kolumn w kluczu. Wiersz może nie mieć wartości null dla swojego klucza podstawowego. Tabela może mieć tylko jeden klucz podstawowy. Klucz obcy można również zdefiniować w jednej lub wielu kolumnach. Odwołuje się do klucza podstawowego w innej tabeli. Jest to unikalne odwołanie, więc tylko jeden wiersz w tabeli, do której istnieje odwołanie, zostanie połączony z tabelą zawierającą klucz obcy.

Indeksy

Indeksy to struktury danych potrzebne do wdrożenia kluczowego ograniczenia. Indeksy przyspieszają wyszukiwanie rekordów. Aparat bazy danych utworzy strukturę na dysku lub w pamięci, która zawiera dane z indeksowanych kolumn. Ta struktura jest zoptymalizowana do wyszukiwania i pomaga bazie danych szybciej znaleźć wiersz w tabeli. Ilekroć wstawiasz wiersz do tabeli, indeksy muszą być aktualizowane. To dodaje narzutu do pisania. Nie można mieć klucza bez indeksu, ale możliwe jest indeksowanie, które są kolumnami bez klucza. Zrobiłbyś to w przypadkach, gdy nie chcesz wymuszać wyjątkowości, ale chcesz przyspieszyć instrukcje SELECT, które zawierają te kolumny w swoich klauzulach WHERE. Wiązanie między kluczami i indeksami jest bardzo ścisłe, aw MySQL są one uważane za synonimy.

Relacje

Relacje są podstawową cechą relacyjnych baz danych. Deklarując, w jaki sposób tabele są powiązane, możesz wymusić integralność referencyjną i zminimalizować brudne dane. Istnieje kilka rodzajów relacji

Relacja : Opis

Jeden do jednego : Jeden wiersz w tabeli nadrzędnej może odwoływać się dokładnie do jednego wiersza w obiekcie podrzędnym tabeli
Jeden do wielu : Jeden wiersz w tabeli nadrzędnej może odnosić się do wielu wierszy w tabeli potomnej
Wiele do wielu : Dowolna liczba wierszy w tabeli nadrzędnej może odnosić się do dowolnej liczby wierszy w tabeli potomnej.

Dzięki relacjom między tabelami można przechowywać dane, które są logicznie powiązane razem w tabeli innej niż inne dane. Na przykład możesz mieć tabelę produktów, która przechowuje informacje o tym, co sprzedajesz. Produkty należą do kategorii. Jedna kategoria może zawierać wiele różnych produktów. Oznacza to, że do jednego wiersza w tabeli kategorii może odnosić się wiele wierszy w tabeli produktów.

Typy danych SQL

Kolumny w tabeli bazy danych SQL mają przypisany typ danych. Podobnie jak w przypadku typów zmiennych PHP, typy SQL mogą przechowywać różne formaty danych. Każdy menedżer bazy danych będzie implementował typy danych SQL nieco inaczej i będzie miał różne optymalizacje między ich typami. Omawiamy kilka typowych typów danych i unikamy skupiania się na konkretnej implementacji SQL.

Typy numeryczne

Rodzaje liczb całkowitych różnią się ilością bajtów potrzebnych do przechowywania ich wartości. Poniższa tabela ilustruje rozmiary liczb całkowitych dla bazy danych MySQL:



Wskazówka : MySQL pozwala określić parametr dla liczb całkowitych, który w rzeczywistości jest wartością wyświetlaną i nie wpływa na podstawową pamięć. Dość powszechne błędne przekonanie, że parametr dotyczy precyzji.

Typy niecałkowite mogą być przechowywane w wartościach NUMERYCZNYCH lub DECIMAL. Standard SQL-92 określa, że typ NUMERIC musi mieć dokładnie określoną dokładność, podczas gdy typ DECIMAL musi być co najmniej tak dokładny. Implementacja tych typów danych różni się w zależności od dostawcy. Oba mają te same parametry:

NUMERIC (21,3)

Pierwszy parametr określa całkowitą liczbę cyfr precyzji, a drugi parametr określa, ile cyfr precyzji dziesiętnej musi być przechowywanych. W tym przykładzie będziemy przechowywać liczbę, która ma w sumie 21 cyfr, z których trzy pojawiają się po przecinku.

Rodzaje znaków

SQL pozwala na zapisywanie znaków w ciągach o stałej lub zmiennej długości. Ciągowi o stałej długości zawsze przydzielana jest taka sama liczba bajtów na dysku. Może to pomóc przyspieszyć wydajność odczytu w niektórych implementacjach baz danych. Kompromis polega na tym, że jeśli ciąg przechowywany w magazynie danych o stałej długości jest krótszy niż liczba przydzielonych znaków, to zapisujesz więcej znaków, niż musisz. Ciągi o zmiennej długości mogą puchnąć do podanego im ograniczającego rozmiaru. Aparat bazy danych przydziela pamięć zgodnie z długością łańcucha. Implementacje bazy danych będą przechowywać długość przechowywanego ciągu. Będzie to co najmniej jeden znak wskazujący koniec łańcucha, ale w niektórych silnikach każdy łańcuch zmienny spowoduje większe obciążenie pamięci. Ogólnie rzecz biorąc, przechowując ciąg znaków, o którym wiesz, że zawsze będzie miał określoną długość, na przykład skrót, powinieneś przechowywać go w polu znaków o stałej długości. Poprawi to wydajność i nie będziesz ponosił strat pamięci.

Praca z SQL

Nie skupimy się na żadnej konkretnej implementacji SQL i raczej spróbujemy użyć instrukcji ogólnych. Egzamin Zend nie będzie sprawdzał twojej wiedzy na temat konkretnego silnika bazy danych, ale będzie wymagał znajomości podstawowej składni SQL.

Tworzenie bazy danych i tabeli

Instrukcja CREATE może służyć do tworzenia baz danych i tabel. Tworzenie bazy danych jest proste; wystarczy podać nazwę bazy danych:

CREATE DATABASE mydatabase;

Podczas tworzenia tabeli możesz określić listę kolumn, które chcesz w niej przechowywać. Dla każdej kolumny określ nazwę, typ danych i atrybuty.

CREATE TABLE IF NOT EXISTS users (
id int unsigned NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
email varchar(255) NOT NULL,
password varchar(60) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY users_email_unique (email)
);

Usuwanie bazy danych i tabel

Odwrotnością CREATE jest instrukcja DROP

DROP TABLE category;
DROP DATABASE mydatabase;

Jeśli określisz klucze obce, baza danych nie pozwoli upuścić tabeli, jeśli naruszy to jedno z ograniczeń. Na przykład zapoznaj się z naszym przykładem produktów i kategorii. Jeśli spróbujemy usunąć tabelę kategorii i nadal istnieją produkty, które się do niej odwołują, aparat bazy danych nie powinien zezwalać na operację.

Pobieranie danych

Instrukcja SELECT służy do pobierania danych. Składnia SELECT może być bardzo skomplikowana i jest jedną z instrukcji, która najbardziej różni się między dostawcami. Musisz zrozumieć podstawowe zasady użytkowania i dołączyć do certyfikatu Zend. W tym prostym pseudokodowym przykładzie zapytania pobieramy nazwy produktów z naszej tabeli, które kosztują ponad 100 jednostek walutowych. Określamy, że chcemy, aby wyniki były zwracane w malejącej kolejności ceny.

SELECT name
FROM products
WHERE price > 100
ORDER BY price DESC

Możesz podać wiele nazw kolumn oddzielonych przecinkami lub użyć symbolu wieloznacznego *, aby otrzymać wszystkie kolumny. Format danych otrzymywanych przez PHP zależy od sterownika i funkcji używanej do wywołania zapytania. Zazwyczaj otrzymasz obiekt lub tablicę, która ma klucze / właściwości odpowiadające kolumnom.

Wstawianie nowych danych

Instrukcja INSERT służy do tworzenia nowych wierszy w bazie danych. Musisz podać listę kolumn i wartości, które chcesz w nich wstawić. Kolumny oznaczone NOT NULL są obowiązkowe i muszą mieć określoną wartość podczas tworzenia wiersza.

INSERT INTO products
(name, price, category_id) VALUES
('cheeseburger', 100, 3)

Jeśli nie podasz nazw kolumn, SQL przyjmie, że podajesz wartości w kolejności, w której kolumny pojawiają się w tabeli. Może to być wadą, jeśli zmienisz strukturę swojego stołu. W przeciwnym razie, tak jak w przykładzie, określasz nazwy kolumn, a następnie wartości. Wartości są przypisywane do kolumn w kolejności. Tak więc w tym przykładzie nazwa produktu jest ustawiona na "cheeseburger", jego cena wynosi 100 i jest umieszczana w kategorii która ma wartość ID 3 (cokolwiek to może być).

Aktualizowanie danych

Instrukcja UPDATE akceptuje listę wartości podobnych do instrukcji INSERT, a także opcjonalną klauzulę WHERE podobną do instrukcji SELECT. Należy określić, do jakich wartości należy zaktualizować istniejące dane, oraz kryteria dotyczące wierszy, które należy zaktualizować.

UPDATE products
SET price = price + 100
WHERE category_id = 3;

Agregowanie danych

Możesz użyć bazy danych do wykonywania obliczeń i wysyłania wyników.

Instrukcja : Zwraca

AVG : Średnia wartość wartości danych
SUM : Wszystkie znalezione wartości danych
COUNT : Ile rekordów znaleziono
DISTINCT COUNT : Ile unikalnych rekordów znaleziono
MIN : Najniższa wartość w zestawie danych
MAX : Najwyższa wartość w zestawie danych

Korzystanie z tych funkcji wygląda następująco:

SELECT AVG (price) FROM products;

Grupowanie danych

Możesz nakazać SQLowi grupowanie danych według kolumny lub kombinacji kolumn przed zwróceniem ich do Ciebie. Jest to często przydatne w połączeniu z funkcjami agregującymi. Rozważmy przykład, w którym chcemy dowiedzieć się, jaką całkowitą wielkość sprzedaży kupił każdy z naszych klientów.

SELECT email, SUM( sales_value )
FROM `transactions`
GROUP BY email

W tym przykładzie grupujemy transakcje, które mają ten sam adres e-mail. Aparat bazy danych SQL zastosuje instrukcję SUM, dodając wartości sprzedaży w każdej grupie, a następnie zwracając ją. Podałem adres e-mail w wyciągu SELECT, aby wydruk miał adres e-mail klienta oraz sumę wszystkich wartości sprzedaży transakcji z ich adresem e-mail.

Połączenia

Połączenia służą do łączenia tabel na podstawie dostarczonych kryteriów. Umożliwia to pobieranie informacji z powiązanych tabel. W bazie danych produktów i kategorii możesz pobrać nazwę kategorii produktów, łącząc tabelę kategorii z tabelą produktów:

SELECT *
FROM products
JOIN categories ON categories.id = products.category_id

Łączymy tabelę kategorii z tabelą produktów i udzielamy instrukcji SQL dotyczących dopasowywania wierszy. Wiersz z tabeli kategorii zostanie dołączony, jeśli jego kolumna id pasuje do kolumny category_id w tabeli produktów.

Typ Połączenia

Istnieje kilka sposobów łączenia tabel.

Typ Dołączenia : Efekt

INNER JOIN : Wybiera rekordy, które mają pasujące wartości w obu tabelach, jak w poprzednim przykładzie
LEFT OUTER JOIN : Wybiera tabele z lewej tabeli, które pasują do zapisów prawej tabeli
RIGHT OUTER JOIN : Wybiera rekordy z prawej tabeli, które pasują do zapisów w lewej tabeli
FULL OUTER JOIN : Wybiera wszystkie rekordy, które pasują do lewego lub prawego rekordu tabeli

Przygotowane oświadczenia

Wydając polecenie silnikowi SQL, musi on parsować polecenie w celu jego wykonania. Po wykonaniu instrukcji SQL odrzuci skompilowany kod, w wyniku czego wielokrotne wywołania z tym samym poleceniem SQL będą musiały zostać przeanalizowane indywidualnie. Oczywiście powoduje to podwójny wysiłek. Możesz uratować SQL przed powtarzaniem wysiłków, używając przygotowanych instrukcji, które stają się szablonami parsowanego kodu, które SQL przechowuje do wielokrotnego użytku. Przygotowane wyciągi oferują również znaczące korzyści bezpieczeństwa. Parametry są powiązane z przygotowaną instrukcją i nie są uwzględniane jako część ciągu kodu. Oznacza to, że twoje parametry nie mogą ingerować w kod, co oznacza, że nie musisz się już martwić o ucieczkę kodu, aby zapobiec wstrzyknięciu SQL. Pamiętaj tylko o możliwości przechowywania ataków XSS, zanim przestaniesz się martwić ucieczką danych wchodzących lub wychodzących z bazy danych.

$stmt = $conn->prepare("INSERT INTO users (username, password) VALUES
(?, ?)");
$stmt->bind_param("ss", $username, $password);
// ustaw parametry
$username = "bob";
$password = password_hash("password", PASSWORD_BCRYPT);
// uruchom tą instrukcję
$stmt->execute();

Transakcje

Transakcja to zestaw instrukcji SQL, które albo wszystkie zakończą się powodzeniem, albo nie przyniosą żadnego efektu. Po zakończeniu transakcji w bazie danych nie może zostać unieważnione żadne ograniczenie tabeli i musi być w stanie, w którym wszystkie zmiany zostały utrwalone. Baza danych musi mieć pewien sposób zapewnienia, że transakcje mogą przebiegać w tym samym czasie i nie kolidują ze sobą, na przykład poprzez zwiększenie klucza podstawowego, od którego zależy inna transakcja. Podsumowując, transakcja to zestaw instrukcji SQL, które muszą zostać pomyślnie zakończone w sposób "wszystko albo nic". Po uruchomieniu baza danych musi być w spójnym stanie i musi być możliwa do odzyskania po błędzie. Składnia transakcji jest różna dla różnych dostawców, ale istnieją trzy ważne instrukcje.

•  Jedna instrukcja oznacza początek bloku transakcji. Instrukcje SQL następujące po tym będą częścią transakcji.
•  Istnieją dwa wyciągi, które mogą zakończyć transakcję. Jeden z nich powie SQL, aby kontynuował i wprowadził wszystkie zmiany, które wprowadza transakcja.
•  Druga instrukcja końcowa powie SQL, że z jakiegokolwiek powodu chcesz porzucić transakcję i powrócić do stanu, w którym baza danych była w momencie rozpoczęcia transakcji.

Oto trzy najczęstsze instrukcje dostawcy:

MySQL : MS-SQL : ORACLE

START TRANSACTION : BEGIN TRANSACTION : START TRANSACTION
COMMIT : COMMIT TRANSACTION : COMMIT
ROLLBACK : ROLLBACK WORK : ROLLBACK

Obiekt danych PHP (PDO)

PDO to warstwa abstrakcji danych, która oferuje jeden interfejs umożliwiający interakcję z wieloma źródłami danych. Korzystając z PDO, możesz używać tych samych funkcji do interakcji z bazą danych, bez względu na dostawcę. Ważne jest, aby zrozumieć, że PDO jest warstwą abstrakcji dostępu i nie abstrakuje SQL ani typów danych. Kod SQL przekazywany do PDO :: query () lub przygotowane instrukcje muszą być poprawne dla dostawcy, z którym się łączysz. PDO używa adapterów bazy danych do łączenia się z bazą danych. Te klasy adapterów implementują interfejsy PDO i ujawniają funkcje specyficzne dla dostawcy jako zwykłe funkcje rozszerzenia. PDO jest skonfigurowany w pliku konfiguracyjnym PHP. W czasie wykonywania można zmieniać opcje za pomocą funkcji PDO :: setAttribute (). Rozszerzenie PDO udostępnia kilka predefiniowanych stałych. Nie musisz pamiętać ich wszystkich do egzaminu Zend, ale przejrzyj podręcznik PHP i zapoznaj się z nimi. ChNP będzie emulować przygotowane instrukcje dla baz danych, które ich nie obsługują, ale w przeciwnym razie użyje natywnej funkcji przygotowanej instrukcji bazy danych.

Łączenie z PDO

Aby połączyć się z bazą danych za pomocą PDO, należy utworzyć instancję klasy PDO. Konstruktor akceptuje parametry źródła bazy danych (DSN) oraz nazwę użytkownika / hasło, jeśli są one wymagane.

< ?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
echo "Error connecting to database: " . $e->getMessage();
}

Jeśli wystąpią błędy podczas łączenia się z bazą danych, zgłoszony zostanie wyjątek PDOException. Bardzo ważne jest, aby pamiętać, że ślad stosu wyjątku prawdopodobnie będzie zawierać pełne szczegóły połączenia z bazą danych. Upewnij się, że go złapiesz i nie pozwól, aby wyświetlał się RAW. Aby zamknąć połączenie, gdy skończysz, możesz ustawić zmienną PDO na null.

$ dbh = null;

Połączenia z bazą danych są automatycznie zamykane na końcu uruchomionego skryptu, chyba że ustawisz je jako trwałe. Trwałe połączenia z bazą danych nie są zamykane, ale są buforowane dla innej instancji skryptu do użycia. Zmniejsza to narzut związany z koniecznością łączenia się z bazą danych przy każdym uruchomieniu aplikacji internetowej.

Transakcje w PDO

PDO oferuje także polecenia transakcyjne, ale nie emuluje właściwej obsługi transakcji. Oznacza to, że możesz używać funkcji transakcyjnych PDO tylko w bazach danych, które natywnie obsługują transakcje. Są to PDO :: beginTransaction (), PDO :: commit () i PDO :: rollBack ().

< ?php
$dsn = 'mysql:host=localhost;dbname=example';
$pdo = new PDO($dsn, 'dbuser', 'dbpass');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
$pdo->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$password = password_hash("password", PASSWORD_BCRYPT);
try {
$pdo->beginTransaction();
$pdo->exec("
INSERT INTO users
(username, password)
VALUES
('bob', '{$password}'");
// więcej instrukcji aktualizacji lub wstawiania
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollBack();
echo 'Rolled back because: ' . $e->getMessage();
}

W tym przykładzie nawiązujemy połączenie z bazą danych za pomocą PDO i rozpoczynamy transakcję. Wszystkie funkcje transakcyjne PDO zawijamy w blok try … catch. Jeśli instrukcja PDO nie uruchomi się, zgłosi wyjątek PDO. Używamy bloku catch, aby wycofać transakcję.

Pobieranie wyników PDO

Używamy metody PDO :: fetch() do pobierania danych z wyniku PDO. PDO będzie utrzymywał kursor, aby przechodzić przez zestaw wyników i użyje go, aby określić, który element do ciebie zwróci. PDO zwróci Ci dane w formacie określonym w pierwszym parametrze fetch().

Styl pobierania : Zwraca

PDO :: FETCH_ASSOC - Zwraca tablicę asocjacyjną z kolumnami bazy danych jako klucze.
PDO :: FETCH_NUM - Zwraca tablicę indeksowaną według numeru kolumny zwróconej przez twój zestaw wyników.
PDO :: FETCH_BOTH - Zwraca tablicę z indeksami stylu pobierania ASSOC i NUM
PDO :: FETCH_BOUND - Zwraca wartość true i przypisuje wartości kolumn w wyniku ustawionym na zmienne PHP, z którymi były powiązane metodą PDOStatement :: bindColumn().
PDO :: FETCH_CLASS - Zwraca nową instancję żądanej klasy mapującej kolumny zestawu wyników do nazwanych właściwości w klasie.
PDO :: FETCH_INTO - Aktualizuje istniejącą instancję żądanej klasy, mapując jako dla FETCH_CLASS.
PDO :: FETCH_OBJ - Zwraca anonimowy obiekt o nazwach właściwości, które odpowiadają nazwom kolumn z zestawu wyników.
PDO :: FETCH_LAZY - Łączy PDO :: FETCH_BOTH i PDO :: FETCH_OBJ i tworzy nazwy zmiennych obiektowych, gdy są dostępne.
PDO :: FETCH_NAMED - Podobnie jak w przypadku PDO :: FETCH_ASSOC, zwraca tablicę asocjacyjną. Jeżeli jest tam wiele kolumn o tej samej nazwie, o której mowa tym kluczem będzie tablica wszystkich wartości w wierszu, który miał nazwa tej kolumny

Przygotowane oświadczenia w PDO Nie wszystkie silniki baz danych obsługują przygotowane instrukcje i jest to jedyna funkcja, którą PDO będzie emulować dla adapterów, które nie obsługują. Składnia przygotowanej instrukcji w PDO jest bardzo podobna do korzystania z funkcji natywnej. prepare("INSERT INTO users (name, email) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindValue(':email','alice@example.com'); // insert one row $name = 'one'; $stmt->execute(); Przechodząc przez przykład, widzimy, że do przygotowania obiektu instrukcji używana jest metoda prepar(). Używamy dwóch różnych form parametrów wiązania, aby pokazać różnicę. W pierwszym bindParam \() wiążemy zmienną z parametrem instrukcji. Po wykonaniu instrukcji parametr przyjmuje wartość zmiennej w czasie wykonywania. Drugi sposób wiązania zmiennych, bindValue(), wiąże literał z parametrem instrukcji. Jeśli użyłeś nazwy zmiennej w bindValue(), wówczas używana jest wartość zmiennej w momencie wiązania. Zmiany w zmiennej przed wykonaniem instrukcji nie wpłyną na wartość parametru. Możesz również przekazać wartości do powiązania jako tablicę w wywołaniu do wykonania, jak w tym przykładzie:

< ?php
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);
$user = $stmt->fetch();
W instrukcji SQL można powiązać tylko wartości, a nie encje takie jak nazwy tabel lub kolumny. Możesz wiązać tylko wartości skalarne, a nie zmienne złożone, takie jak tablice lub obiekty.

Powtarzające się wezwania do przygotowanych wyciągów PDO

Widziałeś, że metoda bindParam() wstawia wartość zmiennej w momencie wykonania instrukcji do parametru instrukcji. Widać, że użycie bindParam() pozwala wielokrotnie wywoływać przygotowane polecenie, używając różnych wartości dla parametru przy każdym połączeniu. Metoda closeCursor() służy do wyczyszczenia kursora bazy danych i przywrócenia instrukcji do stanu, w którym można ją ponownie wykonać. Niektóre bazy danych mają problemy z wykonaniem przygotowanej instrukcji, gdy poprzednio wykonana instrukcja nadal ma nieosiągnięte wiersze.


QUIZ



P1: Możesz użyć funkcji ____________, aby zbudować ciąg zapytania HTTP odpowiedni dla GET lub POST z tablicy.

---------------------------------------
http_build_query()

http_build_param()

parse_url()

urlencode()

P2: Funkcja PHP encodeurl () służy do:

---------------------------------------
Upewnij się, że adres URL jest zakodowany w UTF-8.

Konwertuj zastrzeżone znaki w adresie URL na% zakodowanych symboli.

Z tablicy zbuduj ciąg odpowiedni dla parametrów GET.

Nie ma takiej funkcji PHP.

P3: Jakie są zalety korzystania z przygotowanych instrukcji; wybrać tyle, które mają zastosowanie?

---------------------------------------
Mogą być bezpieczniejsze niż zwykłe zapytania.

Są szybsze w przypadku powtarzających się zapytań.

Możesz użyć tego samego zapytania u różnych dostawców baz danych.

Żadne z powyższych.

P4: Mam informacje o klientach przechowywane w tabeli. Każdy wiersz ma identyfikator_konta, który jest kluczem obcym do tabeli zwanej kontami. Jak wybrać kolumnę kodu pocztowego z tabeli adresowej dla klienta o identyfikatorze 123?

---------------------------------------
SELECT `postcode` FROM `accounts` WHERE customer_id = 123;

SELECT `postcode` FROM `accounts` AS `acc`

JOIN `customers` as `cust` ON `cust.id` = `acc.id` WHERE `c`.id = 123

SELECT `postcode` FROM `accounts` AS `a`

JOIN `customers` as `c` ON `c.account_id` = `a`.`id` WHERE `c`.id = 123

SELECT `postcode` FROM `accounts` AS `a`

FULL OUTER JOIN `customers` as `c` ON `c.id` = `a.id` WHERE `c`.id = 123


ODPOWIEDZI



•  http_build_query()

•  Nie ma takiej funkcji PHP

•  Mogą być bezpieczniejsze niż zwykłe zapytania. ; Są szybsze w przypadku powtarzających się zapytań.

•  SELECT `postcode` FROM `accounts` AS `a`
JOIN `customers` as `c` ON `c.account_id` = `a`.`id`
WHERE `c`.id = 123