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, botów: 0