Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Bazy danych PHP

Słowa kluczowe: AUTO_INCREMENT w MySQL CRUD DML w SQL Funkcja mysqli_query() w PHP INSERT INTO w SQL

<?php … $zapytanie = "…"; mysqli_query($db, $zapytanie); … ?> Przedstawiony fragment kodu PHP ma za zadanie umieścić dane znajdujące się w zmiennych...

<?php
…
$zapytanie = "…";
mysqli_query($db, $zapytanie);
…
?>
Przedstawiony fragment kodu PHP ma za zadanie umieścić dane znajdujące się w zmiennych $a, $b, $c w bazie danych, w tabeli dane. Tabela dane zawiera cztery pola, z czego pierwsze to autoinkrementowany klucz główny. Które z poleceń powinno być przypisane do zmiennej $zapytanie?
A.
SELECT NULL, '$a', '$b', '$c' FROM dane;
B.
SELECT '$a', '$b', '$c' FROM dane;
C.
INSERT INTO dane VALUES ('$a', '$b', '$c');
D.
INSERT INTO dane VALUES (NULL, '$a', '$b', '$c');

Pytanie z egzaminu CKE, styczeń 2020 (arkusz EE.09-SG-20.01).

W tym zadaniu chodzi o wykonanie operacji dopisania nowego rekordu do tabeli, więc właściwą instrukcją SQL jest INSERT INTO, a nie SELECT. Tabela dane ma cztery pola, przy czym pierwsze pole jest kluczem głównym z autoinkrementacją. W praktyce oznacza to, że wartości tego pola nie trzeba samodzielnie wymyślać, bo baza danych nada ją automatycznie. W zapisie INSERT INTO dane VALUES (NULL, '$a', '$b', '$c'); wartość NULL w pierwszej kolumnie mówi serwerowi MySQL: wygeneruj numer identyfikatora samodzielnie. Pozostałe trzy wartości trafiają do kolejnych pól tabeli. To pasuje dokładnie do opisu: zmienne $a, $b i $c mają zostać zapisane w rekordzie. Warto też pamiętać, że w prawdziwych aplikacjach lepszą praktyką jest podawanie nazw kolumn, np. INSERT INTO dane (kolumna1, kolumna2, kolumna3) VALUES (...), bo wtedy kod jest odporniejszy na zmianę struktury tabeli. Z mojego doświadczenia jeszcze ważniejsze jest używanie zapytań przygotowanych, czyli prepared statements, zamiast bezpośredniego wklejania zmiennych do SQL. Chroni to przed SQL injection i problemami z apostrofami w danych użytkownika. Jednak w kontekście tego testu, spośród podanych możliwości, poprawna jest właśnie wersja z INSERT oraz NULL dla pola autoinkrementowanego.
Najważniejsza rzecz do zauważenia jest taka, że odczyt danych i zapis danych to dwie różne operacje SQL. Instrukcja SELECT służy do pobierania rekordów z tabeli albo wyliczania jakichś wartości, ale nie tworzy nowego rekordu w bazie. Nawet jeśli w SELECT wpisane są wartości '$a', '$b' i '$c', to serwer jedynie zwróciłby je jako wynik zapytania, ewentualnie powtórzony dla rekordów istniejących w tabeli dane. Nic nie zostałoby zapisane. To dość typowa pomyłka, bo składnia wygląda podobnie do pracy z danymi, ale cel instrukcji jest kompletnie inny. Do dopisywania rekordu używa się INSERT INTO. Trzeba jednak dopasować liczbę wartości do liczby kolumn, jeśli nie podaje się jawnie listy kolumn. Skoro tabela ma cztery pola, to zapis INSERT INTO dane VALUES ('$a', '$b', '$c'); jest niepełny, bo przekazuje tylko trzy wartości. Baza danych będzie oczekiwała wartości dla wszystkich czterech pól, chyba że w zapytaniu wskażemy konkretne kolumny, do których wstawiamy dane. Ponieważ pierwsze pole jest autoinkrementowanym kluczem głównym, nie wpisuje się tam normalnej wartości użytkownika. Najczęściej podaje się NULL albo pomija tę kolumnę przy użyciu listy kolumn. Moim zdaniem dobry nawyk to zawsze pisać zapytania w stylu INSERT INTO dane (nazwa, opis, wartosc) VALUES (?, ?, ?), szczególnie w PHP, gdzie dane często pochodzą z formularzy. Samo mysqli_query($db, $zapytanie) wykona zapytanie, ale nie zabezpieczy go automatycznie przed błędami składni czy wstrzyknięciem SQL. Dlatego poprawna koncepcja to INSERT, komplet wartości zgodny ze strukturą tabeli oraz pozostawienie identyfikatora bazie danych.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.