2017-04-26 4 views
6

मुझे लगता है कि ओओपी कैसे काम करता है यह समझने में मुझे कोई समस्या है। मैंने पहले से ही उस कोड को बदल दिया है जो यह काम करता है, लेकिन यह मुझे लगता है कि प्रोपर्स तरीका नहीं है। परिदृश्य के बाद (। नहीं, मैं एक USERLOGIN अपने आप के द्वारा अपने वास्तव में सिर्फ स्थानीय देव के लिए समझने के लिए OOP बेहतर बनाने नहीं कर रहा हूँ,):ओओपी को समझना - अन्य कक्षाओं में पीडीओ कनेक्शन का उपयोग कैसे करें

class Database { 

    /* Properties */ 
    private $conn; 
    private $dsn = 'mysql:dbname=test;host=127.0.0.1'; 
    private $user = 'root'; 
    private $password = ''; 

    /* Creates database connection */ 
    public function __construct() { 
     try { 
      $this->conn = new PDO($this->dsn, $this->user, $this->password); 
     } catch (PDOException $e) { 
      print "Error!: " . $e->getMessage() . ""; 
      die(); 
     } 
     return $this->conn; 
    } 
} 

तो में:

मैं एक database.php फ़ाइल है इस वर्ग में मैं डेटाबेस कनेक्शन बना रहा हूं और मैं कनेक्शन (ऑब्जेक्ट?)

फिर मेरे पास दूसरी श्रेणी है, प्रसिद्ध उपयोगकर्ता वर्ग (वास्तव में मैं ऑटोलोड का उपयोग नहीं कर रहा हूं, लेकिन मुझे इसके बारे में पता है):

include "database.php"; 

class User { 
    /* Properties */ 
    private $conn; 

    /* Get database access */ 
    public function __construct() { 
     $this->conn = new Database(); 
    } 

    /* Login a user */ 
    public function login() { 
     $stmt = $this->conn->prepare("SELECT username, usermail FROM user"); 
     if($stmt->execute()) { 
      while($rows = $stmt->fetch()) { 
       $fetch[] = $rows; 
      } 
      return $fetch; 
     } 
     else { 
      return false; 
     } 
    } 
} 

तो मेरे दो वर्गों को तोड़ दो। जैसा कि आप देखते हैं, कुछ भी बड़ा नहीं है। अब, फ़ंक्शन नाम login के बारे में भ्रमित न हों - वास्तव में मैं डेटाबेस से कुछ उपयोगकर्ता नाम और usermails का चयन करने और उन्हें प्रदर्शित करने का प्रयास करें। मैं इस से प्राप्त करने के लिए प्रयास करें:

$user = new User(); 
$list = $user->login(); 

foreach($list as $test) { 
    echo $test["username"]; 
} 

और यहाँ समस्या आती है। जब मैं इस कोड को निष्पादित, मैं निम्नलिखित त्रुटि संदेश मिलता है:

Uncaught Error: Call to undefined method Database::prepare()

और मुझे यकीन है मैं वास्तव में समझते हैं कि क्या इस त्रुटि का कारण बनता है नहीं कर रहा हूँ।

कोड अच्छी तरह से काम करता है जब मैं निम्नलिखित बातें बदलने के लिए: के बजाय निजी की जनता के लिए database.php में

बदलें $conn (मुझे लगता है कि thats बुरा ... लेकिन जब अपने निजी, मैं केवल निष्पादित कर सकते हैं? डेटाबेस क्लास के अंदर पूछताछ, मैं सही हूँ? तो क्या मुझे इन सभी क्वेरी को डेटाबेस क्लास में रखना चाहिए? मुझे लगता है कि यह खराब है, क्योंकि एक बड़ी परियोजना में यह वास्तव में बड़ा हो जाएगा ..)

और दूसरा परिवर्तन मुझे करना है: उपयोगकर्ता.php फ़ाइल में $this->conn->prepare से $this->conn->conn->prepare बदलें। और यहां मैं वास्तव में कोई विचार क्यों नहीं है।

मेरा मतलब है, user.php के निर्माता में मैंने एक $this->conn = new Database() और के बाद से नए डाटाबेस मुझे डीबी वर्ग से संबंध वस्तु वापस आ जाएगी, मैं वास्तव में नहीं जानता कि क्यों एक दूसरे conn->

