Autor Zpráva
JirkaProgramator
Profil *
Ahoj začal jsem se učit OOP a tak si chci udělat takový jednoduchý web kde budou výpisy a zápisy do databáze. Na internetu jsem našel jeden skript a podle něho jsem postupoval, bohužel nebyl dostatečně dobře vysvětlen, takže mi to nefunguje a hlavně konec skriptu nechápu.
class DatabaseConnection
{
     private $server;
     private $user;
     private $password;
     private $db;
     private $connection;
     function DatabaseConnection($server,$user,$password,$db)    
     {
     /*Konstruktor*/
      $this->server = $server;
      $this->user = $user;
      $this->password = $password;
      $this->db = $db;
     }
     public function Spojeni()
     {
        @$this->connection = mysql_connect($this->server,$this->user,$this->password)or die('Spojení se nezdařilo');
        @mysql_select_db($this->db,$this->connection) or die('Databáze neexistuje');
     }
    public function Dotaz($dotaz)
    {
      if(!$this->connection){
        $this->Spojeni();
      }
    return new VypisZDatabase($this->connection,$dotaz);
   }
}
  
  
abstract class VraceniDotazu
{
    abstract public function Vlozeni();
    abstract public function VratPole();
    public function Pole()
    {
      $pole = array();
      while($Radek = $this->VratPole())
      {
        $pole[] = $radek;
      }
      return $pole;
    }
}
  
class VypisZDatabase extends VraceniDotazu
{
    private $connection;
    private $query;
    private $arguments;
    private $result;
    
    public function VypisZDatabase($spojeni,$dotaz)
    {
      $this->connection = $spojeni;
      $this->query = $dotaz;
    }
    
    public function Vlozeni()
    {
      $arguments = func_get_args();
      foreach($arguments as $index => $value)
      {
        $this->arguments[$index+1] = $value;
      }
      $sum_arguments = count($arguments);
      $query = $this->query;
      foreach($this->arguments as $index=>$value)
      {
        $query = str_replace(":$index","'".mysql_escape_string($value)."'",$query);
      }
      $this->result = mysql_query($query);
      if(!$this->result){
        return false;
      }
      return $this;
    }
    public function VratPole()
    {
      return mysql_fetch_array($this->result);
    }
}
  $dotaz = "SELECT * FROM map WHERE IDm= :1";
  $database = new DatabaseConnection("localhost","root","","pokus");
  $jm = "jmeno".rand(1,10)."jmeno"; 
  $pokus = $database->Dotaz($dotaz)->Vlozeni($jm)->Pole();
  $d = $database->Dotaz($dotaz)->Vlozeni($jm)->Pole();
 
echo '<table>';
  for($i = 0; $i < count($d);$i++){
    echo '<tr><td>'.$d[$i][id].'</td>
          <td>'.$d[$i][jmeno].'</td>
          <td>'.$d[$i][prijmeni].'</td></tr>';
  }
echo '</table>';
$d = $database->dotaz($dotaz)->Vlozeni('Nějaké jméno')->Pole();
Hlavně moc nechápu co dělá třída VypisZDatabase. Jinak ten konec jsem taky moc nepochopil, ten jsem zkopíroval z toho webu a patrně mi ani nijak nepomůže.
Chci se tedy zeptat, jak budu pomocí těch tříd vypisovat/zapisovat do databáze. jde mi o to co budu volat, jestli musím volat i DatabaseConnection a nebo už rovnou VypisZDatabase.
Děkuji moc za radu.
Alphard
Profil
Poslední dobu se nám tady nějak množí nehezké OOP kódy. Jestli jste to jen někde našel a nemáte k tomu vztah, tak to zahoďte a doporučuji vaší pozornosti dibi.
JirkaProgramator
Profil *
Jo dibi znám, ale tak chci se naučit OOP takže si něco podobnýho zkouším sám. Co je na tom nehezkého? Rád bych znal svoje chyby
nemeja
Profil
Spoustu lidí mi říkalo, že na naučení OOP je nejlepší Java, tak jsem si to všechno včera stáhnul a je to pravda. Učím se podle 2. návodu na programujte.com. Moc se mi ten tutorial líbí, vysvětluje to od začátku (instalace, práce s IDE,...). Doporučuji
markiz de sade
Profil *
neni na tom nic nehezkeho je to normalny OO kód dokonca je aj immutable. z javy sa OO neuc to neni objektovy jazyk, iba pseudoobjektovy. je to jazyk ktory ti znechuti programovanie, radsej skus Ruby, alebo JS.


A na DB su uz hotove frameworky (NHibernate, Entity Framework, Doctrine), ktore ti namapuju relacne data na objekty hovori sa tomu ORM, takze nemusis znovu objavovat ameriku.
Joker
Profil
nemeja:
Spíš jsem slyšel, že na naučení OOP je nejlepší Smalltalk (je „víc objektově orientovaný“ než třeba Java, nemluvě o C++ nebo dokonce PHP).

markiz de sade:
neni na tom nic nehezkeho
S tím bych nesouhlasil, minimálně třeba funkce pro připojení k DB při neúspěchu ukončí skript a vypíše svou vlastní chybovou hlášku, přičemž potlačuje ty systémové.
Sice tu úvahu celkem chápu, ale je to ošklivé a kdybych chtěl programovat „čistě“ a chybové hlášky si zapisovat do logu, není taková třída použitelná- protože nejenže vypíše chybovou hlášku na stránku návštěvníkovi, ale ještě navíc zabrání jejímu zapsání do logu.
JirkaProgramator
Profil *
Tak já programuju v C# to je objektové a chtěl jsem začít objektově i php. Vím, že si můžu na tohle z netu něco stáhnout, ale to nechci. učím se programovat, ne stahovat hotový věci a udělat jim akorát html ksicht a mít hotovo.
Takže bych chtěl od vás poradit jak budu pomocí těchto tříd dělat zápisy/výpisy do databáze. Tomu kodu tak nějak rozumím, až na třídu VypisZDatabase. Takže bych byl rád, kdybyste mi někdo poradil co mám volat při zápisu a co při výpisu z databáze, jestli musím i tu třídu DatabaseConnection apodobně.
Dík
JirkaProgramator
Profil *
Hm tak mi asi nikdo nepomůže...tady se z toho pomalu stává server pro propagaci dibi a dalších podobných skriptů. Protože at jsem četl jakékoliv téma s touto problematikou, všude se doporučí jenom dibi, ale pomoc nebo rada žádná...
Alphard
Profil
JirkaProgramator:
Doporučuji to, protože je to české (česká podpora) a vysoce kvalitní.

Já nevím, co chcete poradit, váš kód nezachrání úprava pár řádků, muselo by se to kompletně přepsat. Tak se na to dibi podívejte, naučte se s ním pracovat, zjistěte, jaký má user interface a budete to vidět úplně jinak. Nejste první, kdo se takhle ptá. Copak použitím dibi se nic nenaučíte?

Říkáte, že programuje V C#, ale asi neznáte výjimky a ošetřování chyb. Samotný návrh tříd na mě také nepůsobí nějak oslnivě a pak:
Hlavně moc nechápu co dělá třída VypisZDatabase.
Tak snad je to váš kód, ne? Nebo jste někde našel něco zbastleného a my to máme opravovat? Všichni vám říkají, že to máte zahodit, když nechcete, tak si to upravujte. To, že má třída VypisZDatabase metodu Vlozeni(), ani nekomentuji.
Marek88
Profil
JirkaProgramator:
Vím, že si můžu na tohle z netu něco stáhnout, ale to nechci. učím se programovat, ne stahovat hotový věci a udělat jim akorát html ksicht a mít hotovo.
Tak to doufám, že jste si naprogramoval i vlastní databázi a nestáhl jste si hotové MySQL. ;)

Chápu ten postoj, kdy si chce člověk udělat všechno sám, ale je pravdou, že když použijete PHP a Apache server, tak už všechno sám neděláte. Jde jen o to, kde je ta hranice. Myslím si, že posunout tu hranici k dibi nebo nějakému frameworku není nic špatného.
Bertram
Profil
JirkaProgramator:
Ahoj, pro učení OO programování bych začal něčím jednoduším než je vlastní knihovna obsluhující práci z databází.
Tori
Profil
JirkaProgramator:
Třída VypisZDatabaze je nešikovně pojmenovaná vzhledem k tomu, jakou funkčnost obsahuje. Navíc míchá dohromady skládání SQL dotazu a čtení dat z DB, což bych dala do dvou různých tříd. Metoda Vlozeni zbytečně dvakrát prochází pole argumentů, když by šlo použít jen jeden cyklus, anebo jeden preg_replace_callback (nevím, co by bylo efektivnější) a dělá i jiné zbytečné věci (ř.66,67). Jednou vrací false, jindy objekt, místo aby vždy vracela objekt a v případě chyby v dotazu vyhodila výjimku. Umí escapovat pouze řetězce. Celý kód navenek chce mluvit česky, ale uvnitř jsou názvy proměnných anglicky a ne vždy výstižně, což je matoucí.

Zkuste si napsat třeba, co já vím, logování do souboru. Aby šlo nastavit, že po dosažení zadané velikosti se soubor přejmenuje na "archiv_2012-02-26.log" a dál se zapisuje zase do prázdného souboru, aby to fungovalo při paralelním přístupu, aby byla nastavitelná úroveň hlášek, které se budou zapisovat (jako nastavení LogLevel v konfiguraci Apache). Když se rozhodnu pro logování do databáze, abych to nemusela kompletně přepsat, ale jen změnila nastavení úložiště (tady využijete rozhraní), ... apod.
TomasJ
Profil
JirkaProgramator:
Já se začal OOP učit z interval.cz, a je to tam celkem slušně vysvětlené.
Joker
Profil
JirkaProgramator:
tady se z toho pomalu stává server pro propagaci dibi a dalších podobných skriptů
Kdysi jsem slyšel jednu chytrou myšlenku: „Když budete mít za úkol udělat něco o čem si nejste jistí jak to má správně být, asi nejlepší začátek je zjistit, jak to udělal někdo před vámi.“
TomasJ
Profil
Joker:
Ale: Použij ... a koukni se na ... jsou rozdílné věci. A pokud to "..." není dobře popsané, prd se z toho dozvíš.

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: