Autor Zpráva
Fisak
Profil
Zdravím.. Snažím se vytvořit svůj vlastní db layer (vím že je lepší použít již existující, ale já se na něm učím objektové programování) a někde nastala chyba.. nevím zdali jsem správně pochopil OOP proto Vás prosím o pomoc.... Stačí mě třeba navést na to co dělám špatně..

obsah class.db.php:
<
<?php 
class database {

require("config.php");
    
    function database() {

    }

    function db_connect($db_name){

    if(!@mysql_connect($this->db_server,$this->db_login,$this->db_pass)){
    
        return mysql_error();

    } else {

        if(!@mysql_select_db($db_name)){

             return "Nepodařilo se vybrat databázi.";
         
        } else {
    
            mysql_query("SET character_set_results = utf8");
            mysql_query("SET character_set_connection = utf8"); 
            mysql_query("SET NAMES utf8");
        
        } 
     
    }
      
    }
    
    
require("funcion.db.php");

obsah function.db.php:
<
<?php
//připojení k databázy system    
function db_system($retezec)
{
    static $connected_sys = false; 
    if($connected_sys === false) db_connect($this->db_name_system);  
    
    return @mysql_query($retezec); 
}

//pripojení k databázy uživatelu
function db_users($retezec)
{
    static $connected_us = false; 
    if($connected_us === false) db_connect($this->db_name_users);
    
    return @mysql_query($retezec); 
}

//pripojení k databázy obsahu
function db_content($retezec)
{
    static $connected_cont = false; 
    if($connected_cont === false) db_connect($this->db_name_content);
    
    return @mysql_query($retezec); 
}


function db_num($retezec)
{

    return @mysql_num_rows($retezec); 
    
}

function db_array($retezec)
{

    return @mysql_fetch_array($retezec); 

obsah config.php:
<?php
/* zde změň přístupy adresu atd... */
var $db_server = "localhost";
var $db_login = "dblogin";
var $db_pass = "dbheslo";
var $db_name_system = "system";
var $db_name_users = "uzivatele";
var $db_name_content = "obsah";

a zvolání funkce kde chci db layer použít...
<?php
require("class.db.php");
$db = new database;
//a jestli si nemýlím tak bych měl sql dotaz zvolat takto:
$db->db_users("SQL dotaz");
kolemjdoucí
Profil *
Dle mého, je to naprosto nesmyslné řešení. Třeba require mít pod class je nesmysl (dává se nad class když už). To, co je ve function.db.php by mělo být jako metody třídy a nikoli funkce includované do třídy. Zkus raději dibi, které můžeš využívat a prozkoumat jeho útroby.
Mastodont
Profil
class database {
 ...    
    function database() {

Ty se to učíš ještě podle pravidel PHP4, to už je asi 6 (?) let zastaralá záležitost. Najdi si něco o OOP v PHP5.
kolemjdoucí
Profil *
Zkus třeba todle
Fisak
Profil
kolemjdoucí:
Zkus raději dibi
dobře takže ještě jednou. Napsal jsem: "vím že je lepší použít již existující, ale já se na něm učím objektové programování" a ty mi linkneš dibi ? :-) umím si najít jiný db layer ale mě jde o objektové programování :-)
Fisak
Profil
tak zkouším to ale pořád nechápu proč mi fachá -> ale :: ne viz:
<?php

class database {

var $db_server = "localhost";
var $db_login = "insignia";
var $db_pass = "demonos123456";
var $db_name_system = "systeminsignia";
var $db_name_users = "uzivateleinsignia";
var $db_name_content = "obsahinsignia";

    function db_connect($db_name){

    if(!@mysql_connect($this->db_server,$this->db_login,$this->db_pass)){
    
        return mysql_error();

    } else {

        if(!@mysql_select_db($db_name)){

             return "Nepodařilo se vybrat databázi.";
         
        } else {
    
            mysql_query("SET character_set_results = utf8");
            mysql_query("SET character_set_connection = utf8"); 
            mysql_query("SET NAMES utf8");
        
        } 
     
    }
      
    }
    
    
//připojení k databázy system    
function system_query($retezec)
{
    static $connected_sys = false; 
    if($connected_sys === false) $this->db_connect($this->db_name_system);  
    
    return @mysql_query($retezec); 
}

//pripojení k databázy uživatelu
function users_query($retezec)
{
    static $connected_us = false; 
    if($connected_us === false) $this->db_connect($this->db_name_users);
    
    return @mysql_query($retezec); 
}

//pripojení k databázy obsahu
function content_query($retezec)
{
    static $connected_cont = false; 
    if($connected_cont === false) $this->db_connect($this->db_name_content);
    
    return @mysql_query($retezec); 
}


function db_num($retezec)
{

    return @mysql_num_rows($retezec); 
    
}

function db_array($retezec)
{

    return @mysql_fetch_array($retezec); 
    
}

}

$db = new database;

$system_options_sql = database::system_query("SELECT * FROM options where type = 'title'");
$nast_echo=mysql_fetch_array($system_options_sql);
echo $nast_echo[text];



přitom:
$db = new database;
 
$system_options_sql = $db->system_query("SELECT * FROM options where type = 'title'");
$nast_echo=mysql_fetch_array($system_options_sql);
echo $nast_echo[text];
funguje ...
Ugo
Profil
Fisak:
snažíš se přiřadit instanční proměnnou (teda výsledek funkce) ve statickém volání kde $this neexistuje, musíš udržovat připojení ve třídě. I když si nejsem zcela jist jak se zachová static v případě odlišného volání (logicky si myslim že by měl držet odděleně pro každou instanci a pro třídu zrovna tak), tak v momentě kdy fci voláš tak $this prostě neexistuje a basta :)
Fisak
Profil
Ugo:
dobře takže se v class mam vyhnout $this ?? jestli to tedy dobře chápu.. nebo můžeš prosím uvést příklad toho co myslíš ??
Ugo
Profil
Nevím jak to inteligentně vyřešit, je to vlastně snaha o používání 2 instancí naráz. Já to používám u jazyků, vždy ve třídě držím poslední načtený jazyk. Tady doporučuji se podívat na dibi jestli tam bude něco k pochopení. Ale předně na to jestli není špatně celý návrh, že potřebuješ obě volání naráz. Ono i do toho statického kontejneru dibi je třeba předat třídu připojení aby fungoval.

Zastav se nad tím na chvilku a koukni se co to vlastně dělá a popřemejšlej jestli to fakt potřebuješ.
Fisak
Profil
no tak ono to pujde jen jsem to pochopil jak se to dělá způsobem A) tzn. s použití -> a teď bych rád pochopil jak to bude fungovat s použitím ::
kolemjdoucí
Profil *
Musel by jsi to přepsat na statické metody. Podívej se na to v odkaze, co jsem přiložil výše.
Fisak
Profil
kolemjdoucí:
jo děkuji :-) a koukal sem jen nechápu moc které mají být public a které static...
Alphard
Profil
[#10] Fisak
Nemůže to kombinovat, zdá se mi, že ani neznáte základy syntaxe a principy OOP. Měl byste si o tom něco přečíst.
Dibi pro statický přístup myslím používá nějaké self::getConnection(), ale na pozadí je to instanční.

Nedodržuje žádné konvence pro pojmenování, používáte zastaralé konstrukce z PHP 4, výpis chyb bych raději řešil výjimkami (patří to k OOP).
return "Nepodařilo se vybrat databázi.";
Proč tam rovnou není napsáno k jaké databázi? Ať vím, kde hledat problém.
require už kritizoval někdo výše.
return @mysql_fetch_array($retezec);
A když to nebude fungovat, tak budu chybu hledat půl dne? S tím bych něchtěl pracovat ani omylem.

Celkově je to v podstatě nepoužitelné, protože tam nevidím žádnou escapovací funkci. S tím nejde (bezpečně) dynamicky pracovat.

Je mi jasné, že se člověk učí a dělá spoustu chyb, ale zároveň si myslím, že není špatné zkusit chvíli používat něco hotového, zkoumat to a pak se třeba pokusit vytvořit něco podobného, nebo nějak vylepšit původní projekt. Ono je nejdřív potřeba pochopit princip, ne se ho snažit vymyslet, a na to jsou kvalitní hotové věci skvělé. Ne hned vymýšlet kolo a nechat hodnotit čtverec, protože to nutně musí někdo zkritizovat. Ty hotové doporučované projekty ladí a zkouší několik lidí několik let :-)
Fisak
Profil
Alphard:
děkuji :-) chápu že je potřeba to kritizovat ale od toho to dělám abych se to naučil a jak jsem již řekl... nejde jen o db layer ale o OOP abych se ho naučil.. můžu se to naučit i na něčem jiném ale proč? Když už něco chci udělat např. ten db layer tak se na něm rovnou naučím i to OOP ... a zmíněné chyby opravím a hodím sem aktuální kód ... jinak díky moc za rady :-)
AoJ.HgTS
Profil
[#14] Fisak
Souhlasím s Alphard, OOP je o formě, struktuře kódu, ne o jeho obsahu. DB layer patří mezi ty obsahově složitější věci, u nich nejde jen o kladení dotazů, ale o spousty přidružených funkcí. Vem si kód, který již funguje a není OOP a OOP z něho udělej, nejprve si ale musíš nastudovat terminologii a OOP zásady, nestačí, aby kód šel spustit a něco dělal.

Objektové programování není o použití určitých "slov" (Class, static, public), ale o "správné" struktuře kódu. OOP nevzniklo na papíře, ale protože při dlouhodobějším vývoji aplikací byly nějaké potřeby, potřeby kód udržovat funkční a stabilní, OOP je jen jeden z nástrojů jak toho docílit.

http://php.net/manual/en/language.oop5.php
www.root.cz/serialy/php-v-objeti-objektu/
http://ondrej.mirtes.cz/blog/programovani/php-5-oop-cheatsheet-tahak/

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: