Oop php

0

Czesc ucze sie dopiero oop w php i napotkalem sie na problem. Chcialem sobie zrobic dwie klasy. Jedna to baza danych a druga to akcje na tej bazie. Zrobilem cos takiego:

Class Connection {
	private $host = "localhost";
	private $db_name = "phptutorial";
	private $user = "root";
	private $password = "zaq1@WSX";

  protected function getDatabase(){  
		try
	   {
	      $pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->db_name.'',$this->user, $this->password);
	     

	      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	      
	      
	      echo "Connection OK";
	   }
	   catch(PDOException $e)
	   {
	      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
	   }
	}
}

Class Connection_action extends Connection{

	public function select(){
		$result = $this->getDatabase();

		//$stmt = $pdo->query('SELECT id, nazwa, opis FROM produkty');
		$sql_query = 'SELECT id, nazwa, opis FROM produkty';
		$stmt = $result->query($sql_query);
	      echo '<ul>';

	      foreach($stmt as $row)
	      {
	          echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>';
	         
	      }
	      $stmt->closeCursor();
	      echo '</ul>';
	}	
}

$database1 = new Connection_action;
$database1 ->select();
?>

Ale niestety query() zwraca mi pusty obiekt, mimo ze przypisalem do zmiennej $result cala baze danych. Jak radzic sobie z takim podzialem klas?

0

Nie widzę zeby ta funkcja cokolwiek zwracała. Nie chciałeś zwrócić utworzonego w niej obiektu $pdo?

0

A gdzie w metodzie getDatabase zwracasz obiekt PDO ?

0

Kuurde, dalbym sobie glowe uciac ze w metodzie getDatabase() zrobilem

return $pdo;

Teraz mam takie pytanie ogolne. Jest to dobry sposob, czy lepiej zrobic konstruktor np. i tam wpychac dane do laczenia z baza?

0

Po co klasa odpowiedzialna za połączenie ma jeszcze wyświetlać napis (łamanie SRP)? To co poniżej to jest tylko jedno z możliwych rozwiązań:

config.php

<?php

return array (
    'driver'   => 'mysql',
    'hostname' => 'localhost',
    'database' => 'testdb',
    'username' => 'root',
    'password' => 'root'
)

?>

dbconnection.php:

<?php

class DBConnection
{
    private $_db;

    public function __construct($config)
    {
        $dsn = $config['driver'] . ':host=' . $config['hostname']
            . ';dbname=' . $config['database'];
        $this->_db = new PDO($dsn, $config['username'], $config['password']);
    }

    public function getConnection()
    {
        return $this->_db;
    }
}

?>

dbquery.php:

<?php

class DBQuery
{
    private $_db;

    public function __construct($db)
    {
        $this->_db = $db;
    }

    public function getAll($table)
    {
        $statement = $this->_db->prepare("SELECT * FROM " . $table);
        $statement->execute();

        if ($result = $statement->fetch(PDO::FETCH_OBJ))
        {
            return $result;
        }
        return array();
    }
}
?>

test.php:

<?php

include 'dbconnection.php';
include 'dbquery.php';

$config = include 'config.php';

$data = array();

try
{
    $connection = new DBConnection($config);
    $conn = $connection->getConnection();
    $query = new DBQuery($conn);
    $data = $query->getAll('users');
}
catch (PDOException $e)
{
    echo 'Can not connect to database with error: ' . $e->getMessage();
}

var_dump($data);
?>

Config.php (klucz driver) daje możliwość podpinania się nie tylko pod MySQL ale i PostgreSQL, wtedy się ustawia na 'pgsql', nie połączy się w tej konfiguracji z SQLite.

0

Dzieki za mega przyklad. Widze juz fajne zastosowanie tego, nie bede musial powtarzac ciagle metody select, wystarczy ze w parametrze wezme inna tabelke po prostu. Rozumiem caly kod procz var_dump. Moglbym mi wytlumaczyc na czym to polega?

0

Var_dump jest po to żeby przeanalizować to co otrzymasz (wyświetla dosłownie wszystko, tj. z czego tak naprawdę składa to co będzie w $data), np. takie wyniki:

object(stdClass)#5 (6) {
  ["id"]=>
  string(1) "6"
  ["email"]=>
  string(23) "nazwa@domena"
  ["username"]=>
  string(5) "admin"
  ["password"]=>
  string(64) "bc58e3f8d8d8efb2f6b98ad09fcea64a9af644ac5b96b9ee44247f60a989aef9"
  ["logins"]=>
  string(2) "84"
  ["last_login"]=>
  string(10) "1437242160"
}

To jest przykładowy wynik var-dump, tu masz wszystko o tym co będzie miało przykładowe $data.

Poprawka, ma być tak:

    public function getAll($table)
    {
        $statement = $this->_db->prepare("SELECT * FROM " . $table);
        $statement->execute();

        if ($result = $statement->fetchAll(PDO::FETCH_OBJ))
        {
            return $result;
        }
        return array();
    }

żeby zwracało wszystkie rekordy (fetchAll a nie fetch)

0

Dopiero sie ucze i nie ogarniam jeszcze zbytnio tych nowych metod PDO, znasz moze jakas stronke gdzie moglbym sobie przyswoic taka wiedze? Dzieki za fajne rzeczowe przyklady. Czyli to jest cos na zasadzie console.log?

1 użytkowników online, w tym zalogowanych: 0, gości: 1