होना जरूरी

अगर कोई मुझे थोड़ा बेहतर समझा सकता है तो मैं वास्तव में आभारी हूं। मैं चर के दृश्यता के बारे में जानता हूं और मैंने इसके बारे में बहुत कुछ पढ़ा है, लेकिन मुझे लगता है कि मुझे अभी यह समझ में नहीं आया है, अन्यथा मुझे यह समस्या नहीं होगी।

प्रत्येक सलाह के लिए धन्यवाद! :)

+1

कन्स्ट्रक्टर को कुछ भी वापस नहीं करना चाहिए: http://stackoverflow.com/questions/6849572/returning-a-value-in-constructor-function-of-a-class - उस विधि तक पहुंचने के लिए आपका 'डाटाबेस' 'वर्ग को 'पीडीओ' – CD001

+2

बढ़ाने की आवश्यकता होगी आपकी त्रुटि' $-- conn-> तैयार है ('आप अपने डेटाबेस वर्ग पर तैयार फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं लेकिन कोई तैयार फ़ंक्शन नहीं है। आप '$ डाटाबेस पब्लिक का conn' जिसके परिणामस्वरूप '$ this-> conn-> conn-> ready' होगा। आपके डेटाबेस' __construct() 'का रिटर्न वैल्यू डाटाबेस ऑब्जेक्ट को वापस नहीं कर रहा है, भले ही आप इसे $- > conn' –

+0

@ सीडी 00001 कन्स्ट्रक्टर के बारे में सलाह के लिए धन्यवाद, मैं इसे देख लूंगा। दूसरी बात के बारे में निश्चित है? क्योंकि जब मैं डेटाबेस क्लास में पूरा 'लॉगिन' फ़ंक्शन डालता हूं, तो यह पूरी तरह से काम करता है पीडीओ से विस्तार ... – Twinfriends

उत्तर

9
  • डेटाबेस क्लास से छुटकारा पाएं। यह क्या पीडीओ पहले से ही है
  • हर वर्ग है कि एक डेटाबेस कनेक्शन

डेटाबेस की जरूरत में

  • यह एक निर्माता पैरामीटर के रूप में पास वेनिला पीडीओ से एक एकल $ db उदाहरण बनाने के लिए कुछ भी नहीं कहते हैं।php:

    <?php 
    $host = '127.0.0.1'; 
    $db = 'test'; 
    $user = 'root'; 
    $pass = ''; 
    $charset = 'utf8'; 
    
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; 
    $opt = [ 
        \PDO::ATTR_ERRMODE   => \PDO::ERRMODE_EXCEPTION, 
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, 
        \PDO::ATTR_EMULATE_PREPARES => false, 
    ]; 
    $pdo = new \PDO($dsn, $user, $pass, $opt); 
    

    user.php

    <?php 
    class User { 
        /* Properties */ 
        private $conn; 
    
        /* Get database access */ 
        public function __construct(\PDO $pdo) { 
         $this->conn = $pdo; 
        } 
    
        /* List all users */ 
        public function get_users() { 
         return $this->conn->query("SELECT username, usermail FROM user")->fetchAll(); 
        } 
    } 
    

    app.php

    include 'database.php'; 
    $user = new User($pdo); 
    $list = $user->get_users(); 
    
    foreach($list as $test) { 
        echo $test["username"]; 
    } 
    

    उत्पादन:

    username_foo 
    username_bar 
    username_baz 
    

    चेक बाहर मेरी (The only proper) PDO tutorial के लिए और अधिक पीडीओ विवरण।

  • +0

    प्रतिभा !!! यह इतना समझ में आता है। और इस तरह मैं अपनी कक्षाओं में पूछताछ रख सकता हूं! बहुत बहुत धन्यवाद :) – Twinfriends

    +1

    हालांकि यह हल करने का यह एक अच्छा तरीका है, मैं व्यक्तिगत रूप से अपने मॉडल में कनेक्शन नहीं करना चाहता हूं। इसे "साफ" रखने के लिए भी एक बेस मॉडल का विस्तार करना हो सकता है जिसमें कनेक्शन विधियां हों। –

    +0

    @NiekvanderMaden यदि आप बेस मॉडल का विस्तार करते हैं, तो आपके पास वंश वर्ग में कनेक्शन भी है। –

    संबंधित मुद्दे