Przykład zawiera kompletny panel administratora dla tabeli MySQL z blokowaniem ataków SQL Injection (wstrzyknięcia kodu).
Krok 1 – Wyświetlanie tabeli SQL z bazy
Łączenie z bazą + kontrola niepustości wstawianych zmiennych
polacz.php:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php function wczytaj($zmienna) { if (!isset($_GET[$zmienna]) || $_GET[$zmienna]=="") die( "Blad! brak zmiennej: ".$zmienna ); // nie podano marki w $ return $_GET[$zmienna]; } $baza = new mysqli("localhost", "uzytkownik", "haslo", "baza"); if (mysqli_connect_errno()) die( "Blad: ".mysqli_connect_error() ); $baza->set_charset("utf8"); ?> |
Wyświetlanie tabeli:
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <html> <head> <meta charset="utf-8"> <title>Panel admina</title> </head> <body> <h1>Panel Administratora</h1> <table border="1"> <tr> <th>Numer nadwozia</th><th>Model</th><th>Marka</th><th>Rocznik</th><th>Cena</th><th>Kolor</th><th>Wyposażenie</th> <th>Edycja</th><th>Usuwanie</th> </tr> <?php include "polacz.php"; if ($sql = $baza->prepare("SELECT * FROM samochody ORDER BY marka, model")) { $sql->execute(); $sql->bind_result($nr_nadwozia, $model, $marka, $rocznik, $cena, $kolor, $wyposazenie); while ($sql->fetch()) { echo "<tr> <td>$nr_nadwozia</td> <td>$model</td> <td>$marka</td> <td>$rocznik</td> <td>$cena</td> <td bgcolor=\"$kolor\">$kolor</td> <td>$wyposazenie</td> <td><a href=\"edycja.php?nr=$nr_nadwozia\">Edytuj</a></td> <td><a href=\"usun.php?nr=$nr_nadwozia\" onclick=\"javascript:return confirm('Czy na pewno usunąć?'); \">Usuń</a></td> </tr>"; } $sql->close(); } else die( "Błąd w zapytaniu SQL! Sprawdź kod SQL w PhpMyAdmin: ". $baza->error ); $baza->close(); ?> </table> <a href="dodaj.php">Dodawanie nowego</a> </body> </html> |
Krok 2 – Wstawianie nowego obiektu do tabeli
Formularz:
dodaj.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <html> <head> <meta charset="utf-8"> <title>Dodaj nowy obiekt</title> </head> <body> <h1>Dodawanie do bazy</h1> <form method="get" action="insert.php"> <table border="0"> <tr><td>Numer silnika</td><td><input type="number" name="nr" maxlen="20" size="20"></td></tr> <tr><td>Marka</td><td><input name="marka"></td></tr> <tr><td>Model</td><td><input name="model"></td></tr> <tr><td>Kolor</td><td><input type="color" name="kolor"></td></tr> <tr><td>Rocznik</td><td><input type="number" min="1990" max="2020" name="rocznik"></td></tr> <tr><td>Cena</td><td><input type="number" step="0.01" name="cena"></td></tr> <tr><td>Wyposażenie</td><td><input name="wyposazenie" maxlen="20" size="20"></td></tr> <tr><td colspan="2"><input type="submit" value="wstaw"></td></tr> </table> </form> </body> </html> |
Wstawianie danych z formularza do tabeli MySQL
insert.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php include "polacz.php"; $nr = wczytaj("nr"); $marka = wczytaj("marka"); $model = wczytaj("model"); $kolor = wczytaj("kolor"); $rocznik = wczytaj("rocznik"); $cena = wczytaj("cena"); $wyposazenie = wczytaj("wyposazenie"); $sql = $baza->prepare("INSERT INTO samochody VALUES (?, ?, ?, ?, ?, ?, ?);"); if ($sql) { $sql->bind_param("issidss", $nr, $model, $marka, $rocznik, $cena, $kolor, $wyposazenie); $sql->execute(); $sql->close(); } else die( 'Błąd: '. $baza->error); $baza->close(); header ("Location: http://ti.fulara.com/~adam/paneladmina/"); ?> |
Krok 3: Edycja danych z tabeli MySQL
Formularz ze starymi wartościami z bazy MySQL
edycja.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?php include "polacz.php"; $nr = wczytaj("nr"); if ( $sql = $baza->prepare( "SELECT * FROM samochody WHERE numer_nadwozia = ?;")) { $sql->bind_param("i" ,$nr); $sql->execute(); $sql->bind_result($numer_nadwozia, $model, $marka, $rocznik, $cena, $kolor, $wyposazenie); if (!$sql->fetch()) die("Blad!!! Brak rekordu do edycji w bazie!!! Liczba rekodow:".$sql->num_rows); /////////////////////// HTML w PHP echo ' <html> <head> <meta charset="utf-8"> <title>Edycja obiektu</title> </head> <body> <h1>Edycja rekordu z bazy</h1> <form method="get" action="update.php"> <table border="0"> <tr><td>Numer silnika</td><td><input name="nr" value="'.$nr.'" disabled> <input type="hidden" name="nr" value="'.$nr.'"> </td></tr> <tr><td>Marka</td><td><input name="marka" value="'.$marka.'" maxlen="20" size="20"></td></tr> <tr><td>Model</td><td><input name="model" value="'.$model.'" maxlen="20" size="20"></td></tr> <tr><td>Kolor</td><td><input type="color" name="kolor" value="'.$kolor.'"></td></tr> <tr><td>Rocznik</td><td><input type="number" name="rocznik" value="'.$rocznik.'" min="1990" max="2020"></td></tr> <tr><td>Cena</td><td><input type="number" step="0.01" min="100" max="1000000" name="cena" value="'.$cena.'"></td></tr> <tr><td>Wyposażenie</td><td><input name="wyposazenie" value="'.$wyposazenie.'" maxlen="20" size="20"></td></tr> <tr><td colspan="2"><input type="submit" value="zapisz zmiany"></td></tr> </table> </form> </body> </html> '; $sql->close(); } $baza->close(); ?> |
Zapisywanie wprowadzonych w formularzu zmian do bazy MySQL
update.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php include "polacz.php"; $nr = wczytaj("nr"); $marka = wczytaj("marka"); $model = wczytaj("model"); $kolor = wczytaj("kolor"); $rocznik = wczytaj("rocznik"); $cena = wczytaj("cena"); $wyposazenie = wczytaj("wyposazenie"); $sql = $baza->prepare("UPDATE samochody SET marka=?, model=?, kolor=?, rocznik=?, cena=?, wyposazenie=? WHERE numer_nadwozia=?;"); if ($sql) { $sql->bind_param("sssidsi", $marka, $model, $kolor, $rocznik, $cena, $wyposazenie, $nr); $sql->execute(); $sql->close(); } else die("Błąd SQL: ". $baza->error); $baza->close(); header ("Location: http://ti.fulara.com/~adam/paneladmina/"); ?> |
Krok 4 – Usuwanie rekordów z bazy MySQL
usun.php
1 2 3 4 5 6 7 8 9 10 11 12 | <?php include "polacz.php"; $nr = wczytaj("nr"); //wczytanie z tablicy _GET ze sprawdzeniem czy niepusty if ($sql = $baza->prepare( "DELETE FROM samochody WHERE numer_nadwozia = ?;" )) { $sql->bind_param( "i", $nr); $sql->execute(); $sql->close(); } $baza->close(); header ("Location: http://ti.fulara.com/~adam/paneladmina" ); ?> |
Krok 5 – Zabezpieczenie naszego panelu hasłem
Tworzymy dwa pliki, pierwszy z użytkownikiem i hasłem (zmieniamy katalog na ten do zabezpieczenia i nazwę użytkownika):
1 | htpasswd -c /home/user/public_html/paneladmina/.htpasswd uzytkownik |
Przy dodawaniu kolejnych użytkowników tej strony pomijamy parametr -c
Tworzymy plik .htaccess
1 2 3 4 5 | AuthType Basic AuthName "Podaj haslo do panelu admina" AuthBasicProvider file AuthUserFile /home/user/public_html/paneladmina/.htpasswd Require valid-user |
Krok 6 – Styl do formularzy (przyciski, pola formularza, tabele i kolory)
Do zrobienia we własnym zakresie, jako ćwiczenie
Podsumowanie – Działający przykład
Działający przykład do tabeli „samochody”, użytkownik: admin, hasło admin:
Panel Administracyjny
Przykład wymaga tabeli:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | CREATE TABLE IF NOT EXISTS `samochody` ( `numer_nadwozia` VARCHAR(12) NOT NULL, `model` VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL, `marka` VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL, `rocznik` INT(11) NOT NULL, `cena` INT(11) NOT NULL, `kolor` VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL, `wyposazenie` text CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL, PRIMARY KEY (`numer_nadwozia`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Zrzut danych tabeli `samochody` -- INSERT INTO `samochody` (`numer_nadwozia`, `model`, `marka`, `rocznik`, `cena`, `kolor`, `wyposazenie`) VALUES ('1213765', 'zx7', 'mazda', 2010, 40000, '#ff0000', 'ABS, TURBOTURBINA'), ('12334', 'Seicento', 'Fiat', 1999, 2990, '#808040', 'skóra'), ('12443214', 'e76', 'bmw', 2004, 432435, '#ffffff', 'supertak'), ('194329', 'audi2', 'a61', 2012, 70500, '#ffff00', 'turbospreżarka'), ('1943431', 'a6', 'audi', 2011, 54321, '#004080', 'turbosprezarka'), ('3645645', 'astra', 'opel', 2011, 25000, '#008040', 'ABS,TURBOTURBINA'), ('4457457', 'punto', 'fiat', 2013, 9000, '#800000', 'abs'), ('654326', 'corsa', 'opel', 1996, 43900, '#0080c0', 'kornel'), ('667777', 'xs', 'jaguar', 2020, 6611, '#ff8080', 'Fotele z plastiku'); |