2010-07-21 12 views
7

मैं पीडीओ के FETCH_INTO का उपयोग कर निर्माता के साथ वर्ग को भरने के लिए चाहते हैं:

class user 
{ 
    private $db; 
    private $name; 

    function __construct($id) 
    { 
     $this->db = ...; 

     $q = $this->db->prepare("SELECT name FROM users WHERE id = ?"); 
     $q->setFetchMode(PDO::FETCH_INTO, $this); 
     $q->execute(array($id)); 

     echo $this->name; 
    } 
} 

यह काम नहीं करता। कोई त्रुटि नहीं, बस कुछ भी नहीं। स्क्रिप्ट में कोई त्रुटि नहीं है, FETCH_ASSOC ठीक काम करता है।

FETCH_INTO के साथ क्या गलत है?

+0

मैं हाल ही में वस्तुओं को परिभाषित करने पीडीओ का उपयोग कर मेरे लिए, इस तरह के माध्यम से चला गया और वस्तुओं को भरने के लिए विधि सबसे सुविधाजनक मैं देख सकता है लाने:

यहाँ मेरी समाधान है। – user544262772

उत्तर

14

अपने कोड में दो त्रुटियाँ हैं:)

1) आप $ Q-> लाने (भूल गया

... 
$q->execute(array($id)); 
$q->fetch(); // This line is required 

2) लेकिन $ Q- जोड़ने के बाद भी> लाने() आप करेंगे इसे प्राप्त करें:

Fatal error: Cannot access private property User::$name in ...

तो, जैसा कि आप देख सकते हैं, पीडीओ निजी सदस्यों तक नहीं पहुंच सकता है भले ही इसे क्लास विधि के अंदर बुलाया जाए।

... 
$q->execute(array($id)); 
$q->setFetchMode(PDO::FETCH_ASSOC); 
$data = $q->fetch(); 
foreach ($data as $propName => $propValue) 
{ 
    // here you can add check if class property exists if you don't want to 
    // add another properties with public visibility 
    $this->{$propName} = $propValue; 
} 
+2

आप सार्वजनिक रूप से '$ name' भी बना सकते हैं। यह निश्चित रूप से एक की तरह लगता है। – Matchu

+3

सार्वजनिक गुणों को जोड़ना हमेशा अच्छा विचार नहीं है – Serg

+0

+ यह उदाहरण सुपर सहायक – Nathan

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