diff --git a/login/login.php b/login/login.php index 0182466..b39da33 100644 --- a/login/login.php +++ b/login/login.php @@ -22,6 +22,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["username"]) && isset($ $conn->close(); } elseif ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["guest"])) { $_SESSION["UID"] = 0; + header('Content-Type: application/json'); echo json_encode(["redirect" => "/", "msg" => "Zalogowano jako gość"]); } else jsonMsg("Nieprawidłowy request"); diff --git a/login/register/register.php b/login/register/register.php index 1aef661..410c9c0 100644 --- a/login/register/register.php +++ b/login/register/register.php @@ -22,8 +22,11 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["username"]) && isset($ $password = password_hash($password, PASSWORD_ARGON2I); $stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)"); $stmt->bind_param("ss", $username, $password); - if ($stmt->execute()) echo json_encode(["redirect" => "/login/", "msg" => "Utworzono użytkownika $username"]); - else jsonMsg("Nie udało się utworzyć użytkownika"); + if ($stmt->execute()) { + header('Content-Type: application/json'); + echo json_encode(["redirect" => "/login/", "msg" => "Utworzono użytkownika $username"]); + } else + jsonMsg("Nie udało się utworzyć użytkownika"); } $stmt->close(); $conn->close(); diff --git a/main.sql b/main.sql deleted file mode 100644 index 63c1c2b..0000000 --- a/main.sql +++ /dev/null @@ -1 +0,0 @@ -create table users (UID int PRIMARY KEY AUTO_INCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL); \ No newline at end of file diff --git a/php/functions.php b/php/functions.php index e3d05c9..e006935 100644 --- a/php/functions.php +++ b/php/functions.php @@ -10,7 +10,9 @@ function connectDB() { return $conn; } function jsonMsg($messsage) { + header('Content-Type: application/json'); echo json_encode(["msg" => $messsage]); + exit(); } function checkLogin() { session_start(); diff --git a/sql/insert.sql b/sql/insert.sql new file mode 100644 index 0000000..6c7973d --- /dev/null +++ b/sql/insert.sql @@ -0,0 +1,208 @@ +-- analiza kodu +INSERT INTO questions (content, answerA, answerB, answerC, answerD, answerChar) VALUES +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'), +('Jaki będzie wynik działania poniższego kodu?\n\nKod:\n', '5', '3', '8', 'Błąd składni', 'C'), +("Co wypisze poniższy kod PHP?\n\nKod:\n", '34', '7', '3', 'Błąd typu', 'B'), +('Ile elementów ma tablica w tym kodzie?\n\nKod:\n', '2', '3', '0', 'Błąd', 'B'), +("Co wypisze ten kod?\n\nKod:\n 5) { echo 'duży'; } ?>", 'mały', 'duży', 'nic', 'Błąd składni', 'B'), +('Jaki będzie wynik działania funkcji?\n\nKod:\n', '4', '8', '2', 'Błąd', 'B'), +("Co wypisze kod z operatorem warunkowym?\n\nKod:\n", 'tak', 'nie', 'true', 'false', 'A'), +('Jaka będzie wartość wypisana przez pętlę?\n\nKod:\n', '012', '123', '321', 'Błąd', 'A'), +("Jaki będzie wynik działania `isset()` dla $x = NULL?\n\nKod:\n", 'tak', 'nie', 'NULL', 'Błąd', 'B'), +("Co zostanie wypisane?\n\nKod:\n 'a', 20 => 'b']; echo $x[10]; ?>", '10', 'a', 'b', 'Błąd indeksu', 'B'), +("Jaką wartość wypisze kod?\n\nKod:\n", 'php', 'PHP', 'Php', 'błąd', 'A'); +-- teoria +INSERT INTO questions (content, answerA, answerB, answerC, answerD, answerChar) VALUES +('Co oznacza skrót PHP?', 'Personal Hypertext Processor', 'Private Home Page', 'PHP: Hypertext Preprocessor', 'Program Handling Protocol', 'C'), +('PHP jest językiem:', 'Kompilowanym', 'Interpretowanym', 'Deklaratywnym', 'Maszynowym', 'B'), +('Domyślnym rozszerzeniem pliku z kodem PHP jest:', '.html', '.phtml', '.php', '.js', 'C'), +('PHP działa głównie po stronie:', 'Klienta', 'Serwera', 'Przeglądarki', 'Bazy danych', 'B'), +('Które z poniższych to typy danych w PHP?', 'Integer, String, Float', 'Static, Final, Abstract', 'Byte, Char, Boolean', 'Function, Object, Method', 'A'), +('Które z poniższych NIE jest superglobalną zmienną w PHP?', '$_GET', '$_POST', '$_HTML', '$_SESSION', 'C'), +('Funkcja echo w PHP służy do:', 'Odczytu pliku', 'Wysyłania danych do przeglądarki', 'Tworzenia zmiennej', 'Wysyłania e-maila', 'B'), +('Instrukcja include w PHP:', 'Zatrzymuje skrypt w razie błędu', 'Dodaje zawartość pliku', 'Tworzy nowy plik', 'Wysyła zapytanie do bazy danych', 'B'), +('Który z poniższych operatorów służy do porównania wartości i typu?', '==', '=', '===', '=>', 'C'), +('PHP może być używany z następującym systemem zarządzania bazą danych:', 'MySQL', 'Mongo', 'Redis', 'Hadoop', 'A'), +('Jak rozpoczyna się blok kodu PHP?', '', '', '', 'C'), +('Które z poniższych NIE jest typem błędu w PHP?', 'E_NOTICE', 'E_ERROR', 'E_INFO', 'E_WARNING', 'C'), +('Co zwraca funkcja empty()?', 'true jeśli zmienna nie istnieje lub jest pusta', 'false zawsze', 'true zawsze', 'błąd', 'A'), +('Co zwraca funkcja is_array()?', 'true jeśli argument jest tablicą', 'false dla obiektów', 'true dla stringów', 'błąd', 'A'), +('Jak utworzyć stałą w PHP?', 'define()', 'const', 'setconst()', 'new const()', 'A'), +('Które słowo kluczowe wywołuje klasę nadrzędną?', 'super', 'parent', 'extends', 'base', 'B'), +('Czy PHP rozróżnia wielkość liter w nazwach zmiennych?', 'Tak', 'Nie', 'Czasami', 'Zależy od ustawień', 'A'), +('Która funkcja służy do usunięcia zmiennej?', 'unset()', 'delete()', 'remove()', 'erase()', 'A'), +('Jaką wartość zwróci strcmp("abc", "abc")?', 'true', '0', '1', '-1', 'B'); +-- odpowiedzi kody +INSERT INTO questions (content, answerA, answerB, answerC, answerD, answerChar) VALUES +('Który fragment kodu wyświetli ''Hello World''?', '', '', '', '', 'A'), +('Jak zainicjować tablicę w PHP?', '$arr = array(1, 2, 3);', '$arr = [1, 2, 3];', '$arr = new array(1, 2, 3);', '$arr = create_array(1,2,3);', 'B'), +('Jak sprawdzić, czy zmienna $x istnieje i nie jest NULL?', 'isset($x);', 'empty($x);', 'defined($x);', '$x !== null;', 'A'), +('Jak zapisać instrukcję warunkową IF w PHP?', 'if ($x > 10) { echo $x; }', 'if $x > 10 then echo $x;', 'if: $x > 10 { echo $x; }', 'if $x > 10 { echo $x }', 'A'), +('Jak zdefiniować funkcję w PHP?', 'function add($a, $b) { return $a + $b; }', 'def add($a, $b): return $a + $b', 'func add($a, $b) { return $a + $b; }', 'create function add($a, $b) { return $a + $b; }', 'A'), +('Jak rozpocząć sesję w PHP?', 'session_start();', 'start_session();', 'session.begin();', 'begin_session();', 'A'), +('Jak zapisać komentarz jednoliniowy?', '// komentarz', '/* komentarz */', '# komentarz', '-- komentarz', 'D'), +('Jak sprawdzić długość łańcucha znaków?', 'strlen($str);', 'length($str);', 'count($str);', 'sizeof($str);', 'A'), +('Jak zadeklarować zmienną $name z wartością ''Jan''?', '$name = ''Jan'';', 'name = ''Jan'';', '$name := ''Jan'';', '$name == ''Jan'';', 'A'), +('Jak przypisać wartość do klucza ''imie'' w tablicy?', '$tab[''imie''] = ''Jan'';', '$tab->imie = ''Jan'';', '$tab.imie = ''Jan'';', 'tab[''imie''] = ''Jan'';', 'A'), +('Jak połączyć dwie tablice?', 'array_merge($a, $b);', '$a + $b;', 'merge($a, $b);', '$a.append($b);', 'A'), +('Jak ustawić ciasteczko w PHP?', 'setcookie(''user'', ''Jan'', time()+3600);', 'cookie_set(''user'', ''Jan'');', 'cookie(''user'') = ''Jan'';', 'addcookie(''user'', ''Jan'');', 'A'), +('Jak sprawdzić, czy tablica $a zawiera element?', 'in_array(''wartość'', $a);', '$a.contains(''wartość'');', 'array_has($a, ''wartość'');', '$a->includes(''wartość'');', 'A'), +('Jak wczytać plik i wyświetlić jego zawartość?', 'readfile(''plik.txt'');', 'fopen(''plik.txt'');', 'file.read(''plik.txt'');', 'getfile(''plik.txt'');', 'A'), +('Jak przypisać wartość domyślną, jeśli $x nie jest ustawione?', '$x = $x ?? ''default'';', '$x = isset($x) ? $x : ''default'';', '$x ||= ''default'';', '$x = $x or ''default'';', 'A'), +('Jak zainicjować pustą klasę?', 'class MyClass {}', 'defclass MyClass {}', 'MyClass = class {}', 'new class MyClass() {}', 'A'), +('Jak zadeklarować stałą?', 'define(''PI'', 3.14);', 'const PI = 3.14;', '$PI = 3.14;', 'static PI = 3.14;', 'A'), +('Jak pobrać dane z formularza metodą POST?', '$_POST[''name''];', '$_GET[''name''];', '$post(''name'');', '$_FORM[''name''];', 'A'), +('Jak połączyć się z bazą danych MySQL przez PDO?', 'new PDO(''mysql:host=localhost;dbname=test'', ''root'', '''');', 'pdo_connect(''localhost'', ''test'', ''root'', '''');', 'connect(''mysql'', ''test'');', 'PDO::connect(''localhost'');', 'A'), +('Jak zakończyć skrypt PHP?', 'exit();', 'break;', 'continue;', 'return;', 'A'), +('Jak wywołać metodę obiektu?', '$object->method();', '$object.method();', 'method($object);', 'object->method();', 'A'), +('Jak obsłużyć wyjątek w PHP?', 'try { /* kod */ } catch (Exception $e) { /* obsługa */ }', 'try: /* kod */ except Exception $e: /* obsługa */', 'try { /* kod */ } except (Exception $e) { /* obsługa */ }', 'catch (Exception $e) { /* kod */ }', 'A'), +('Jak zaimplementować pętlę foreach?', 'foreach ($array as $key => $value) { echo $value; }', 'for each $array as $key => $value { echo $value; }', 'foreach $array { echo $value; }', 'for ($array as $key => $value) { echo $value; }', 'A'), +('Jak zadeklarować zmienną statyczną w funkcji?', 'static $count = 0;', '$count = static 0;', 'var static $count = 0;', 'static var $count = 0;', 'A'), +('Jak wywołać funkcję anonimową?', '$func = function() { return 1; }; $func();', 'call(function() { return 1; });', 'function() { return 1; }();', 'func() = function() { return 1; };', 'A'), +('Jak sprawdzić typ zmiennej?', 'gettype($var);', 'typeof($var);', 'type($var);', 'var_type($var);', 'A'), +('Jak przekazać argument przez referencję?', 'function foo(&$var) { $var++; }', 'function foo(ref $var) { $var++; }', 'function foo(&var) { $var++; }', 'function foo(var&) { $var++; }', 'A'), +('Jak użyć operatora warunkowego (ternary)?', '$a = $x > 0 ? 1 : -1;', '$a = if($x > 0) 1 else -1;', '$a = ternary($x > 0, 1, -1);', '$a = $x > 0 then 1 else -1;', 'A'), +('Jak przekonwertować string na integer?', '(int)$str;', 'int($str);', 'intval($str);', 'toInt($str);', 'C'), +('Jak wywołać funkcję rekurencyjną?', 'function fact($n) { return $n <= 1 ? 1 : $n * fact($n - 1); }', 'function fact($n) { return $n * fact($n + 1); }', 'fact(n) { return n * fact(n - 1); }', 'fact($n) { return $n * fact($n - 1); }', 'A'), +('Jak zainicjować zmienną globalną wewnątrz funkcji?', 'global $var;', '$GLOBALS["var"];', 'use global $var;', 'var global $var;', 'A'), +('Jak zadeklarować i użyć tablicę asocjacyjną?', '$arr = ["key" => "value"];', '$arr = {"key": "value"};', '$arr = array("key", "value");', '$arr = array("key" => "value");', 'D'), +('Jak wyświetlić zawartość tablicy?', 'print_r($arr);', 'print($arr);', 'echo $arr;', 'var_dump($arr);', 'A'), +('Jak dodać element na koniec tablicy?', '$arr[] = "nowy";', 'array_push($arr, "nowy");', '$arr->add("nowy");', 'append($arr, "nowy");', 'A'), +('Jak zdefiniować interfejs?', 'interface MyInterface { public function myMethod(); }', 'interface MyInterface { function myMethod(); }', 'class MyInterface { function myMethod(); }', 'interface MyInterface() { }', 'A'), +('Jak przekazać argument do funkcji z domyślną wartością?', 'function foo($x = 10) { return $x; }', 'function foo($x: 10) { return $x; }', 'function foo($x ? 10) { return $x; }', 'function foo($x == 10) { return $x; }', 'A'), +('Jak zadeklarować tablicę wielowymiarową?', '$arr = [[1,2],[3,4]];', '$arr = array(array(1,2), array(3,4));', '$arr = [[1,2], [3,4]];', 'Tylko B i C poprawne', 'D'), +('Jak skonwertować tablicę na JSON?', 'json_encode($arr);', 'json_encode_arr($arr);', 'toJSON($arr);', 'json($arr);', 'A'), +('Jak odczytać JSON do tablicy PHP?', 'json_decode($json, true);', 'json_parse($json);', 'json_to_array($json);', 'decode_json($json);', 'A'), +('Jak usunąć element z tablicy?', 'unset($arr[0]);', 'remove($arr, 0);', 'delete $arr[0];', 'array_remove($arr, 0);', 'A'), +('Jak złapać błąd podczas otwierania pliku?', 'try { fopen("file.txt", "r"); } catch (Exception $e) { echo $e->getMessage(); }', 'if (fopen("file.txt", "r") === false) { echo "Error"; }', 'open("file.txt") or die("Error");', 'fopen("file.txt", "r") or die("Error");', 'D'), +('Jak zadeklarować konstruktor w klasie?', 'public function __construct() {}', 'function constructor() {}', 'function __construct() {}', 'class() {}', 'C'); +-- mysqli +INSERT INTO questions (content, answerA, answerB, answerC, answerD, answerChar) VALUES +('Jak nawiązać połączenie z bazą danych MySQL przy użyciu MySQLi?', 'Użyć funkcji mysqli_connect() z podaniem hosta, użytkownika, hasła i nazwy bazy', 'Użyć funkcji mysql_connect() z podaniem hosta i użytkownika', 'Użyć funkcji PDO z odpowiednim DSN', 'Użyć funkcji mysqli_open()', 'A'), +('Jak sprawdzić, czy połączenie MySQLi powiodło się?', 'Sprawdzić, czy właściwość connect_error jest pusta', 'Użyć funkcji mysqli_check_error()', 'Sprawdzić, czy funkcja mysqli_connect() zwraca true', 'Sprawdzić zmienną globalną $mysqli_error', 'A'), +('Jak wykonać zapytanie SELECT za pomocą MySQLi?', 'Użyć metody query() obiektu MySQLi', 'Użyć funkcji mysql_query()', 'Użyć funkcji mysqli_execute_query()', 'Użyć metody execute() obiektu MySQLi', 'A'), +('Jak pobrać pojedynczy wiersz z wyniku zapytania MySQLi?', 'Użyć metody fetch_assoc() na obiekcie wyniku', 'Użyć metody get_row()', 'Użyć funkcji mysqli_fetch_row()', 'Użyć metody row()', 'A'), +('Jak zamknąć połączenie MySQLi?', 'Wywołać metodę close() na obiekcie MySQLi', 'Użyć funkcji mysqli_close_connection()', 'Użyć funkcji close()', 'Połączenie zamyka się automatycznie, nie trzeba nic robić', 'A'), +('Jak przygotować zapytanie SQL z parametrami?', 'Użyć metody prepare() na obiekcie MySQLi', 'Użyć metody query()', 'Wstawić parametry bezpośrednio w zapytaniu', 'Użyć metody bind_param() bez wcześniejszego prepare()', 'A'), +('Jak powiązać parametry do zapytania przygotowanego w MySQLi?', 'Użyć metody bind_param() z odpowiednimi typami', 'Wstawić zmienne bezpośrednio do zapytania', 'Użyć funkcji bind()', 'Użyć metody execute_param()', 'A'), +('Jak wykonać przygotowane zapytanie?', 'Wywołać metodę execute() na obiekcie statement', 'Użyć metody run()', 'Wywołać metodę query()', 'Użyć funkcji mysqli_exec()', 'A'), +('Jak pobrać wszystkie wyniki zapytania MySQLi w formie tablicy asocjacyjnej?', 'Użyć metody fetch_all(MYSQLI_ASSOC)', 'Użyć metody fetch_array()', 'Użyć funkcji mysqli_get_all()', 'Użyć metody get_results()', 'A'), +('Jak pobrać liczbę zwróconych wierszy z wyniku zapytania?', 'Sprawdzić właściwość num_rows na obiekcie wyniku', 'Użyć funkcji mysqli_num_rows()', 'Użyć metody count_rows()', 'Sprawdzić właściwość rows_count', 'A'), +('Jak zabezpieczyć się przed SQL Injection w MySQLi?', 'Stosować przygotowane zapytania (prepared statements)', 'Ręcznie usuwać niebezpieczne znaki', 'Używać funkcji addslashes()', 'Używać mysql_real_escape_string()', 'A'), +('Jak rozpocząć transakcję w MySQLi?', 'Wywołać metodę begin_transaction() na obiekcie MySQLi', 'Wysłać zapytanie SQL "START TRANSACTION"', 'Użyć funkcji mysqli_start_transaction()', 'Nie można używać transakcji w MySQLi', 'A'), +('Jak zatwierdzić zmiany w transakcji MySQLi?', 'Wywołać metodę commit()', 'Wywołać metodę save()', 'Wywołać funkcję mysqli_commit()', 'Wysłać zapytanie SQL "COMMIT"', 'A'), +('Jak wycofać zmiany w transakcji MySQLi?', 'Wywołać metodę rollback()', 'Wywołać metodę cancel()', 'Wywołać funkcję mysqli_rollback()', 'Wysłać zapytanie SQL "ROLLBACK"', 'A'), +('Jak pobrać ID ostatnio wstawionego rekordu?', 'Użyć właściwości insert_id obiektu MySQLi', 'Użyć funkcji mysqli_insert_id()', 'Wywołać zapytanie SELECT LAST_INSERT_ID()', 'Wszystkie powyższe', 'D'), +('Jak pobrać informację o błędzie MySQLi?', 'Użyć właściwości error obiektu MySQLi', 'Użyć funkcji mysqli_error()', 'Wywołać metodę get_error()', 'Użyć właściwości last_error', 'A'), +('Jak uzyskać kod błędu z ostatniej operacji MySQLi?', 'Użyć właściwości errno', 'Użyć funkcji mysqli_errno()', 'Wywołać metodę get_errno()', 'Użyć właściwości error_code', 'A'), +('Co oznacza "prepare" w kontekście MySQLi?', 'Przygotowanie zapytania do wykonania z parametrami', 'Przygotowanie bazy danych do zapytania', 'Optymalizacja zapytania przez serwer', 'Automatyczne mapowanie wyników zapytania', 'A'), +('Jaka jest główna zaleta używania przygotowanych zapytań w MySQLi?', 'Zapobiegają atakom SQL Injection', 'Przyspieszają wykonanie zapytań o 100%', 'Ułatwiają pisanie kodu', 'Pozwalają na automatyczne tworzenie tabel', 'A'); \ No newline at end of file diff --git a/sql/main.sql b/sql/main.sql new file mode 100644 index 0000000..fe3e465 --- /dev/null +++ b/sql/main.sql @@ -0,0 +1,2 @@ +create table users (UID int PRIMARY KEY AUTO_INCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL); +create table questions (QID int PRIMARY KEY AUTO_INCREMENT, content TEXT, answerA TEXT, answerB TEXT, answerC TEXT, answerD TEXT, answerChar CHAR(1)); \ No newline at end of file diff --git a/test/test.php b/test/test.php index 4f3320e..b55448d 100644 --- a/test/test.php +++ b/test/test.php @@ -5,6 +5,44 @@ if (!checkLogin()) { exit(); } if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST["testLength"])) { - jsonMsg("GENERATE TEST"); + if ($_POST["testLength"]>100) jsonMsg("Test nie może być dłuższy niż 100 pytań"); + $conn = connectDB(); + $stmt = $conn->prepare("SELECT count(*) FROM questions LIMIT 1"); + $stmt->execute(); + $stmt->bind_result($questionsCount); + $stmt->fetch(); + $questionsIDs = []; + {$i = 0; + while ($i != $_POST["testLength"]) { + $randomNum = rand(0, $questionsCount); + if (!in_array($randomNum, $questionsIDs)) { + $questionsIDs[] = $randomNum; + $i++; + } + }} + $stmt->close(); + $filler = implode(",", array_fill(0, count($questionsIDs), "?")); + $stmt = $conn->prepare("SELECT QID, content, answerA, answerB, answerC, answerD FROM questions WHERE QID IN ($filler) ORDER BY FIELD(QID, $filler)"); + $types = str_repeat("i", count($questionsIDs)*2); + $arrMerged = array_merge($questionsIDs, $questionsIDs); + $stmt->bind_param($types, ...$arrMerged); + $stmt->execute(); + $stmt->bind_result($QID, $content, $answerA, $answerB, $answerC, $answerD); + $result = []; + while ($stmt->fetch()) { + $result["questions"][] = [ + "QID" => $QID, + "content" => $content, + "answerA" => $answerA, + "answerB" => $answerB, + "answerC" => $answerC, + "answerD" => $answerD + ]; + } + $stmt->close(); + $conn->close(); + $result["msg"] = "Wygenerowano ". count($result["questions"]). " pytań"; + header('Content-Type: application/json'); + echo json_encode($result); } else jsonMsg("Nieprawidłowy request"); \ No newline at end of file