Wykonywanie zapytań PDO w obiektowym PHP

0

Cześć,
próbuję wykonać zapytanie do bazy danych przy użyciu PDO i OOP w PHP. Nie korzystam na razie z żadnego wzorca tylko próbuje zrozumieć programowanie obiektowe. Do tej pory pisałem strukturalnie.
Z bazą danych łączę się elegancko. Gorzej już z wykonywaniem zapytań. Może pokażę całość kodu:

<?php

//--raportowanie błędów
	error_reporting(E_ALL);
	ini_set('display_errors', 1);
//--połączenie z bazą danych MySQL przy użyciu PDO
	//***********************************************
	
	class _constructor{
		public function polacz(){
			try{
				$db = new PDO('mysql:host=localhost;dbname=test', 'root', '',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
				echo 'Połączenie nawiązane!';	
			}catch(PDOException $e){
				echo 'Połączenie nie mogło zostać utworzone.';
			}
		}
	
	}
	//***********************************************
//--wywołanie klas połączenia z bazą danych
	$connect = new _constructor;
	$connect->polacz();

	//***********************************************
//--pierwsze zapytanie testowe
	class zapytanie{
		public function pytaj(){
			
			$query = $db->exec('INSERT INTO `test` SET `cos`=342');
			}
		}
	$connect2 = new zapytanie;
	$connect2->pytaj();

?>

Zapytanie najprostsze z możliwych i niebezpieczne. Chcę w ogóle coś w bazie zapisać, bez filtracji danych na razie.
To wywołuje takie takie informacje:

Połączenie nawiązane!
Notice: Undefined variable: db in C:\xampp\htdocs\ConsoleBlog\index.php on line 30

Fatal error: Call to a member function exec() on null in C:\xampp\htdocs\ConsoleBlog\index.php on line 30

Co ja robię źle? Normalnie pisząc strukturalnie takie zapytanie działa bez problemów. To i każde inne. Może mi ktoś pomóc?

0

Skąd metoda pytaj ma wiedzieć co to za zmienna db?
Plus korzystaj z angielskiego nazewnictwa.
Plus _constructor to beznadziejna nazwa klasy.

0

Napisałem tak, dodając global $db;

<?php

//--raportowanie błędów
	error_reporting(E_ALL);
	ini_set('display_errors', 1);
//--połączenie z bazą danych MySQL przy użyciu PDO
	//***********************************************
	
	class __construct{
		public function connect(){
			try{
				$db = new PDO('mysql:host=localhost;dbname=test', 'root', '',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
				echo 'Połączenie nawiązane!';	
			}catch(PDOException $e){
				echo 'Połączenie nie mogło zostać utworzone.';
			}
		}
	
	}
	//***********************************************
//--wywołanie klas połączenia z bazą danych
	$connect = new __construct;
	$connect->connect();

	//***********************************************
//--pierwsze zapytanie testowe
	class query{
		public function question(){
			global $db;
			$query = $db->exec('INSERT INTO `test` SET `cos`=342');
			}
		}
	$connect2 = new query;
	$connect2->question();

?>

Poprzedni błąd zniknął. Został jednak ten:

Fatal error: Call to a member function exec() on null in C:\xampp\htdocs\ConsoleBlog\index.php on line 30

Cóż z nim?

0

Rzecz w tym, że nie masz pojęcia nie o PHP, a o programowaniu obiektowym samym w sobie.

class SqlDriver {
  private $pdo;

  public function __construct() {
    $this->pdo = cośtam;
  }

  public function select() {
    return new SqlSelectQuery($this->pdo);
  }
}

abstract class SqlQuery {
  private $pdo;

  public function construct($pdo) {
    $this->pdo = $pdo;
  }

  protected function getPdo() {
    return $pdo;
  }
}

class SqlSelectQuery extends SqlQuery {
  // i bawisz się
}

// ----- //
$sql = new SqlDriver();
$selectQuery = $sql->select();

Ja bym to rozwiązał tak, i w podobny sposób masz to zaimplementowane także np. w Zendzie.

0

class name

function __construct

mówi ci to coś?

0

A czy mógłby mi ktoś pokazać prosty przykład użycia zapytania SQL, np. INSERT INTO przy użyciu PDO oraz programowania obiktoweg? Jeden mały przykładzik.

0

Zobacz jak to jest zrobione w Zendzie na przykład.

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