Witam serdecznie!
Od jakiegoś czasu próbuję opanować OOP w PHP i idzie mi, nie przymierzając, słabo. Mój problem polega na tym, że nie potrafię z jednej klasy odwołać się do metod innej. Nie wiem, czy to nie jest przypadkiem durnota jakaś i mój błąd w próbie myślenia obiektowo... proszę o pomoc w każdym bądź razie.
Mam klasę MySqlEng(). Konstruktor tej klasy tworzy połączenie z bazą danych i zapisuje uchwyt połączenia w prywatnej zmiennej klasy. Dalej mam 4 metody: selectQuery, updateQuery, insertQuery i deleteQuery, które przygotowują w prywatnej zmiennej $query string, który metodzie doQuery() służy do wykonania odpowiedniego zapytania w bazie danych. Dochodzi jeszcze metoda fetchResults(), która pozwala na przewijanie rekordów uzyskanych w odpowiedzi na zapytanie.
Standardowo używam tej klasy tak:
<?php
$sql = new MySqlEng();
$sql -> selectQuery('nazwa, ilosc', 'produkty', 'id > 93');
while($res = $sql->fetchResults())
{
echo $res['nazwa'].' pozostała ilość: '.$res['ilosc'].'<br />'; }
?>
Próbuję teraz złożyć klasę pagesSupport(), której zadaniem będzie: dodawanie stron do bazy danych, ich edycja i zmiana, oraz wyciągnie z bazy danych o odpowiedniej podstronie i wyswietlanie jej na ekranie. Zwykłe użycie wewnątrz metody tej klasy metody $sql->selectQuery() wywołuje błąd...
Jak skorzystać z klasy MySqlEng() wewnątrz klasy pagesSupport()(IMG:
http://forum.php.pl/style_emoticons/default/questionmark.gif)
Podaję też kod klasy MySqlEng():
<?php
//config
//this data should be inserted in another file, which is not available by http://
define('DATABASE_HOST', 'localhost'); define('DATABASE_USER', 'tarcil_gsms'); define('DATABASE_PASS', 'gsms123'); define('DATABASE_NAME', 'tarcil_gsms');
class MySqlEng
{
private $handler;
public $query;
private $results;
private $affected_rows;
private $last_row_id;
private $selected_rows;
public $records = array();
public function __construct()
{
if(@!$sql_handler = mysql_connect(DATABASE_HOST
, DATABASE_USER
, DATABASE_PASS
)) {
throw
new Exception
('Problem z połączeniem do bazy danych.<br />Nr błędu: <b>'.mysql_errno().'</b><br /><b>Komunikat: </b>'.mysql_error()); }
else
{
throw
new Exception
('Problem z wybraniem bazy danych.<br />Nr błędu: <b>'.mysql_errno().'</b><br /><b>Komunikat: </b>'.mysql_error()); else
{
//connection successfull:
$this->handler = $sql_handler;
}
}
}
//next four methods create sql query for doQuery method;
public function selectQuery($fields, $table, $where = "", $order = "", $limit = "")
{
//if is another query saved:
if($this->query) unset($this->query);
//creating query for doQuery() method
$this->query = 'SELECT '.$fields.' FROM '.$table;
if($where)
$this->query .= ' WHERE '.$where;
if($order)
$this->query .= ' ORDER BY '.$order;
if($limit)
$this->query .= ' LIMIT '.$limit;
$this->doQuery();
}
TUTAJ SĄ JESZCZE TRZY METODY DO USTAWIANIA ZMIENNEJ QUERY... (updateQuery, deleteQuery, insertQuery)
//here is private method which will really make operations in db. it gets no arguments - all are written in object properties.
private function doQuery()
{
if(!$this->results = mysql_query($this->query, $this->handler)) {
throw
new Exception
('Problem z wywołaniem zapytania do bazy danych.<br />Nr błędu: <b>'.mysql_errno().'</b><br /><b>Komunikat: </b>'.mysql_error()); }
}
public function fetchResults()
{
if($this->results)
{
{
return $this->records;
}
}
}
public function getAffectedRows()
{
return $this->affected_rows;
}
public function getSelectedRows()
{
return $this->selected_rows;
}
public function getLastRowId()
{
return $this->last_row_id;
}
public function __destruct()
{
}
}
?>