Wykonywanie prostych zapytań SQL

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

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.

0

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

$this->db

?

0

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

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.

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.

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);
0
$db = new Database();
$db->connect();
 
$user = new User();
$user->setDb($db);

To też kontroler.

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?

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.

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?

0

Przecież to jest już OOP :v
Co Cię pokusiło, aby pomyśleć, że to programowanie strukturalne?

0

Fatal error: Call to a member function bindValue() on a non-object in C:\WebServ\httpd\oop_mvc\model\Login.class.php on line 18

Ten błąd jest ze wskazaniem na tą linijkę:

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

Problem naprawiony. Wynikał on z tego, że źle kod poukładałem i zapomniałem dodać pobierania zgodnego z OOP(przyzwyczajony do struktur)

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