příklad ověření jeho existence: - 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 ***/ var $emailAdmina = "krteczek@jaknato.com"; 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 :'reality1'); $this->kodovani = $this->Kodovani($kodovani); $this->pripoj = $this->Pripoj(); } function q($dotaz) { //alias pro dotaz($dotaz); return $this->dotaz($dotaz); } 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 in($zacatek, $array, $konec = '') { /* tato metoda má za úkol ulehčit sestavení INSERT a UPDATE dotazů vstup jsou 3 parametry: $zacatek => "INSERT INTO `tabulka`" "UPDATE `tabulka` SET" $array => jsou to vkládáná data, kdy klíč je název sloupce a hodnota je hodnota kterou vkládáme Příklad: $in = array( 'nazev_clanku' => 'Název článku', 'obsah' => 'nějaký obsah článku', ); $konec => to jsou podminky za jakých má dojít k update dotazu, čili klauzule WHERE atd */ $typ = strtoupper(substr($zacatek, 0, 6)); switch($typ) { case 'INSERT': $vysledek = $this->Insert_($zacatek, $array, $konec); return $vysledek; break; case 'UPDATE': $vysledek = $this->Update_($zacatek, $array, $konec); return $vysledek; break; default: return $this->Error($this->dotaz); } } function Insert_($dotaz, $array, $konec = '') { $a = 0; $sloupce = ''; $hodnoty = ''; foreach($array as $key =>$foo) { if($a === 1) { $sloupce .= ', '; $hodnoty .= ', '; } $sloupce .= '`' . $key . '`'; $hodnoty .= $this->O($foo); $a = 1; } $d = $dotaz . "(" . $sloupce . ') VALUES (' . $hodnoty . ') ' . $konec; return $this->q($d); } function Update_($dotaz, $array, $konec = '') { $a = 0; $d = ''; foreach($array as $key =>$foo) { if($a === 1) { $d .= ', '; } $d .= '`' . $key . '` = ' . $this->O($foo) . ' '; $a = 1; } $d = $dotaz . ' ' . $d . ' ' . $konec; return $this->q($d); } 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) 3 kroky: 1. pripojeni k databazovemu stroji 2. pripojeni k databazi 3. nastaveni kodovestranky pro pripojeni k databazi ***/ if((!$this->pripoj = @mysql_pconnect($this->sqlHost, $this->sqlUser , $this->sqlPass))) { $text = 'Je mi líto, databáze je nedostupná... Nastala chyba připojení k DB: připojovací údaje k databázi jsou špatné'; triger_error($text, E_USER_ERROR); } if(!@mysql_select_db($this->sqlDb)) { $text = 'Je mi líto, databáze je nedostupná... Chyba: neznámá DB'; triger_error($text, E_USER_ERROR); } 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 O($polozka, $numero = false) { //alias k Osetri return $this->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 pokud bude truhý parametr 'true' a jedná se o číslo, ale bude také ošetřeno jako řetězec, vhodné pro telefonní čísla například 16.7.2007: doplněna kontrola na null,true/false a now() */ if((!is_numeric($polozka)) ||($numero === false)) { if(($polozka === NULL) || (strtolower($polozka) == 'null')) { $polozka = 'NULL'; } elseif(strtolower(trim($polozka)) == 'now()') { $polozka = 'now()'; } elseif($polozka === true) { $polozka = true; } elseif($polozka === false) { $polozka = false; } else { $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 Error($dotaz) { $datum = date("Y_m_d"); $file = dirname(__FILE__) . '/log/' . $datum . '_log.db.txt'; $nr = "\n\n"; $od = "/*********************************************************************/"; $script = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . (!empty($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : '' ); $log = $nr . $od . $nr . date("Y m.d H.i.s") . ": " . $nr . $dotaz . $nr . mysql_errno() . $nr . mysql_error(); if(((file_exists($file)) && (filesize($file) < (1073741824 * 4))) || (!file_exists($file))) { file_put_contents($file, $log, FILE_APPEND); } /* toto zatim nejede $dotaz = "INSERT INTO `dbError` (`dotaz`, `cas`, `script`, `chyba`) VALUES (" . $this->O($dotaz) . ", new, " . $this->O($script) . ", " . $this->O(mysql_error()) . ",)"; $v = $this->q($dotaz); //ulozime to do souboru $email = "Došlo k chybě při vykonávání db dotazu: " . $nr . $dotaz . $nr . " na stránce: http://" . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . (!empty($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : '' ) . " Databáze vrátila chybu: " . mysql_error() . "\n\r\n\r"; //$e = db_posli_mail($email); vratime text a ten se použije v error_triger */ return 'Litujeme, došlok chybě při práci s databázi. kontaktujte prosím správce ' . $this->emailAdmina . ''; } } ?>