Databßze a PHP

Zßklady

V dneÜnφm dφle si ukß₧eme jak vklßdat, vybφrat a zpracovßvat data z MySQL databßze pomocφ PHP.

P°ipojenφ k MySQL serveru

Stejn∞ jako v p°φpad∞ konzolovΘ aplikace mysql.exe, tak i v PHP se musφme nejprve p°ipojit k SQL serveru. MySQL podporuje dva druhy p°ipojenφ - normßlnφ a tzv. persistentnφ. Rozdφl je v tom, ₧e po ukonΦenφ Φinnosti skriptu se persistentnφ p°ipojenφ neukonΦφ, ale je po°ßd aktivnφ. M∙₧eme tak mΘn∞ zat∞₧ovat server nov²mi a nov²mi p°ipojenφmi. Obvykle lze toto persistentnφ spojenφ doporuΦit v p°φpad∞ rozsßhl²ch aplikacφ. Nynφ si ukß₧eme jednotlivΘ druhy p°ipojenφ:

MySQL_Connect(<server>, <u₧ivatel>, <heslo>)
Vytvo°φ p°ipojenφ k MySQL serveru, se kter²m m∙₧eme nßsledn∞ pracovat.
Ukßzka: MySQL_Connect("localhost", "john","nereknu")

MySQL_PConnect(<server>, <u₧ivatel>, <heslo>)
Vytvo°φ p°ipojenφ k MySQL serveru, se kter²m m∙₧eme nßsledn∞ pracovat.
Ukßzka: MySQL_PConnect("localhost", "john","nereknu")


Odpojenφ od MySQL serveru

Stejn∞ jako jsme p°ipojenφ vytvo°ili m∞li bychom ho takΘ ukonΦit. V p°φpad∞ klasickΘho p°ipojenφ se odpojenφ od serveru provede po ukonΦenφ Φinnosti skriptu. Persistentnφ spojenφ se neukonΦφ ani p°i pou₧itφ tΘto funkce.

MySQL_Close(<<p°ipojenφ>>)
UkonΦφ p°ipojenφ k MySQL serveru. Jako nepovinn² parametr m∙₧eme dosadit odkaz na jednotlivΘ p°ipojenφ.
Ukßzka: MySQL_Close(), MySQL_Close($Pripojeni)


V²b∞r databßze

Po ·sp∞ÜnΘm p°ipojenφ k MySQL serveru musφme stejn∞ jako v p°φpad∞ konzolovΘ aplikace mysql.exe zvolit databßzi, se kterou budeme pracovat.

MySQL_Select_DB(<databßze>)
Vybere databßzi, se kterou budeme pracovat.
Ukßzka: MySQL_Select_DB("testik")


SQL dotazy

Po ·sp∞ÜnΘm v²b∞ru databßze m∙₧eme ji₧ klßst jednotlivΘ SQL dotazy.

MySQL_Query(<SQL dotaz>)
Provede zvolen² SQL dotaz a vrßtφ odkaz na v²sledek, se kter²m m∙₧eme pracovat.
Ukßzka: MySQL_Query("SELECT * FROM test WHERE id > 1"), MySQL_Query("INSERT INTO test VALUES ('','test')")


Zpracovßnφ ·daj∙

Po provedenφ SQL dotazu pomocφ funkce MySQL_Query zφskßme odkaz (identifikßtor) na v²sledek. Ke zpracovßvßnφ v²sledk∙ m∙₧eme vyu₧φt nßsledujφcφ funkce:

MySQL_Fetch_Array(<identifikßtor>)
Ulo₧φ v²sledek do asociativnφho pole, kdy k jednotliv²m sloupc∙m p°istupujeme podle jejich nßzvu.
Ukßzka: MySQL_Fetch_Array($SQL_Dotaz)

MySQL_Fetch_Row(<identifikßtor>)
Ulo₧φ v²sledek do pole, kdy k jednotliv²m sloupc∙m p°istupujeme podle jejich indexu.
Ukßzka: MySQL_Fetch_Row($SQL_Dotaz)

MySQL_Num_Rows(<identifikßtor>)
Vrßtφ poΦet °ßdk∙ zvolenΘho SQL dotazu.
Ukßzka: MySQL_Fetch_Row($SQL_Dotaz)

