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');