2012-01-27 11 views
6

मैं एक साधारण क्वेरी लाइब्रेरी बनाने का प्रयास कर रहा हूं और मैं डेटाबेस एक्सेस के लिए पीडीओ का उपयोग कर रहा हूं।कक्षाओं के बीच पीडीओ कनेक्शन बनाए रखा जा सकता है?

चलो कहते हैं कि मैं निम्नलिखित दो वर्गों करते हैं:

class FirstClass { 
    var $dbh; 

    function __construct($host,$dbname,$user,$pw) { 
     $this->dbh = new PDO ("mysql:host=$host;dbname=$dbname",$user,$pw); 
    } 

    function use_second($foo) { 
     return new SecondClass ($foo,$this->dbh); 
    } 
} 

class SecondClass { 
    function __construct($foo, $dbh) { 
     $sth = $dbh->prepare('SELECT * FROM atable WHERE bar = :foo'); 
     $sth = $sth->execute(array('foo'=>$foo)); 
     // do something with the query 
    } 
} 

इस वर्गों के बीच एक ही पीडीओ कनेक्शन का उपयोग करने के लिए सही तरीका है? -,, इस के साथ कुछ समस्याएं हो रही किया जाना है क्योंकि मैं लग उदाहरण के लिए अगर मैं द्वितीय श्रेणी से मेरे कनेक्शन var_dump, मैं मिलता है:

object(PDO)#2 (0) { } 

निश्चित रूप से यह सही नहीं है?

इसके अलावा, अगर मैं एक का चयन क्वेरी चलाने, और फिर $sth चर डंप, मैं सिर्फ मिलती है:

bool(true) 

इस क्योंकि मैं कनेक्शन से निपटने रहा है गलत तरीके से? - यदि ऐसा है तो मैं कक्षाओं के बीच एक ही कनेक्शन का सही ढंग से उपयोग कैसे कर सकता हूं?

+1

शीर्षक से प्रश्न का उत्तर: हाँ, वे कर सकते हैं। – Tadeck

+0

हां कारण आप कर सकते हैं। पूछने से पहले आप इसे और अपना समय बचा सकते थे। –

+1

उम ... मैंने इस सवाल में उल्लेख किया कि मैंने यह कोशिश की है। मैंने कहा कि मुझे विश्वास नहीं था कि यह सही तरीके से काम कर रहा था और यह सोच रहा था कि कनेक्शन का मेरा प्रबंधन –

उत्तर

3

इसका कारण यह है कि आप $sth, जो आपके बयान था अधिलेखित होता है, लेकिन अब एक बूलियन है:

class SecondClass { 
    function __construct($foo, $dbh) { 
     // returns PDOStatement: 
     $sth = $dbh->prepare('SELECT * FROM atable WHERE bar = :foo'); 
     // returns boolean: 
     $success = $sth->execute(array('foo'=>$foo)); 
     // do something with the query 
     if ($success) { 
      // do something with $sth->fetchAll() or $sth->fetch(), or anything 
      $all_the_results = $sth->fetchAll(); 
     }; 
    } 
} 
+3

का कारण बन रहा था या नहीं, यह जवाब केवल एकमात्र है जो * वास्तव में * समस्या बताता है - धन्यवाद –

+2

@AlexCoplan: धन्यवाद, मैं खुश हूं मदद की :) – Tadeck

0

PDOStatement::execute के लिए प्रलेखन देखें। यह एक बूलियन देता है। तथ्य यह है कि sthtrue पर हवाओं का अर्थ है कि क्वेरी सफल हुई।

आपका डिज़ाइन थोड़ा कमजोर है क्योंकि आप अन्य वस्तुओं के गैर फैक्ट्री विधियों में ऑब्जेक्ट्स बना रहे हैं, जो भ्रमित हो सकते हैं। आदर्श रूप में, अपने वस्तुओं की सभी नियंत्रक को फांसी की शुरुआत में बनाया जाएगा, और अन्य वस्तुओं है कि उन्हें जरूरत में इंजेक्शन (जैसे PDO वस्तु FirstClass::__construct के बाहर बनाया जाएगा, और आप __construct(PDO $db) बजाय कुछ ऐसा करना होगा।

0

आपके मामले में, मैं बस तैयार पीडीओ वस्तु के लिए (पूछ मेरा मतलब है prequists सेट किया गया है) के द्वारा पूछना होगा।

function __construct($dbh) { 
    $this->dbh = $dbh; 
} 

इस तरह आप अपने वस्तु की जरूरत है क्या पर एक क्लीनर दृष्टिकोण मिलता है (यह की जरूरत नहीं है उपयोगकर्ता/पासवर्ड इत्यादि, इसे डेटाबेस कनेक्शन की आवश्यकता है!)

यह अबास्ट्रक्शन क्लास (फर्स्ट क्लास) की आवश्यकता को भी समाप्त करता है, क्योंकि आप सीधे दूसरी कक्षा में जा सकते हैं।

class SecondClass { 
    function __construct($foo, $dbh) { 
     // returns PDOStatement: 
     $sth = $dbh->prepare('SELECT * FROM atable WHERE bar = :foo'); 
     // returns boolean: 
     $sth = $sth->execute(array('foo'=>$foo)); 
     // do something with the query 
    } 
} 

यह सही करने के लिए, बस $sth के ऊपर लिख नहीं है, तो आप इसे से परिणाम लाने के लिए कर सकते हैं:

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