PHP podporuje mnohem vφce funkcφ pro zφskßvßnφ a zpracovßvßnφ ·daj∙. Tyto funkce pat°φ mezi ty nejzßkladn∞jÜφ, se kter²mi budeme pracovat.


ChybovΘ hlßÜenφ

V p°φpad∞, ₧e p°i provßd∞nφ SQL dotazu doÜlo k chyb∞, m∙₧eme vyu₧φt n∞kolika funkcφ, kterΘ nßm chybu pomohou odhalit. NejΦast∞ji to b²vß Üpatn² SQL dotaz (syntaxe).

MySQL_Error(<<identifikßtor>>)
Vrßtφ chybov² text z poslednφ databßzovΘ operace.
Ukßzka: MySQL_Error()

MySQL_Errno(<<identifikßtor>>)
Vrßtφ Φφslo chyby z poslednφ databßzovΘ operace.
Ukßzka: MySQL_Errno()

Pro oÜet°enφ m∙₧eme vyu₧φt dvou variant:


$Dotaz = MySQL_Query("SELECT * FROM test");
if (!$Dotaz)
{
	echo "Nastala chyba: ".MySQL_Error();
}

$Dotaz = MySQL_Query("SELECT * FROM test") or Die("Nastala chyba: ".MySQL_Error());

Prvnφ aplikace

Jako prvnφ aplikaci jsem zvolil knihu nßvÜt∞v. Tato aplikace najde svΘ uplatn∞nφ u mnoha zaΦφnajφcφch programßtor∙.

Pro tuto aplikaci si vytvo°φme novou databßzi kniha (nßzev si m∙₧ete zvolit sami, ale nßsledn∞ se musφ upravit i nastavenφ).

create database kniha;
use kniha;

Nynφ si vytvo°φme tabulku se vzkazy, kterß se bude jmenovat vzkazy.

create table vzkazy
(
	id int not null auto_increment, 
	jmeno varchar(50) not null, 
	email varchar(30), 
	www varchar(30), 
	text text not null,
	datum datetime,
	primary key(id)
)

Samotnß aplikace se bude sklßdat ze dvou skript∙. Prvnφm skriptem bude nastaveni.php, kter² slou₧φ k ulo₧enφ ·daj∙ pro p°ipojenφ k SQL serveru.


<?
// ┌daje pro p°ipojenφ k MySQL serveru.
$SQL_Server   = "localhost";
$SQL_Uzivatel = "test";
$SQL_Heslo    = "test";
$Databaze     = "kniha";
?>

Druh²m skriptem bude samotnß aplikace. Uvnit° zdrojovΘho k≤du se nachßzejφ komentß°e, kterΘ vysv∞tlujφ Φinnost skriptu.


<?
// HlaviΦky, kterΘ zabrßnφ uklßdßnφ strßnky do cache.
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");             
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); 
header("Cache-Control: no-cache, must-revalidate");           
header("Pragma: no-cache");

// Vlo₧φme skript, kter² obsahuje nastavenφ p°ipojenφ.
require("nastaveni.php");

// P°ipojφme se k MySQL serveru.
$Pripojeni = MySQL_Connect($SQL_Server, $SQL_Uzivatel, $SQL_Heslo) or Die(MySQL_Error());

// Vybereme naÜi databßzi.
MySQL_Select_Db($Databaze) or Die(MySQL_Error());

// Funkce, kterß nßm p°evede ·daje do bezpeΦnΘ podoby.
function preved($text)
{
	return nl2br(AddSlashes(HTMLEntities($text)));
}

// V p°φpad∞, ze odeÜleme vzkaz.
if ($_GET["odeslat"] == "ano")
{
	// Vzkaz zkontrolujeme a p°evedeme.
	if ($_POST["jmeno"] != "" && $_POST["text"] != "")
	{
		$VzkazJmeno = preved($_POST["jmeno"]);
		$VzkazEmail = preved($_POST["email"]);
		$VzkazWWW   = preved($_POST["www"]);
		$Vzkaz      = preved($_POST["text"]);
		
		// Vzkaz vlo₧φme do databßze.
		MySQL_Query("INSERT INTO vzkazy VALUES ('', '$VzkazJmeno', '$VzkazEmail', '$VzkazWWW', '$Vzkaz', Now())") or Die(MySQL_Error());
	}
	else // V p°φpad∞ chybnΘho vypln∞nφ ·daj∙ zobrazφme chybovΘ hlßÜenφ.
	{
		echo '<p align="center"><font color="#ff0000">Nebyly zadßny vÜechny pot°ebnΘ ·daje !!!</font></p>';
	}
}

