Wykonywanie zapytań PDO w obiektowym PHP

2015-02-15 22:36
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?

Pozostało 580 znaków

2015-02-15 23:19
0

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


edytowany 2x, ostatnio: Patryk27, 2015-02-15 23:19
No ok ale jak to przekazać, żeby metoda wiedziała co to za zmienna? Czy kod mam źle stworzony pod względem obiektowości? Co zrobiłem źle? - dawid4157 2015-02-15 23:23

Pozostało 580 znaków

2015-02-15 23:28
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?

Pozostało 580 znaków

2015-02-15 23:31
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.


edytowany 5x, ostatnio: Patryk27, 2015-02-15 23:33
"Rzecz w tym, że nie masz pojęcia nie o PHP, a o programowaniu obiektowym samym w sobie." Muszę się z tobą zgodzić. Za dużego pojęcia o OOP to ja nie mam, bo dotychczas wszystko pisałem strukturalnie. I tak szczerze mówiąc to średnio rozumiem twój kod. Jeśli byś mógł jakoś mi go opisać byłbym wdzięczny. Jeśli MOŻESZ :) - dawid4157 2015-02-15 23:37
Masz klasę SqlDriver, która opakowuje łączenie się z PDO, trzymanie tej instancji w polu klasy (bo gdzieś trzeba utworzone połączenie zapisać) oraz przekazanie jej do późniejszych instancji SqlQuery (np. sqlowego select - SqlSelectQuery), który potem tę instancję PDO wykorzystuje na własne cele. Generalnie zapomnij o istnieniu zmiennych globalnych. - Patryk27 2015-02-16 00:01

Pozostało 580 znaków

2015-02-16 14:37
malyTerorysta
0

class name

function __construct

mówi ci to coś?

Pozostało 580 znaków

2015-02-22 12:45
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.

Pozostało 580 znaków

2015-02-22 20:12
0

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


Tylko ja nie chcę korzystać z Zenda. - dawid4157 2015-02-22 20:36
Iiiii co w związku z tym? - Patryk27 2015-02-22 20:44
A to, że nie chcę korzystać z frameworka. Czy zapytania w Zendzie są takie same jak w samym OOP? - dawid4157 2015-02-22 20:59
Nie chcę, abyś korzystał z frameworka - chcę, abyś sprawdził w dokumentacji lub na jakimś forum, jak tam jest ten podsystem wykonany to będziesz wiedział jak zbudować swój. Co to znaczy "czy są takie same jak w OOP"? - Patryk27 2015-02-22 21:01

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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