[PHP][MySQL] Jak stworzyć prostą bazę i zarządzać nią przez WWW - dodawać rekordy, edytować dane, kasować/uaktualniać wpisy, sortować wyniki, wyszukiwać?

0x01 graphic

Chcesz stworzyć prosty system do zarządzania rekordami w bazie danych. Ma on tworzyć bazę i tabelę, umożliwić zmianę wpisów, uaktualnianie danych, kasowanie rekordów, a na stronie WWW zwykły użytkownik powinien mieć możliwość przeglądania bazy danych, sortowania wyników, wyszukiwania w bazie.

0x01 graphic

Przykładowa baza z uczniami będzie prosta, ale jej założenia są takie same, jak w profesjonalnych systemach do zarządzania zawartością baz danych przez strony WWW.

Wykorzystując opisany tutaj przykład możesz z powodzeniem tworzyć bardziej rozbudowane struktury, jak np. system newsów, płatności, księgi gości, własny blog, katalogi stron WWW czy spisy oprogramowania lub pracowników.

Stwórzmy bazę danych o nazwie baza1, a w niej tabelę o nazwie uczniowie. Niech zawiera 6 pól - id (identyfikator) typu INT, imie i nazwisko typu znakowego CHAR (po 100 znaków wystarczy) i dataur (data urodzenia) typu DATE.

Zakładamy bazę

Poniższy kod uruchom tylko raz. Założy on bazę danych i stworzy tabelę, gdzie będą przechowywane rekordy określonego typu. Najlepiej umieść go w pliku zaloz.php. Oczywiście nic się nie stanie gdy uruchomisz go kilka razy - i tak zadziała tylko raz, ponieważ wielokrotne zakładanie tych samych pól nie będzie możliwe.

<?

$baza = mysql_connect("localhost", "user", "password");

if ($baza) {

//utworzenie bazy danych

$wynik = mysql_query("CREATE DATABASE baza1",$baza);

if ($wynik) echo "Baza została stworzona";

//utworzenie tableli

$wynik = mysql_select_db("baza1",$baza);

if ($wynik) {

$wynik = mysql_query("CREATE TABLE uczniowie (

id INT NOT NULL PRIMARY KEY,

imie CHAR(100) NOT NULL,

nazwisko CHAR(100) NOT NULL,

dataur DATE NOT NULL

)", $baza);

if ($wynik) echo "Tabela została stworzona";

}

mysql_close($baza);

}

?>

Dodajemy i uaktualniamy rekordy

To najbardziej pracochłonna część skryptu. Pobranie danych jest czynnością złożoną. Trzeba je chociażby wyczyścić ze zbędnych spacji za pomocą funkcji trim(), następnie trzeba wyeliminować ukośniki poprzedzające znaki specjalne, a te znaki zamienić na tzw. encje, czego dokonują funkcje stripslashes() i htmlspecialchars().

Następnie trzeba sprawdzić czy dane są poprawne, co w naszym przykładzie zrealizowałem wykorzystując wyrażenia regularne. Za pomocą eregi() sprawdzam więc czy id zawiera same liczby, czy w imieniu i nazwisku nie ma cyfr, oraz czy data jest w miarę poprawnie wpisana.

Do zarządzania bazą danych stworzyłem trzy formularze. Jeden służy do edytowania i wprowadzania danych, a dwa pozostałe umożliwiają kasowanie lub edycję rekordu o podanum numerze id.

Jeżeli kasujemy rekord, to oprócz skasowania go w bazie danych, warto dla bezpieczeństwa pokazać go w oknie edycji, aby można było go przywrócić gdy okaże się, że jednak nie powinien zostać skasowany. Tego problemu nie ma z poprawianiem rekordu, ponieważ cały czas jest on obecny w bazie.

Na końcu skryptu dodałem jeszcze banalną procedurę pokazywania, które rekordy są już w bazie danych. Będzie to pomocne przy wprowadzaniu rekordów, zanim nabierzesz wprawy w posługowaniu się skryptem lub przy modyfikacji działania programu.

