All pastes #608910 Raw Edit

Stuff

public text v1 · immutable
·published 2007-07-08 15:46 UTC
rendered paste body
<?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;
			}
	}  
?>