2010-07-28 11 views
9

मैं सिर्फ पीडीओ की कोशिश कर रहा हूं और मुझे यह त्रुटि मिलती है, घातक त्रुटि: एक गैर-ऑब्जेक्ट पर किसी सदस्य फ़ंक्शन fetch() पर कॉल करें, लेकिन यह पहले से ही $-> डीबी ऑब्जेक्ट पर नहीं है?पीडीओ: किसी गैर-ऑब्जेक्ट पर किसी सदस्य फ़ंक्शन fetch() पर कॉल करें?

class shoutbox { 

    private $db; 

    function __construct($dbname, $username, $password, $host = "localhost") 
    { # db conections 
     try { 
      $this->db = new PDO("mysql:host=".$hostname.";dbname=".$dbname, $username, $password); 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 

    function getShouts() 
    { 
     $sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, time FROM shouts WHERE pmuserid == 0'); 

     return $sql_shouts->fetch(PDO::FETCH_OBJ); 

    } 

} 

उत्तर

1

मैं कहूँगा कि आपकी क्वेरी गलत वाक्यविन्यास की वजह से क्रियान्वित नहीं है। यह देखने के लिए कि क्या क्वेरी गलत तरीके से हुई है या नहीं, आपको वास्तव में पीडीओ के errorinfo स्थिर फ़ंक्शन की जांच करनी चाहिए।

$sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, `time` FROM shouts WHERE pmuserid = 0');

मेरा मानना ​​है कि समय MySQL में एक आरक्षित शब्द मैं एक अलग नाम का उपयोग करते हुए, लेकिन बैकटिक में यह encasing कि इस मुद्दे को कम होगा की सिफारिश करेंगे है:

यहाँ एक संभावित सही एसक्यूएल बयान है। 1 बराबर चिह्न का उपयोग mysql के लिए किया जाता है, दो नहीं। लेकिन हाँ, यह निर्धारित करने के लिए errorinfo फ़ंक्शन में देखें कि क्या आपकी क्वेरी सिंटैक्स त्रुटि के कारण विफल रही है और इसे शानदार तरीके से संभालती है। ध्यान से PDO::query के लिए दस्तावेज़ पर

+0

यदि आप माइक्रोसॉफ्ट एसक्यूएल सर्वर आरक्षित शब्दों का उपयोग कर रहे हैं तो [टाइम] तरीके से उपयोग किया जाता है। महान जानकारी/विवरण के लिए – Crypth

17

देखो, विशेष रूप से "द रिटर्न मान" अनुभाग:

PDO::query() returns a PDOStatement object, or FALSE on failure.

महत्वपूर्ण बिट "विफलता पर गलत है।" गलत कोई ऑब्जेक्ट नहीं है, इसलिए कॉल करना -> fetch() खराब समाचार है।

त्रुटि शायद आपके "==" तुलना ऑपरेटर के उपयोग के कारण है। एसक्यूएल में, यह सिर्फ "=" है।

आप जांच करनी चाहिए कि $sql_shouts झूठी नहीं है, और उसके बाद त्रुटि के साथ कुछ स्मार्ट करते हैं, अगर वहाँ एक था:

<?PHP 
$sql_shouts = $this->db->query('...'); 
if ($sql_shouts === false){ 
    $errorInfo = $this->db->errorInfo(); 
    //log the error or take some other smart action 
} 
return $sql_shouts->fetch(PDO::FETCH_OBJ); 
+2

+1। अच्छी तरह से लिखा और वर्णित। –

-1

यह तब होता है जब टेबल भी मौजूद नहीं है। सुनिश्चित करें कि यह वास्तव में मौजूद है, और हार्ड ड्राइव त्रुटियों के कारण डेटाबेस में केवल धारक नहीं है।

जब ऐसा होता है तो मेरा सुझाव है कि आप डेटाबेस/तालिका को फिर से बनाएं।

-1

मुझे ब्रैकेट के साथ मूर्खतापूर्ण गलती के कारण यह त्रुटि संदेश मिला। यह एक कथन के अंदर घोंसला था और बस इसे नहीं देखा।

db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var)->fetchField()); 

यह मुझे बाहर काम करने लगता है कि मैं सही जगह में db_query ब्रैकेट बंद नहीं किया कुछ समय लिया। शायद यह किसी और को इस आश्चर्यजनक wth पर staring मदद करता है। सही:

db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var))->fetchField(); 
संबंधित मुद्दे