Poniższy kod umieść w pliku admin.php. Aby nikt nie miał do niego dostępu umieść go w katalogu wymagającym podania hasła. Przykłady stosowania haseł znajdziesz w innych poradach.

<?

$nhost="localhost";

$nbaza="baza1";

$nuser="user";

$npassword="password";

$skasuj = trim($_GET["skasuj"]);

$popraw = trim($_GET["popraw"]);

$id = trim($_GET["id"]);

$imie = trim($_GET["imie"]);

$nazwisko = trim($_GET["nazwisko"]);

$data = trim($_GET["data"]);

if ((($skasuj<>"")or($popraw<>""))and($id=="")) {

// ### pobranie rekordu z tabeli oraz kasowanie

if ($popraw<>"") $nr=$popraw; else $nr=$skasuj;

$baza = mysql_connect($nhost, $nuser, $npassword);

if ($baza) {

$wynik = mysql_select_db($nbaza,$baza);

if ($wynik) {

$wynik = mysql_query("SELECT * FROM uczniowie WHERE id=$nr", $baza);

if (($wynik)and(mysql_num_rows($wynik)>0)) {

if ($skasuj<>"") {

mysql_query("DELETE FROM uczniowie WHERE id=$skasuj", $baza);

echo "<b>Rekord skasowany:</b>";

}

$pole=mysql_fetch_array($wynik);

$id = $pole["id"];

$imie = $pole["imie"];

$nazwisko = $pole["nazwisko"];

$data = $pole["dataur"];

}

}

mysql_close($baza);

}

} else if ($id<>"") {

// ### dopisanie lub uaktualnienie tabeli

if (!eregi("^[0-9]+$",$id)) echo "<br><b>błąd w polu ID:</b>";

else if (!eregi("^[^0-9]+$",$imie)) echo "<br><b>błąd w polu imię</b>";

else if (!eregi("^[^0-9]+$",$nazwisko))

echo "<br><b>błąd w polu nazwisko</b>";

else if (!eregi(

"^(19|20)[0-9][0-9]-([0][1-9]|[1][0-2])-([0-2][1-9]|10|20|30|31)$",

$data)) echo "<br><b>błąd w polu data</b>";

else {

$baza = mysql_connect($nhost, $nuser, $npassword);

if ($baza) {

$wynik = mysql_select_db($nbaza,$baza);

if ($wynik) {

if ($popraw=="") {

$wynik = mysql_query("

INSERT INTO uczniowie VALUES($id,'$imie','$nazwisko','$data')

", $baza);

if ($wynik) {

echo "<br><b>Rekord został dodany</b>";

$id=""; $imie=""; $nazwisko=""; $data="";

}

} else {

$wynik = mysql_query("

UPDATE uczniowie SET id=$id, imie='$imie',

nazwisko='$nazwisko', dataur='$data' where id=$popraw

", $baza);

if ($wynik) {

echo "<br><b>Rekord został uaktualniony</b>"; $popraw="";

$id=""; $imie=""; $nazwisko=""; $data="";

}

}

}

mysql_close($baza);

}

}

}

// ### napis na guziku formularza

if ($popraw<>"") $guzik="Uaktualnij";

else if ($skasuj<>"") $guzik="Przywróć";

else { $guzik="Dodaj"; };

// ### formularze

$fimie = htmlspecialchars(stripslashes($imie));

$fnazwisko = htmlspecialchars(stripslashes($nazwisko));

$formularze = <<<KONIEC

<table border=0><tr><td valign=top>

<form action="admin.php" method="get">

<input type="hidden" name="popraw" value="$popraw">

<table><tr>

<td valign=top>ID:</td>

<td><input type="text" name="id" value="$id"></td>

</tr><tr>

<td valign=top>imię:</td>

<td><input type="text" name="imie" value="$fimie"></td>

</tr><tr>

<td valign=top>nazwisko:</td>

<td><input type="text" name="nazwisko" value="$fnazwisko"></td>

</tr><tr>

<td valign=top>dataur (rrrr-mm-dd):</td>

<td><input type="text" name="data" value="$data"></td>

</tr><tr>

<td>&nbsp;</td>

<td><input type="submit" value=" $guzik "></td>

</tr></table>

</form>

</td><td valign=top>

<form action="admin.php" method="get">

<table bgcolor=#ccccff><tr>

<td valign=top>ID:</td>

<td><input type="text" name="popraw"></td>

</tr><tr>

<td>&nbsp;</td>

<td><input type="submit" value=" uaktualnij "></td>

</tr></table>

</form>

<form action="admin.php" method="get">

<table bgcolor=#ffcccc><tr>

<td valign=top>ID:</td>

<td><input type="text" name="skasuj"></td>

</tr><tr>

<td>&nbsp;</td>

<td><input type="submit" value=" skasuj "></td>

</tr></table>

</form>

</td></tr></table>

KONIEC;

echo $formularze;

// ### pomocniczy fragment, wypisuje dane z bazy na ekran

echo "<hr>";

$baza = mysql_connect($nhost, $nuser, $npassword);

mysql_select_db($nbaza,$baza);

$wynik = mysql_query("SELECT * FROM uczniowie",$baza);

mysql_close($baza);

$wierszy = mysql_num_rows($wynik);

$pol = mysql_num_fields($wynik);

echo "<table cellpadding=0 cellspacing=5><tr>

<td><b>id</b></td><td><b>imię</b></td><td><b>nazwisko</b></td>

<td><b>data</b></td></tr>";

for ($i=0;$i<$wierszy;$i++) {

$wiersz = mysql_fetch_row($wynik);

echo "<tr>";

for ($j=0;$j<$pol;$j++) echo "<td>".$wiersz[$j]."</td>";

echo "</tr>";

}

echo "</table>";

?>

Przeglądanie, sortowanie, wyszukiwanie

Ta część będzie dostępna dla każdego użytkownika. Będą oni mogli przeglądać bazę posortowaną według dowolnego pola lub wyszukiwać w niej rekordy spełniające określone kryteria. Wyszukiwanie nie jest specjalnie skomplikowane, a w osobnych poradach możesz o nim poczytać szczegółowo.

Prosty formularz pozwala wpisywać słowa i wybierać kolumnę, która będzie przeszukiwana. Można też ustalić jak będą sortowane wyniki - rosnąco lub malejąco. Umieść skrypt na stronie index.php:

<form action="index.php" method="get">

<input type="text" name="x">

<select name="p">

<option>id</option>

<option value="1">imię</option>

<option value="2">nazwisko</option>

<option value="3">data urodzenia</option>

</select>

<select name="o">

<option>rosnąco</option>

<option value="1">malejąco</option>

</select>

<input type="submit" value=" szukaj ">

</form>

<?

$p=trim($_GET["p"]);

$o=trim($_GET["o"]);

$x=trim($_GET["x"]);

$pole="id";

if ($p=="1") $pole="imie";

if ($p=="2") $pole="nazwisko";

if ($p=="3") $pole="dataur";

$order="asc";

if ($o=="1") $order="desc";

$szukaj="";

if ($x<>"") $szukaj="where $pole LIKE \"%$x%\"";

$baza=mysql_connect("localhost", "user", "password");

mysql_select_db("baza1",$baza);

$wynik=mysql_query(

"SELECT * FROM uczniowie $szukaj order by $pole $order",$baza);

mysql_close($baza);

$wierszy = mysql_num_rows($wynik);

$pol = mysql_num_fields($wynik);

echo "<table cellpadding=0 cellspacing=5><tr>

<td><b>id</b></td><td><b>imię</b></td><td><b>nazwisko</b></td>

<td><b>data</b></td></tr>";

for ($i=0;$i<$wierszy;$i++) {

$wiersz = mysql_fetch_row($wynik);

echo "<tr>";

for ($j=0;$j<$pol;$j++) echo "<td>".$wiersz[$j]."</td>";

echo "</tr>";

}

echo "</table>";

?>

OK. To już w zasadzie wszystko, co jest niezbędne aby można było sprawnie zarządzać bazą zawierającą proste dane o uczniach lub pracownikach. W prosty sposób możesz dodać kolejne pola, zmodyfikować działanie skryptu lub przebudować go według indywidualnych potrzeb.