// Vybereme vÜechny vzkazy.
// Zde jsme vyu₧ili MySQL funkce "date_format", kterß zformßtuje datum (funkce je podobnß funkci date() v PHP).
$DotazVzkazy = MySQL_Query("SELECT id, jmeno, email, www, text, Date_Format(datum, '%d.%m.%Y %H:%i:%s') as datum  FROM vzkazy ORDER By id DESC") or Die(MySQL_Error());
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
	<title>Kniha nßvÜt∞v</title>
	<meta http-equiv=Content-Type content="text/html; charset=windows-1250">
	<style type="text/css">
	.text{
		font-size: 12;
		font-family: Verdana;
		}
	h2{
		font-size: 20;
		font-family: Verdana;
	}
	</style>
</head>
<body bgcolor="#ffffff">
<h2 align="center">Kniha nßvÜt∞v</h2>
<hr width="400" size="1" color="#000000">
<form action="index.php?odeslat=ano" method="post">
<table align="center" class="text">
	<tr>
		<td><font color="#ff0000">*</font> <b>JmΘno:</b></td>
		<td><input type="text" name="jmeno" value="<? echo $_POST["jmeno"];?>"></td>
	</tr>
	<tr>
		<td><b>E-mail:</b></td>
		<td><input type="text" name="email" value="<? echo $_POST["email"];?>"></td>
	</tr>
	<tr>
		<td><b>WWW:</b></td>
		<td><input type="text" name="www" value="<? echo $_POST["www"];?>"></td>
	</tr>
	<tr>
		<td><font color="#ff0000">*</font> <b>Text zprßvy:</b></td>
		<td><textarea name="text" rows="7" cols="15"><? echo $_POST["text"];?></textarea></td>
	</tr>
	<tr>
		<td colspan="2"><font color="#ff0000">* Pot°ebnΘ ·daje.</font></td>
	</tr>
	<tr>
		<td colspan="2" align="center"><input type="submit" value="Odeslat vzkaz"></td>
	</tr>
</table>
</form>
<hr width="400" size="1" color="#000000">
<table width="400" align="center" class="text">
	<?
	// ZφskanΘ data z databßze zpracujeme (do tabulky).
	While ($Data = MySQL_Fetch_Array($DotazVzkazy))
	{
		echo "<tr>\n";
			echo "<td><b>Autor</b>: " .$Data["jmeno"] ."</td>";
		echo "</tr>\n";
		
		echo "<tr>\n";
			echo "<td><b>Datum</b>: " .$Data["datum"] ."</td>";
		echo "</tr>\n";
		
		echo "<tr>\n";
			echo "<td><b>E-mail</b>: " .$Data["email"] ."</td>";
		echo "</tr>\n";
		
		echo "<tr>\n";
			echo "<td><b>WWW</b>: " .$Data["www"] ."</td>";
		echo "</tr>\n";
		
		echo "<tr>\n";
			echo "<td><b>Text: " .$Data["text"] ."</td>";
		echo "</tr>\n";
		
		echo "<tr>\n";
			echo '<td><hr width="100%" align="center" size="1" color="#000000"></td>';
		echo "</tr>\n";
	}
	?>
</table>
</body>
</html>
<?
// UkonΦφme spojenφ s MySQL serverem.
MySQL_Close($Pripojeni);
?>

VÜechny soubory staΦφ nynφ nakopφrovat do slo₧ky se skripty (c:\www\) a spustit prohlφ₧eΦ se zvolenou adresou (http://localhost/kniha/index.php).

Tento skript slou₧φ jako zßkladnφ kostra aplikace, kterou m∙₧ete vylepÜit. M∙₧ete p°idat oÜet°enφ kontroly formulß°e pomocφ JavaScriptu atd.

Zdrojov² k≤d celΘ aplikace si m∙₧ete stßhnout zde.


Pro tento dφl to bude vÜe. V p°φÜtφm dφle budeme dßle pokraΦovat v poznßvßnφ jazyka PHP.

Petr Rympler