Autor Zpráva
radeson
Profil
ahoj,
potřeboval bych poradit, jak se dělá, že když mám v nějaké metodě dotaz na databázi, aby se z výsledeku vytvořily parametry objektu. Něco jako fetch_object() ale abych mohl vytvořit instanci objektu a volat jeho parametry, které by byli záznamem z db. Malý příklad:
<?php

class Objekt{
  function __construct(){
    # nejaky ten mysqli->query() 
  }
}
$obj = new Objekt();
echo $obj->nazev_z_db; # toto by byl parametr ktery by se priradil z mysql

jak to udelat?
radeson
Profil
už mě něco napadlo, využil jsem metody __get. Napsal jsem tohle:

<?php

class Objekt{
	
	const HOST = "localhost";
	const USER = "user";
	const PASS = "pass";
	const DB = "galerie";
	
	function __construct(){
		$this->mysqli = new mysqli(self::HOST, self::USER, self::PASS, self::DB);
	}
	
	function ziskatData(){
		$this->dotaz = $this->mysqli->query("SELECT nazev FROM gal_sekce");
	}
	function spocitatRadky(){
		$pocet = $this->dotaz->num_rows;
		
		return $pocet;
	}
	
	function __get($parametr){
		$zaznam = $this->dotaz->fetch_array();
			
		return $zaznam[$parametr];
	}
}

$obj = new Objekt();
$obj->ziskatData();
$pocet_radku = $obj->spocitatRadky();


for ($i = 1; $i <= $pocet_radku; ++$i){
	print $obj->nazev."<br />\n";
}

?>


co myslíte? je to dobrý? je vhodné to použít v aplikacích?
bukaj
Profil
radeson
Je to lepší než volat fce pro práci s databází rovnou, ale, že by zrovna tohle řešení bylo nějaké "extrovní" (spíše reálně použitelné), to ne. Pokud se zajímáš o tahání dat z databáze, doporučuji podívat se, jak to mají řešené jinde, např. v každém větším, ne doma na koleni dělaném, frameworku (Zend, CakePHP...), databázovém layeru (dibi) a samozřejmě taky navštívit dokumentaci PDO.

Dále hledej návrhové vzory jako Driver (k odstítnění implementace jednotlivých databází), Domain-object (a s ním spojený termín ORM (Object Relation Maping)) a ActiveRecord (v podstatě spojení přechozích do jednoho celku; svými ActiveRecord fičurami je proslaven framework Ruby on Rails).
Mastodont
Profil
radeson
Objektových vrstev pro práci s databází je spousta a většinou jde o modifikaci Active Record nebo (Table, Row) Gateway. Čím víc toho o nich vím, tím jsem skeptičtější ...

bukaj
návrhové vzory jako Driver (k odstítnění implementace jednotlivých databází)
Jejda, on už je kód
if ($config['dbtype'] == 'Postgre')
   include '.../model_postgre.php';
elseif ...

návrhovým vzorem? :-)))
bukaj
Profil
Mastodont
Jejda, on už je kód ... návrhovým vzorem? :-)))
Jak se říká ve většině úvodů k návrhovým vzorům, U některých návrhových vzorů dojdeme k tomu, že je používáme, aniž bychom řešení návrhovým vzorem nazývali ;) Aneb je jednodušší říct, na to bys mohl použít tenhle návrhový vzor, než vysvětlovat tohle udělej takhle, tohle takhle, tamto zase takhle.

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: