Autor Zpráva
qteck
Profil
ahoj,

proč s metodou query uloženou v souboru controller.php mohu v souboru controller.php pracovat jako s objektem? Když ji pak použiji v souboru model.php naprosto stejně, jen ji volám v konstruktoru, tak nastává hláška typu, query není objekt.

http://pastebin.com/TEAT7je8 - controller
<?php
controller.php

/* - toto funguje 
 * 
 *
$aa = "";

$aa->db = new Db;
$nn = $aa->db->connect()->query("SELECT nazev,kusu,popisek,cislo_produktu,cena_bez_dph,img FROM produkt WHERE id = '1'")->assoc();

var_dump($nn);
var_dump($aa->db);
*/


class Db
{          
  public $data;
  public $err = 0;
  public $dbc;
  
  function connect()
          {
    $this->host =  "localhost";
    $this->user =  "root";
    $this->psswd = "";
    $this->db =    "mini-eshop";
    $this->enc =   "utf8";
    
    $this->dbc = @MySql_Connect( $this->host, $this->user, $this->psswd );
    @MySql_Select_DB($this->db);
    @MySql_Query("SET NAMES ".$this->enc);
    
    return $this;
          }
  function query($query)
          {
    if(!($this->data = MySql_Query($query,$this->dbc))) $this->err = 1;
    return $this;
          }
  function assoc()
          {
    if($this->err == 0) return MySql_Fetch_Assoc($this->data); 
                   else return 0;   
          }
}



class Main 
{
  /*
   * První tři parametry prefix (primární cesta ke vkládaným souborům), 
   *                     default_page (název souboru který bude zobrazen v případě negativního výsledku podmínky), 
   *                     $get_name (název globální proměnné get obsahující název vkládané stránky) )
   * 
   * Ostatní nedefinované argumenty jsou chápány jako názvy souborů určených ke vložení čekající na volání z proměnné $_get_name.
   * 
   
   * 
   *   $main->pager("include/",
   *                "hlavni-stranka",
   *                "stranka",
   *                "nakupni-kosik",
   *                "kategorie-produktu",
   *                "detail-produktu"); 
   */
  
  function pager($prefix,$default_page,$get_name)
                {
    
    if(in_array($_GET["{$get_name}"],func_get_args())) include $prefix . $_GET["{$get_name}"] . ".php"; 
                                                  else include $prefix . $default_page .".php";
                }

}
http://pastebin.com/afByYs22 - model
model.php

  class Model 
  {
    public $detail;
    public $miniatura;
    public $img;
    public $dbc;
    
    function __contruct()
    {
        $this->dbc = new Db();
                
        $this->dbc->connect();
    }
    
    function datailProduktu()
    { 
        $id = (is_numeric($_GET["id"])?$_GET["id"]:1);
        
        $this->detail = $this->dbc->query("SELECT nazev,kusu,popisek,cislo_produktu,cena_bez_dph,img FROM produkt WHERE id = '{$id}'")
                                    ->assoc();

         
        return $this;
    }    
    
    function miniaturaProduktu()
    {   
      
        // nastavit kategorie - podle toho třídit podobné produkty
        $db = new Db();
                $db->connect();
        $db->query("SELECT nazev,kusu,popisek,cena_bez_dph,img,id FROM produkt LIMIT 2");
        while($v = $db->assoc())
          {
            $this->miniatura[] = $v;
          }
         
        return $this;
    }

v modelu jsou záměrně zmíněné dvě třídy. v první řetězim, a dochází tam k problému, byť používám pro testování naprosto totožnou syntax v záhlaví controlleru. v druhé je to bez řetězení a tam to šlape.

čím to je?

díky

Moderátor Majkl578: Kód příště nedávej na pastebin, ale přímo sem. Až toto téma bude číst někdo za měsíc, nemohl by se podívat na kód, protože má nastavenou měsíční expiraci. Vložil jsem ho proto dodatečně přímo.
Ondra123
Profil *
OT:
IMHO by jsi takový kód měl úplně smazat a začít od znova po prostudování následujícího:

1. Coding standard. Jestli tam nějaký máš, je hrozný.
2. Význam pojmů, vzory (patterns) objektově orientovaného programování. Jestli ty třídy jsou skutečně modelem a controllerem, tak jsi tyto pojmy přinejmenším prohodil.
3. Zvážit užití knihoven. Pro začátečníka to je lepší, než se trápit s tím, co tam máš ty, zkus http://dibiphp.com/
4. Praktickou stránku vývoje v PHP. `$_GET["{$get_name}"]` se dá zapsat jako `$_GET[$get_name]`. Striktní, typové porovnávání === (místo ==). To co dělá tvoje třída Db umí nativní mysqli a co neumí (kontrola chyb připojení), to by stejně mělo být jinde (spolu s připojením, které by mělo být na začátku skriptu, ne někde v půlce "controlleru", který se u tebe jmenuje "model").

Až všechno tohle projdeš, tak zkus problém řešit znova.

Ale překvapuje mě, že tam máš ošetřenou SQL Injection.

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: