Hi, rozhodol som sa zacat seriu Classes s tou najcastejsie pouzivanou. Nazval som ju CDBMySQL.
Pocul som ze nie je dobre oznacovat klasy s C na zaciatku ale to mi je jedno. Tento kod som nasiel niekde na nete a pouzivam ho uz priblizne rok s urcitymi vylepseniami.
Tu je Kod:
<?php
// file: includes/CDBMySQL.php
/**
* MySQL DB Class
*
* @author <r66ad@web.de>
* @version l.e.1.0.20071107_created_on_6th_November_2006
* @package blackhole_Coding
*/
require_once 'includes/Cvars.php'; //Toto je dobrovolne. Viac dole v texte
class CDBMySQL {
private $connection = NULL;
private $result = NULL;
private $anzahl=null; //Kedze sa pouziva v SRN je to v nemcine. mozte nazvat ako chcete anzahl=pocet,mnozstvo
private $lastID=null;
public function connect($varsHUPN=""){
if(is_array($varsHUPN)){
$this->connection = mysql_connect($varsHUPN[0],$varsHUPN[1],$varsHUPN[2],TRUE);
mysql_select_db($varsHUPN[3], $this->connection);
}
else{
$this->connection = mysql_connect(Cvars::DBHost,Cvars::DBUser,Cvars::DBPass,TRUE);
mysql_select_db(Cvars::DBName, $this->connection);
}
}
public function getLastID(){
return $this->lastID;
}
public function disconnect() {
if (is_resource($this->connection)) {
mysql_close($this->connection);
}
}
public function query($query) {
if (is_resource($this->connection)) {
if (is_resource($this->result)) {
mysql_free_result($this->result);
}
$this->result = @mysql_query($query,$this->connection);
$this->anzahl = mysql_affected_rows($this->connection);
$this->lastID = mysql_insert_id($this->connection);
}
}
public function getAnzahl(){
if(is_numeric($this->anzahl)) return $this->anzahl;
else return 0;
}
public function fetchRow() {
if (is_resource($this->result)) {
$row = mysql_fetch_assoc($this->result);
if (is_array($row)) return $row;
else return FALSE;
}
}
public function fetchObj() {
if (is_resource($this->result)) {
$row = mysql_fetch_object($this->result);
if (is_object($row)) {
return $row;
} else {
return FALSE;
}
}
}
public function __construct($varsHUPN="") {
$this->connect($varsHUPN);
}
public function __destruct() {
$this->disconnect();
}
public static function getIP(){
if (getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
else $ip = "UNKNOWN";
return $ip;
}
}
?>
<?php
// file: includes/Cvars.php
/**
* Cvars Class
*
* @author <r66ad@web.de>
* @version l.e.1.0.20071110_created_on_6th_September_2006
* @package some
*/
error_reporting(E_ALL);
class Cvars {
/*
register_globals deaktiviert
*/
const adminUserID=1;
//MySQL DB Vars
const DBHost="localhost";//alebo ina ip servera kde je mysql.
const DBUser="nejaky_user";
const DBPass="nejake_zlozite_heslo";
const DBName="nazov_databanky";
//MySQL DB Vars
?>
Tu je popis Funkcii:
Cvars
je class na ukladanie konstantnych a premennych
error_reporting odporucam pri programovani zapnut a na ostro potom vypnut
adminUserID som zaviedol len posledne tak neviem ci to nie je riziko. Je to id admina. ostatne by malo byt jasne.
CDBMySQL:
connect: spoji s mysql. $varsHUPN moze ostat prazdne a väcsinou tuto funkciu aj tak nepotrebujete lebo sa spusta v kostruktore a bere si premenne z Cvars.
getLastID je posledne id ktore bolo vlozene pri SQL prikaze "INSERT"
disconnect: sa pusta pri destruktore. v podstate nepotrebne lebo php to robi automaticky.
query: najpouzivanejsia funkcia ;) sem vlozite nejaku SQL napr. $db->query("select * from xy where 1");
getAnzahl: zase moje priblble nemecke nazvy. jednoducho pocet affected_rows pri INSERT, UPDATE, REPLACE alebo DELETE (kukni php.net/mysql_affected_rows)
fetchRow a fetchObj podla toho kto to ma ako rad. bud volate $row=$db->fetchObj(); alebo $row=$db->fetchRow(); $row->userid; alebo $row["userid"];
a este getIP ktoru mam tusim od tialto alebo php.net. neviem presne ;) dal som ju do db lebo najcastejsie sa ip uklada v db. :(
Priklad:
<?php
//file: test.php
include_once 'includes/CDBMySQL.php';
include_once 'includes/Cvars.php';
$db=new CDBMySQL();
$db->query("insert test_tbl set xy='test'");
echo "Last inserted ID: ".$db->getLastID();
$db->query("select * from test");
while($row=$db->fetchObj())
echo $row->xy;
?>
Tolko na zaciatok. Podla toho aka bude odozva sem hodim nabuduce moju Template Class. Tak sa snazte. Budem sa tesit kazdej kritike a vylepseniu. PS: Sorry za gramatiku. uz ca. 8 rokov nezijem na slovensku ;)
Vyslo mi z toho, ze autorom tej classy si ty. V takom pripade mam pre teba niekolko zlych sprav ;) Tato classa je na hranici totalnej neuzitocnosti az nepouzitelnosti, dokonca by som povedal, ze ked to clovek zacne pouzivat a nevie o tom nic, je to vacsia zloba, ako ked to clovek nepouziva a tiez o tom prd vie. Jediny uzitocny bod vidim v tomto velkom nafuknutom humuse v tom, ze to uvolni predosly SQL result pred vyrobenim noveho, co moze potencialne viest k zabraneniu memleakov pri dlho beziacich aplikaciach. Pre bezne PHP skripty to vsak vyznam nema.
Pozri sa na tento kod a povedz mi, kolko uzitocnych riadkov v nom je? Ja tvrdim, ze uzitocne riadky su tam tak maximalne 3 a to tie, ktore uvolnuju predosly vysledok. Zvysny kod robi co? NIC Obaluje funcionalne MySQL API do jedneho skaredeho nepotrebneho objektu.
Z praktickeho hladiska mi tento objekt neprinesie nic nove, co mi neposkytuje uz teraz MySQL API (ano, automaticky mi to vyberie last insert ID a num rows, ale to mi je tiez prd platne, lebo tie si potom musim vytiahnut z premennych objektu, cize sa vyznam straca).
A dostavame sa k tomu, preco mi pohlad na tuto classu hned zdvihol adrenalin. Budem picovat, ale mozes si za to sam ;) Na kiju rit riesis taketo jebnute bezucelne classy a nasledne neriesis take veci, ako su SQL injection? Cely tento tvoj hnusny shit sa dal pohodlne nahradit troma funkciami, ktore dokonca budu riesit aj SQL injection a nebude treba ziadnych hnusnych zbytocnych objektov.
Ak si taky pojem, ako SQL injection, alebo funkciu mysql_real_escape_string este nevidel, odporucam porozmyslat nad zmenou jobu trebars na kopaca jam pre vedenie optiky. V opacnom pripade mi nie je celkom jasne, preco riesis v objekte take marginalne sracky a riesenie problemu hlavneho si nechavas na bok.
Videl som MySQL sexi class, pri ktorych radoby programatori dostavali orgazmy uz niekolko, ale tato je z nich jednoznacne najvacsi shit.
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.
korenspondoval som s myslienkou nadavat alebo poucovat.
dakujem ti ventYl ze si druhu moznost vyuzil za mna, takze sa uchylim k tej prvej
classa je nepouzitelna, alebo inak. nikdy v zivote by som ju nepouzil, lebo by mi prislo zle, teda nie ani tak mne ako php
co tak nieco normalne, ked uz chces pouzivat nieco zgrcane ale aspon pekne funkcne tak pouzi to co pouzivaju bb style systemy
------------------------------
http://blog.synopsi.com
hm, zaujimave comenty. asi sem pejstnem moju session class nech sa rovno mozem ist obesit :D
Chyba mi ale nejaky konkretny kod. Opravte ma, ak sa mylim, ale to je zmysel clankov na bh, aby sa aj ini (teda hlavne ja) niecomu priucili.
SQL Injection spracujem priamo v kode lebo nie vzdy je potrebna ale skusim to opravit a hodim sem moj navrh.
IMHO sa ma ucit z citania clankov a nie ich pisania.
btw, mas pravdu, ze sql injection nieje potrebna ;-)
odporucil by som ti pozriet PDO, ked uz chces robit s databazou cez objekty. (pravda, nieje tam getIp :-)
jo, a pls oddel uvod do clanku este pred zaciatkom kodu, lebo to dosahalo uvodnu stranku...
==
Ako mam podat objektivny nazor, ked sa ma pytaju na moj subjektivny?
jo, a pls oddel uvod do clanku este pred zaciatkom kodu, lebo to dosahalo uvodnu stranku...
thx.
(Chyba mi tu thanks button)
niesi na lamky.net ;)
--
TxX cms
Ked spravne vrstvis kod, tak by si si mal uvedomit, ze v case pisania rutin medzi DB layerom a prezentacnym layerom jaksi nevies, resp. mozes len tusit, ci to bude, alebo nebude treba osetrit, nakolko nikdy nevies, ktory kus dat sa dostane do styku s uzivatelom a bude mozne ho zmenit tak, ze sa vytvori SQL injection. Okrem toho, zriesit si takuto sexi classu na MySQL a potom pouzivat zapis
$db->query("SELECT * FROM tabulka WHERE stlpec = "'.mysql_real_escape_string($data).'");
mi uz prijde ako krajne posahane, nie len neuzitocne ;)
Obecne neviem, preco maju vsetci sklon riesit vsetky prudko neobjektove zalezitosti nabobtnanymi SUPERCLASSAMI. Kde toto potrebuje, alebo nebodaj dokonca aj pouziva zapuzdrenost (nemas tam jediny private atribut, alebo metodu), polymorfizmus (na ten mozes v PHP rovno zabudnut), alebo nebodaj este serializovatelnost (konkretne napriklad MySQL connection handlery a resource su jednou z veci, ktore nejde serializovat)? Nikde. Dokonca ani samotna databaza nie je reprezentovatelna objektom. Z mojho pohladu neexistuje ani jeden zo styroch zakladnych dovodov k pouzitiu objektov.
U sessions existuje aspon potreba serializovatelnosti, ale to tiez nie je nic, co by neslo elegantne a s minimom kodu poriesit API postavenym na funkciach.
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.
akoze na mna vravia ze robim bordel v PHP lenze toto je jedna classa a je to kurva velky bordel :D ako nic v zlom ale stoho sa ani vyjst neda :)
--
TxX cms
ty mas prasacku upravu, ale toto je neuzitocny a logicky bordel
propel
symfony is sex
dik za comment, to ma naviedlo na symfony....
Ako sorry ale to je hrozny bordel ta trieda, celkom sa mi paci odvovodnenie preco je funkcia `getIp` v db triede ;),
IMHO si myslim, ze je vhodnejsie siahnut po niecom mocnejsom. DGX napisal vyborny DB layer dibi, pozrite sa na to.
----------------------
Ja len v dobrom.
Ja pouzivam db classu z phpBB, ta je tiez fajn.
----------
tommyhot@hackingmachine:~$ microsoft &> /dev/null
Ja teraz neviem co sa mi viac paci. Ci tento dibi, alebo ZF sposob (vid treti diel a pracu s modelom
Album
). V ZF je ta praca s udajmi na vysokej abstraktnej urovni.----------------------
Ja len v dobrom.
doplnim priamy odkaz - dibiphp.com
ty dibi
to ked si dgx prdne tak sa vsetci poskladate ci co.
ja davida uznavam v ramci moznosti, je sikovny a inteligentny ale jeho kody nie su vzdy to najlepsie co mozete dostat a to ci uz pri texy alebo dibi. je to rovnaka zmeska salatu ako hocico ine.
php uz ako jazyk je riadny bordel, na javu ci python sa to nechyta, uz len ten namespaces co tam teraz pridali no grcal som http://us2.php.net/namespaces
kazdopadne je jedno aku triedu ci kod pouzivate, na to vam prdim
co je dolezite a co musite pochopit ze ziadne data! ani tie od vas nie su bezpecne a preto potrebujete filter layer. potrebujete vytvorit layer ktory vezme ktorekolvek data (formulare, input z kodu, etc) a prefiltruje ich. momentalne najbeznejsie sql injection alebo lepsie to vidno na js (xss) kde sa pouzivaju metody konvertovania stringov do inych kodovani (utf7 etc) alebo sa jednoducho pouzivaju kodovania do ludsky necitatelnych kodovani http://www.thespanner.co.uk/2007/12/12/javascript-for-hackers-part-2/
dolezite je mat na pamati ze aj vy ste vlastny nepriatel a nie supportovat utocnikov kadejakymi debilnymi vychytavkami ako mysql_real_like_fucking_real_trust_me_escape co aj tak nikdy nefunguje.
------------------------------
http://blog.synopsi.com
hm mas pravdu, uz pred rokom som sa babral s python (a haskell) ale v praci som nuteny robit s php. preto som pri tom ostal. ked si to ale zhrniem: python: od zaciatku oop + zriedkave bugs, haskell: typovy model, tak si asi dam predsavzatie do noveho roka ;)
kvoli tomu som z roboty odisiel (teda klamem, nie kvoli tomu ale aspon sa mam na co vyhovorit)
php k smrti neznasam! neuveritelne %#&()%( jazyk, odborna komunita mu uteka k jave, .net alebo pythonu. bohuzial, mal som ho rad este v starsich verziach, vyzeral nadejne, no po prvych pokusok o OOP v 4rke bolo jasne, kam to smeruje. Ak ste citali nove "features" v sestke, tak asi viete o com hovorim, bolo mi hodne do placu
co sa tyka pythonu, ma najlepsi framework aky som kedy videl, diango
------------------------------
http://blog.synopsi.com