<?php
class db
{
/***
třída db je databázové rozhraní, momentálně umí jen mysql
Použití:
- můžeme nastavit připojení k databázi pomocí define();, neuděláme-li
to bude použito defultní nastavení z třídy. Je možno toto využít tak,
že nastavení uložíme do samostatného souboru a necháme ho jen na serveru.
potom kontrolujeme jestli soubor existuje a pokud ano je includován.
<?php
//Příklad souboru s konfigurací:
define("SQL_HOST",'adresa.serveru');
define("SQL_USERNAME", 'jmeno.uzivatele');
define("SQL_PASSWORD", 'heslo');
define("SQL_DBNAME", 'nazev_databaze');
?>
příklad ověření jeho existence:
<?php
$cesta = 'db_config.inc.php';
if(file_exists($cesta))
{
include($cesta);
}
?>
- nejprve musíme třídu iniciovat:
$db = &new db();
- můžeme nastavit kódování, znakovou sadu pro spojení s databázi.
Jde to ovšem jen pri inicializaci třídy;
$db = new db('latin2');
- pro ošetření proměnných v dotazech je možno použít metodu Osetri();
pro ošetření je primárně použita funkce 'mysql_real_escape_string()',
pokud není dostupná, je použita funkce mysql_escape_string, pokud
ani ta není dostupná, je použito funkce addslashes();
$db->Osetri('text nebo proměnná kterou chceme ošetřit');
- a samotné vykonání databázového dotazu:
$v = $db->dotaz($dotaz);
nebo:
$v = $db->q($dotaz);
q(); je jen aliasem dotaz();
- Návratové hodnoty podle typu dotazu:
SELECT:
- array() => $v[$poradi_vraceneho_radku][$sloupec]
- true => dotaz je v pořádku ale nic nevrátil
- text => hláška o chybě v db dotaze
INSERT:
- int => číslo je id vloženého záznamu
- 'd' => jedná se o vložení duplicitní hodnoty do sloupce s unique klíčem
- text => hláška o chybě v db dotaze
UPDATE:
- true => dotaz byl vykonán
- 'd' => jedná se o vložení duplicitní hodnoty do sloupce s unique klíčem
- text => hláška o chybě v db dotaze
DELETE:
- true => dotaz byl vykonán
- text => hláška o chybě v db dotaze
***/
public $kodovani;
static $pripoj;
function __construct($kodovani = 'utf8')
{
//nejprve nastavíme připojení k db podle toho jestli jsou nastavené definice
$this->sqlHost = (defined("SQL_HOST") ? SQL_HOST : '127.0.0.1');
$this->sqlUser = (defined("SQL_USERNAME") ? SQL_USERNAME :'root');
$this->sqlPass = (defined("SQL_PASSWORD") ? SQL_PASSWORD :'');
$this->sqlDb = (defined("SQL_DBNAME") ? SQL_DBNAME :'counter1');
$this->kodovani = $this->Kodovani($kodovani);
$this->pripoj = $this->Pripoj();
}
function dotaz($dotaz)
{
/***
Metoda podle prvních 6 znaků vybere funkci, kterou má být zpracován
dotaz, a vrátí jeho návratovou hodnotu
***/
//vytáhneme prvních 6 znaků z dotazu a převedeme na velá písmena
$typ = strtoupper(substr($dotaz, 0, 6));
switch($typ)
{
case 'INSERT': $vysledek = $this->Insert($dotaz); return $vysledek; break;
case 'UPDATE': $vysledek = $this->Update($dotaz); return $vysledek; break;
case 'DELETE': $vysledek = $this->Delete($dotaz); return $vysledek; break;
case 'SELECT': $vysledek = $this->Select($dotaz); return $vysledek; break;
default: return $this->Error($this->dotaz);
}
}
function q($dotaz)
{
//alias pro dotaz($dotaz);
return $this->dotaz($dotaz);
}
function Kodovani($kodovani = 'utf8')
{
//zjistí jaké kodování je třeba použít
$this->kodovani = $kodovani;
return $this->kodovani;
}
function Pripoj()
{
/***
Připojení k databázi.
je použito perzistentní připojení kvůli rychlejšímu
zpracování db dotazů u jednoho běžícího scriptu.
(nemusí se čekat na další připojení k db)
***/
//přihlásíme se k databázovemu stroji
if((!$this->pripoj = @mysql_pconnect($this->sqlHost, $this->sqlUser , $this->sqlPass)))
{
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>chyba</title><p>Je mi líto, databáza je nedostupná... Nastala chyba připojení k DB</p>';
echo '<p>' . $this->sqlHost . '</p><p>' . $this->sqlUser . '</p><p>' . $this->sqlPass . '</p>';
exit;
}
//připojíme se k databázi
if(!@mysql_select_db($this->sqlDb))
{
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>chyba</title><p>Je mi líto, databáza je nedostupná... Chyba: neznámá DB</p>';
echo '<p>' . $this->sqlDb . '</p>';
exit;
}
//nastavíme kódovou stránkupřipojení
//echo "SET NAMES '" . $this->kodovani . "'";
mysql_query("SET NAMES '" . $this->kodovani . "'");
return $this->pripoj;
}
function Insert($dotaz)
{
/**
* funkce pro ukládání dat do databáze
* pokud se dotaz úspěšně vykoná, vrátí id vloženého záznamu
* pokud selže, kontroluje se zda jde o duplicitu, pokud ano vrátí 'd'
***/
if(mysql_query($dotaz, $this->pripoj))
{
return mysql_insert_id();
}
if(mysql_errno() == 1062)
{
return 'd';
}
return $this->Error($dotaz);
}
function Update($dotaz)
{
/**
* funkce pro úpravu/změnu dat v databázi
* pokud se dotaz úspěšně vykoná, vrátí true
* pokud selže, kontroluje se zda jde o duplicitu, pokud ano vrátí 'd'
***/
if(mysql_query($dotaz, $this->pripoj))
{
return true; //($mod == 0 ? true : mysql_affected_rows());
}
if(mysql_errno() == 1062)
{
return 'd';
}
return $this->Error($dotaz);
}
function Delete($dotaz)
{
/***
Funkce pro vykonání smazání požadovaného záznamu z tabulky
***/
if(mysql_query($dotaz, $this->pripoj))
{
return true;
}
return $this->Error($dotaz);
}
function Select($dotaz)
{
/***
* funkce pro vytáhnutí dat z databáze
* vykoná dotaz, a zapíše do pole vrácené záznamy, ty vrátí skriptu
* v podobě pole $nazev[pocet_zaznamu_od_nuly][nazvy_jednotlivych_polozek]
* Pokud není nalezen záznam, vrátí true
***/
if($v = mysql_query( $dotaz, $this->pripoj))
{
$p = mysql_num_rows($v);
if($p > 0)
{
$out = array();
for($i = 1; $i <= $p; $i++)
{
$r = mysql_fetch_assoc($v);
foreach($r as $key => $foo)
{
$r[$key] = $foo;
}
$out[] = $r;
}
mysql_free_result($v);
return $out;
}
return true;
}
return $this->Error($dotaz);
}
function Error($dotaz)
{
$email = "Došlo k chybě při vykonávání db dotazu: \n\n" . $dotaz . "\n\n\n na stránce:\n\r\n\r \n\r\n\r Databáze vrátila chybu: \n\r\n\r" . mysql_error() . "\n\r\n\r";
$log = "\n" . dbCAS . "\n\t" . $dotaz . "\n\t" . mysql_errno() . "\n\t" . mysql_error() . "\n";
$this->ZapisLog($log);
//$e = db_posli_mail($email);
return '<p>Litujeme, došlok chybě při práci s databázi. kontaktujte prosím správce ' . dbEMAIL_ADMINA . '</p>';
}
function O($polozka, $numero = false)
{
//alias k Osetri
return Osetri($polozka, $numero);
}
function Osetri($polozka, $numero = false)
{
/***
metoda slouží k ošetření vstupních řetězců použitých v db dotazech
je ji možné zavolat až po inicializaci
metoda na ošetření používá funkci mysql_real_escape_string,
pokud není dostupná, použije mysql_escape_string, pokud
ani tato není dostupná, použije addslashes.
string umístí do apostrofu
***/
//ověříme jestli jsme již připojeni k db, pokud ne zavoláme metodu, která připojení zařídí
if(empty($this->pripoj))
{
$this->pripoj = $this->Pripoj();
}
//Protože se ošetřují jen textové řetězce, zjistíme, jestli je obsah text, nebo nějaké číslo
if((!is_numeric($polozka)) ||($numero === false))
{
$polozka = "'" . (function_exists('mysql_real_escape_string') ? mysql_real_escape_string($polozka, $this->pripoj) : (function_exists('mysql_escape_string') ? mysql_escape_string($polozka) : addslashes($polozka)) ) . "'";
}
return $polozka;
}
function ZapisLog($log)
{
$c = AKT_PATH . 'chyby/log.db';
$err = 'Doslok chybe pri praci s db i pri cteni/zapisu do log souboru. Zrejme nemate dostatecna prava pro zapis/cteni. Kontaktujte spravce aplikace.';
if(file_exists($c))
{
if($old = @file_get_contents($c))
{
$log = $old . $log;
}
else
{
echo $err;
exit;
}
}
if(file_put_contents($c, $log))
{
return true;
}
echo $err;
exit;
}
}
?>