Wykonywanie prostych zapytań SQL

2015-03-10 08:54
Pijany Mleczarz
0

PlikConfigDatabase.class.php:

<?php

class Database{

public function Connect()
{
    try{
        $db = new PDO('mysql:host='.$host.';dbname='.$database, $username,$pass,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.'.$e->getMessage();
    }
}

}

$host = "localhost";
$username = "root";
$password = "";
$database = "portal";
$ob=new Database($host,$database,$username,$password);  

?>

Plik Register.class.php:

<?php
class Register{
    function Save(){

        $stmt = $this->db->prepare("INSERT INTO `user`(`nick`) VALUES(`ggdgffdgd`)");
        if(!$stmt->execute()) print_r($stmt->errorInfo());
    }
}
?>

Plik index.php:

<?php 
    require_once("controller/ConfigDatabase.class.php");
    require_once("controller/Register.class.php");
    $connectDatabase = new Database;
    $connectDatabase->Connect($host, $username, $password, $database);
    $user = new Register(); //do klasy register
    $user->Save() //do klasy register
?>

Błąd jaki otrzymuję. Powiedzcie mi proszę co jest nie tak? Jak stworzyć zapytanie w obiektowym PHP?
Fatal error: Call to a member function prepare() on a non-object in C:\WebServ\httpd\oop_mvc\controller\Register.class.php on line 12

Pozostało 580 znaków

2015-03-10 10:25
0
public function Connect()
{
    try{
        $db = new PDO('mysql:host='.$host.';dbname='.$database, $username,$pass,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.'.$e->getMessage();
    }
}

Przecież utworzonej instancji PDO (zmiennej db) tutaj nigdzie nie zapisujesz.

class Register{
    function Save(){

        $stmt = $this->db->prepare("INSERT INTO `user`(`nick`) VALUES(`ggdgffdgd`)");
        if(!$stmt->execute()) print_r($stmt->errorInfo());
    }
}

A to $this->db skąd wziąłeś?
Ja tam nie widzę pola db w klasie Register.


Pozostało 580 znaków

2015-03-10 14:26
Pijany Mleczarz
0

W jaki sposób mam zapisać tą instancję? Jak się odwołać jak nie poprzez:

$this->db

?

Pozostało 580 znaków

2015-03-10 17:50
0

No nie wiem, kurczę, może stwórz pole klasy i tam ją zapisz? :P


Pozostało 580 znaków

2015-03-10 19:30
0

PlikConfigDatabase.class.php:

<?php
class Database{

public function Connect($host, $username, $pass, $database)
{
    try{
        $db = new PDO('mysql:host='.$host.';dbname='.$database, $username,$pass,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.'.$e->getMessage();
    }
    return $db;
}

}

$host = "localhost";
$username = "root";
$password = "";
$database = "db_cered";
$ob=new Database($host,$database,$username,$password);    
?>

Plik Register.class.php:

<?php
class Register{
    function Save($db){

        $stmt = $db->prepare("INSERT INTO `user`(`nick`) VALUES(`ggdgffdgd`)");
        if(!$stmt->execute()) print_r($stmt->errorInfo());
    }
}
?>

Plik index.php:

<?php
           require_once("ConfigDatabase.class.php");
            require_once("Register.class.php");
            $connectDatabase = new Database();
            $db = $connectDatabase->Connect($host, $username, $password, $database);
            $user = new Register(); //do klasy register
            $user->Save($db); //do klasy register
        ?>

Więc tak:
przeanalizuj poprawiony przeze mnie przykład.
Funkcja Connect powinna zwracać zmienną $db, która jest przypisana w pliku index.php.
Funkcja Save klasy Register w parametrze dostaje zmienną $db i wszystko pięknie działa.

Pozostało 580 znaków

2015-03-10 19:37
0

@kalar: kijem przez szmatkę bym tego nie dotknął - jak już poprawiać to porządnie:

class Database {
    private $pdo;

    public function connect($host, $username, $pass, $database) {
        try {
            $this->pdo = new PDO('mysql:host='.$host.';dbname='.$database, $username,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
        } catch(PDOException $e){
            echo 'Połączenie nie mogło zostać utworzone.'.$e->getMessage();
        }
    }

    public function getPdo() {
        return $this->pdo;
    }
}

abstract class DatabaseManipulator {
    private $db;

    public function setDb(Database $db) {
        $this->db = $db;
        return $this;
    }

    public function getDb() {
        return $this->db;
    }

    public function getPdo() {
        return $this->db->getPdo();
    }
}

class User extends DatabaseManipulator {
    public function save() {
        $stmt = $this->getPdo()->prepare("INSERT INTO `user`(`nick`) VALUES(`ggdgffdgd`)");

        if (!$stmt->execute()) {
            print_r($stmt->errorInfo());
        }
    }
}

/* ... */

$db = new Database();
$db->connect();

$user = new User();
$user->setDb($db);

(pisane z palca, więc może zawierać błędy i śladowe ilości orzechów)

Zauważ, że zmieniłem nazwę klasy Register na bardziej uniwersalne User i generalnie to tej konwencji się trzymaj.


edytowany 3x, ostatnio: Patryk27, 2015-03-10 19:42

Pozostało 580 znaków

2015-03-11 15:33
Pijany Mleczarz
0

Ok. Dzięki Wam za pomoc. Mam jeszcze takie małe pytanie. Do jakich katalogów umieścić ten kod aby był zgodny z MVC?
Łączenie do controller?
Zapytanie do model?

A to?

$db = new Database();
$db->connect();

$user = new User();
$user->setDb($db);

Pozostało 580 znaków

2015-03-11 15:57
0
$db = new Database();
$db->connect();

$user = new User();
$user->setDb($db);

To też kontroler.


Pozostało 580 znaków

2015-03-11 16:15
Pijany Mleczarz
0

Rozumiem, że powyższe "ustalenia" co podałem są OK?

Łączenie do controller?
Zapytanie do model?

Ten kod do controler:

$db = new Database();
$db->connect();

$user = new User();
$user->setDb($db);

A do view dać kod HTML. Zgadza się?
Są jeszcze foldery typu libs itd. Do czego one służą?

I jeszcze w jakich katalogach umieszczać pliku .css oraz .js?

Pozostało 580 znaków

2015-03-11 16:54
0

Tak, powyższe ustalenia są poprawne - łącznie z tym, że do widoku idzie kod HTML (a formalnie to może być HTML przeplatany z PHP, dlatego pliki widoku mają rozszerzenie phtml).
Jedynie samo łączenie z bazą ładniej byłoby wyrzucić do jakiegoś skryptu bootstrapującego.

W przypadku ZF2 pliki css/js (zbiorczo nazywane assets) trafiają do katalogu public - w moim prostym projekcie prezentuje się to tak:
11032015_16_55_21.png
Z katalogiem serwerowym root ustawionym na podkatalog public, kod aplikacji jest w katalogu module, konfiguracja w config, a w vendor - kod samego Zend Frameworka.


edytowany 3x, ostatnio: Patryk27, 2015-03-12 10:14
Obrazek nie jest dostępny; - furious programming 2015-03-11 23:01

Pozostało 580 znaków

2015-03-13 22:42
Pijany Mleczarz
0

A co jeśli chodzi o bindowanie danych?
Przykład ze strukturalnego PHP:

$row->bindValue(":nick", $_SESSION['nick'], PDO::PARAM_STR);

Jak to przerobić na OOP?

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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