Autor Zpráva
scooti
Profil *
Zdravim vsetkych,
rozhodol som sa trochu postupit v mojich vedomostiach programovania php a chcem sa naucit co najlepsie a najefektivnejsie vyuzivat funkcie.. zatial proceduralne, ale casom by som chcel prejst na OOP (mozno uz aj teraz zistim ze to bude lepsie v OOP).

ide mi tu hlavne o to aku filozofiu vymysliet na nejake univerzalne pridavanie riadkov do databazy.
uvediem priklad: mam rozne tabulky z databazy a ja chcem vytvorit jednu funkciu, ktora bude obsluhovat pridavanie (INSERT) udajov z roznych formularov do roznych tabuliek. Cize bude jedna funkcia ktora podla dat z formularu sama urci do ktorej tabulky tie udaje ma dat, predtym tie udaje osetri od html, prazdnych medzier apod.. (funkcie na ocistenie vstupu od uzivatela).

mal som taku predstavu, ze sa s formularom bude odosielat aj skryty prvok ktory povie do akej tabulky sa bude zapisovat a potom funkcia sama rozhodne do akych stlpcov je potrebne vkladat. No potom som si uvedomil, ze uz v tej funkcii musim urcovat nejake podmienky a priamo sa odkazovat na konkretne tabulky co teda nie je velmi univerzalne.

Podobnu funkciu som chcel aj na update udajov.

Vopred dakujem za kazdy vas napad akym sa posunut dalej a zacat uvazovat trochu programatorsky
Nox
Profil
A jaká je otázka?

No každopádně - při asociativním poli by se ty sloupce daly získat ... tabulku by bylo asi vhodné zadat explicitně, šlo by to sice tipnout ze sloupců pokud bychom si stáhli schéma, ale nešlo by asi zaručit spolehlivost ve všech případech.

Jinak ještě typ - pokud bys bral ty sloupce, doporučoval bych vytvořit array klíčů, protože položky by mohly být prvky v jiném pořadí (nebo chybějící)

Nevím kam moc s tím budeš směřovat, možná že trochu narážíš na ORM
Ugo
Profil
je to výřez z kompletu takže není celý a bude asi špatně pochopitelný


... příprava dat pro insert
public function getFields() {
        if(is_array($this->fields)) $ret=implode(",",$this->fields);
        else $ret=$this->fields;
        $this->fields="*";
        return $ret;
    }
    public function getInsertValues() {
        $ret="(".implode("),(",$this->values).")";
        $this->values=array();
        return $ret;
    }
    
    public function insert_values($values,$delimeter=",") {
        $tmp=array();
        $keys=array();
        if(!is_array($values)) $values=explode($delimeter,$values);
        if($this->service->table_exists($this->table)) {
            foreach($values as $key=>$val) {
                if(is_array($val)) {
                    $this->insert_values($val,$delimeter);
                } else {
                    if(!is_numeric($key) && $this->fields=="*") {
                        if(!$this->service->field_exists($key,$this->table,$val)) {
                            continue;
                        }
                        $keys[]=$this->wrap($key);
                    }
                    $tmp[]=$this->escape($val);
                }
            }
            if(!empty($keys) &&  $this->fields=="*") {
                $this->fields($keys);
            }
            if(!empty($tmp)) {
                $this->values[]="'".implode("','",$tmp)."'";
            }
        }
    }
    
    

public function insert($values,$delimeter=",") {
        if(!empty($values)) $this->insert_values($values,$delimeter);
        if(empty($this->values)) return false;
        return "INSERT INTO ".$this->table."(".$this->getFields().") VALUES".$this->getInsertValues()."";
    }

funkce (pro mysql v tomhle pripade) ktera otestuje zda existuje sloupec - $this->service->field_exists()

function field_exists($name,$table,$value="") {
        if($this->checkexists==1) {
            if(@mysql_num_rows($this->query("show columns from ".$table." like '".$name."'"))==false) {
                if($this->mode=="design") {
                    if(is_numeric($value)) $type="INT";
                    else $type="TEXT";
                    $this->add_field($name,$table,$type);
                    return true;
                }
                return false;
            }
            return true;
        }
        return true;
    }
Mastodont
Profil
Ugo:
field_exists v případě potřeby přidává nový sloupec do tabulky? Zajímavý návrh! :-)

(a ty názvy sloupců v tabulce je vhodné kešovat)
Ugo
Profil
Mastodont:
design mód dělá tabulky a sloupce dle potřeby no (bohužel ne u sqlite 2 a staré sqlite3)...normal je přeskočí, záměr je dát tomu celý POST a ať si vybere co chce :), mimo normal je tam jeste test který místo provedení příkaz vypíše, s tou kaší to je jistě zajímavý nápad,v době kdy jsem dělal db vrstvu jsem jestě necachoval nic a nechtěl sem to měnit, teď (po pár tejdnech :D ) už je db vrstva stará ... vrstva v nette dospívá tak rychle, že to nemohu a asi ani nechci stíhat :D, ale cachování už používat musím, šablony a autoloader (a router nově místo na % bázi na bodové bázi) to prostě potřebujou, takže děkuji za návrh, hned jak dokončím rozdělané, tak se asi dám do komplexnější cache :D

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: