Autor Zpráva
TomasJ
Profil
Dobrý den. Udělal jsem si takovou ulehčovací třídu na práci s databází. Využívám pouze jednoduché funkce a tak je pro mě funkčnost dostačující. Jen by mě zajímalo, jestli jsem ji správně navrhnul a zda je tam něco co se dá vytknout (případně proč). Děkuji moc, tady je celá třída.
<?php
class MySQL{
  private $charset,
          $hostname,
          $username,
          $password,
          $database,
          $resource_id,
          $db_selected,
          $fObj_result,
          $query_result;
  
  public function __construct($host="",$user="",$pwd="",$db="",$charset=""){
    if(empty($host)) throw new Exception("MySQL: Hostname required.");
    if(empty($user)) throw new Exception("MySQL: Username required.");
    if(empty($pwd))  throw new Exception("MySQL: Password required.");
    if(empty($db))   throw new Exception("MySQL: Database name required.");
    if(empty($charset)) $charset = "utf8";
    $this->charset      = $charset;
    $this->hostname     = $host;
    $this->username     = $user;
    $this->password     = $pwd;
    $this->database     = $db;
    $this->db_selected  = false;
    $this->resource_id  = false;
    $this->query_result = false;
    $this->fObj_results = false;
  }
  
  public function Connect(){
    if($this->resource_id !== false) return $this->resource_id;
    $this->resource_id = mysql_connect($this->hostname,$this->username,$this->password);
    return $this->resource_id;
  }

  public function SelectDB($db){
    if($this->resource_id === false) throw new Exception("MySQL::SelectDB: Not connected to server.");
    if(empty($db)) $db = $this->database;
    $this->db_selected = mysql_select_db($db, $this->resource_id);
    mysql_set_charset($this->charset);
    return $this->db_selected;
  }
  
  public function Query($query_input){
    if($this->resource_id === false) throw new Exception("MySQL::Query: Not connected to server.");
    if($this->db_selected === false) throw new Exception("MySQL::Query: No database selected.");
    if(empty($query_input)) return false;
    $this->query_result = mysql_query($query_input,$this->resource_id);
    return $this->query_result;
  }
  
  public function FetchObject($result){
    if(empty($result)) $result = $this->query_result;
    if($result === false) return false;
    $temp_array = Array();
    while($fObj = mysql_fetch_object($result)){
      $temp_array[] = $fObj;
    }
    $this->fObj_results = new stdClass;
    foreach($temp_array as $k=>$v) $this->fObj_results->$k = $v;
    return $this->fObj_results;
  }
  
  public function NumRows($result){
    if(empty($result)) $result = $this->query_result;
    if(empty($result)) return false;
    return mysql_num_rows($result);
  }
  
  public function GetFetchedObj(){
    return $this->fObj_results;
  }
  
  public function Close(){
    if($this->resource_id !== false){
      mysql_close($this->resource_id);
      $this->resource_id = false;
      $this->db_selected = false;
      return true;
    }
    else return false;
  }
  
  public function __destruct(){
    if($this->resource_id !== false) mysql_close($this->resource_id);
    unset($this->hostname);
    unset($this->username);
    unset($this->password);
    unset($this->database);
    unset($this->resource_id);
    unset($this->db_selected);
    unset($this->fObj_result);
    unset($this->query_result);
  }
}
?>
Sir Tom
Profil
TomasJ:
Také dobrý den, jestli ta třída funguje tak jak má, tak je určitě v pořádku. ;) Pokud ale chceš vidět jak vypadá třída na práci s db od jiných vývojářů, tak si stáhni např. nějaký CMS a podívej se do zdrojáku.
TomasJ
Profil
Ano funguje jak má, jen jestli tam nejsou nějaké "chyby" - něco co by se dalo udělat efektivněji...
Taps
Profil
TomasJ:
pro inspiraci http://mike.treba.cz/navrh-databazove-tridy-dil-ii-zakladni-metody/
Tori
Profil
TomasJ:
Pro názvy metod je běžnější konvence lowerCamelCasel (UpperCamelCase je spíš pro názvy tříd a NS). Řádky 24-7: výchozí hodnoty nejsou závislé na parametrech konstruktoru, můžete je teda definovat přímo na ř.8-11 (a možná by bylo lepší použít null, když false má u poloviny z nich význam chyby). Výchozí znakovou sada dejte jako výchozí hodnotu parametru.
Nelíbí se mi návratové hodnoty connect() a selectDB() - implikují nutnost externí kontroly návratové hodnoty. A k čemu chcete vracet MysqlConnectionResource?
edit: vyhodila jsem ten kilometr nepříliš kvalitního kódu
Chtěla jsem původně napsat něco o tom, že se mi zdá divné vracet i odkaz na výsledek dotazu (anebo false, pokud dotaz selže - zase nutnost kontrolovat někde mimo třídu). Třída by měla odstiňovat implementaci, mimo ni nikdo nepotřebuje vědět, jestli pracuje s mysql resource nebo čím. Takže buď můžete nechat metody pro provedení dotazu i pro získání dat v jedné třídě a používat pouze $this->queryResult, ale pak bude možné provádět dotazy jen sériově (query1, fetchData1, query2, fetchData2,..). Tj. budu muset data pokaždé vytáhnout do pole, místo abych třeba do šablony předala jen odkaz na výsledek.
Anebo můžete přidat další třídu představující výsledek dotazu (včetně prázdného výsledku) a tím umožníte provádění dotazů paralelně (query1, query2, fetchData2, query3, fetchData1,..). Takže u každého výsledku budete moci ušetřit jeden průchod polem, i když spotřeba paměti se asi vyrovná (data vs. instance)
TomasJ
Profil
Tori:
Pravda, ty návratové hodnoty jsou poněkud zbytečné u metod Connect a SelectDB. Asi je odstraním. Jinak s třídou nikdo jiný pracovat nebude, pouze já. Jen se na tom učím správné navrhování tříd a zkracuji si kód. Díky :)
* Kódování jsem nastavil v (...,$charset="utf8")

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: