2016-08-30 4 views
1

Ich bin neu in PHP OOP. Ich habe eine Frage zu meiner Situation.PHP oop wie man eine andere Klassenmethode einfacher aufrufen kann?

db.php

class db{ 

protected $db_host; 
protected $db_name; 
protected $db_user_name; 
protected $db_pass; 

public function __construct() { 
    $this->db_host="localhost"; 
    $this->db_name="bs"; 
    $this->db_user_name="root"; 
    $this->db_pass=""; 
} 

public function conn(){ 

    try { 
     $conn = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", $this->db_user_name="root", $this->db_pass); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     return $conn; 
    } 
    catch(PDOException $e) 
     { 
     echo $sql . "<br>" . $e->getMessage(); 
     } 
    } 
} 

item.php

require "../../includes/db.php"; 

class item{ 

public $user_uid; 
public $last_id; 
public $display_item; 
public $iid; 

protected $item_id; 
protected $item_name; 
protected $item_price; 
protected $item_quantity; 

public function add_item($uid,$item_id,$item_n,$item_p,$item_q){ 

    $db = new db(); 
    $conn=$db->conn(); 

    $this->user_uid=$uid; 
    $this->item_id=$item_id; 
    $this->item_name=$item_n; 
    $this->item_price=$item_p; 
    $this->item_quantity=$item_q; 

    try { 
     $sql = "INSERT item(uid,item_id,item_name,item_price,item_quantity) 
        VALUES('$this->user_uid','$this->item_id','$this->item_name','$this->item_price','$this->item_quantity')"; 
     $conn->exec($sql); 
     $this->last_id=$conn->lastInsertId(); 
    } 

    catch(PDOException $e){ 
     echo $sql . "<br>" . $e->getMessage(); 
    } 
    $conn = null; 
} 

public function display_item($uid){ 

    $db = new db(); 
    $conn=$db->conn(); 

    $this->user_uid=$uid; 

    try{ 

     $sql="SELECT * FROM item where uid='$this->user_uid'"; 
     $statement=$conn->query($sql); 

     while($row=$statement->fetch()){ 

      $this->iid[]=$row['iid']; 
      $this->display_item[]=[$row['item_id'],$row['item_name'],$row['item_price'],$row['item_quantity']]; 

     } 

    } 
    catch(PDOException $e){ 
     echo $sql . "<br>" . $e->getMessage(); 
    } 
    $conn = null; 
} 
} 

wie man es von item.php sehen können, habe ich

$db = new db(); 
$conn=$db->conn(); 

in add_item anrufen() und display_item().

Das bedeutet also jede Methode, die ich auf Datenbankverbindung zugreifen muss, muss ich tun. Gibt es einen einfacheren Weg, dies zu tun, indem Sie $ db = new db() in einer anderen Klasse nicht anlegen, indem Sie meine Codes ändern?

ODER

habe ich einige Funktionen verzichten, die PHP kann das tun?

Meine gewünschte Art und Weise es

require "../../includes/db.php"; 
$db = new db(); 
$conn=$db->conn(); 

class item{ 

... 
... 

public function add_item($uid,$item_id,$item_n,$item_p,$item_q){ 
try { 
    $sql = "INSERT item(uid,item_id,item_name,item_price,item_quantity) 
       VALUES('$this->user_uid','$this->item_id','$this->item_name','$this->item_price','$this->item_quantity')"; 
    $conn->exec($sql); 
} 

public function display_item($uid){ 

.... 

try{ 

     $sql="SELECT * FROM item where uid='$this->user_uid'"; 
     $statement=$conn->query($sql); 

so, dass ich erklären, nur 1 Mal() zu tun

$db = new db(); 
$conn=$db->conn(); 

in Klasse item() und es für den Rest Methoden.

+1

hinzufügen conn nur in den Eigenschaften, innerhalb des Konstruktors von dort verbinden – Ghost

+0

@Ghost hallo Geist, schön von Ihrer Antwort zu hören. Kann mir ein Beispiel zeigen? Ich brauche nur ein einfaches Beispiel! – gosulove

+0

Ich würde empfehlen, vielleicht in eine Abhängigkeitsinjektionsbehälterlösung wie Pimple zu schauen; http://pimple.sensiolabs.org/ oder http://php-di.org/ – Perspective

Antwort

2

Fügen Sie einfach die Verbindung im Konstruktor hinzu. Fügen Sie auch die erforderliche Eigenschaft hinzu:

class db 
{ 

    protected $db_host; 
    protected $db_name; 
    protected $db_user_name; 
    protected $db_pass; 
    protected $db_conn; // add me here 

Dann innerhalb des Konstruktors die Anmeldeinformationen verwenden, um eine Verbindung herzustellen. So dass, wenn Sie das Objekt erstellen, das bereits verbunden sind, werden Sie nur die Eigenschaft Verbindung für Ihre Ausführung von Abfragen und Dinge verwenden:

public function __construct() 
{ 
    $this->db_host = "localhost"; 
    $this->db_name = "bs"; 
    $this->db_user_name = "root"; 
    $this->db_pass = ""; 

    // connect 
    try { 
     $this->db_conn = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", $this->db_user_name="root", $this->db_pass); 
     $this->db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $this->db_conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    } 
    catch(PDOException $e) { 
     echo $sql . "<br>" . $e->getMessage(); 
     exit; 
    } 
} 

Dann verlängern die db Klasse in Artikel. Sie können jetzt die dbdb_conn Eigenschaft innerhalb der item Klasse verwenden.

class item extends db 
{ 

    public $user_uid; 
    public $last_id; 
    public $display_item; 
    public $iid; 

    protected $item_id; 
    protected $item_name; 
    protected $item_price; 
    protected $item_quantity; 


    public function display_item($uid) 
    { 
     try { 

      $stmt = $this->db_conn->prepare('SELECT * FROM item WHERE uid = :uid'); 
      $stmt->bindValue(':uid', $uid); 
      $stmt->execute(); 

      foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { 
       $this->iid[] = $row['iid']; 
       $this->display_item[] = [$row['item_id'], $row['item_name'], $row['item_price'], $row['item_quantity']]; 
      } 

     } catch(PDOException $e) { 
      echo $e->getMessage(); 
      exit; 
     } 
    } 
} 

Nebenbei bemerkt: Ich habe wieder auf

vorbereitete Anweisungen hinzugefügt
+0

Ich denke meine Frage ist nicht klar genug. Ich habe Fehler, wenn Sie Ihren Weg gehen. Ich habe weitere Informationen und die gewünschte Vorgehensweise hinzugefügt. bitte guck dir das an.thx – gosulove

+0

@gosulove es war zu lange von einem Beitrag, um die vollständige Antwort vor einer Weile, ich musste es innen mit einem geeigneten Texteditor zu beenden, ich habe es oben bearbeitet – Ghost

Verwandte Themen