2014-12-10 14 views
36

पर मैं एक समारोह है कि एक DB से सेटिंग हो जाता है पर व्यस्त हूँ करने के लिए कॉल, और अचानक, मैं इस त्रुटि का सामना किया:गंभीर त्रुटि: एक सदस्य समारोह bind_param() बूलियन

Fatal error: Call to a member function bind_param() on boolean in C:\xampp2\htdocs\application\classes\class.functions.php on line 16 

आम तौर पर, यह होगा मतलब है कि मैं अनन्य टेबल और सामान से सामान का चयन कर रहा हूँ। लेकिन इस मामले में, मैं नहीं हूँ ...

यहाँ getSetting समारोह है:

public function getSetting($setting) 
{ 
    $query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?'); 
    $query->bind_param('s', $setting); 
    $query->execute(); 
    $query->bind_result($value, $param); 
    $query->store_result(); 
    if ($query->num_rows() > 0) 
    { 
     while ($query->fetch()) 
     { 
      return $value; 
      if ($param === '1') 
      { 
       $this->tpl->createParameter($setting, $value); 
      } 
     } 
    } 
    else 
    { 
     __('invalid.setting.request', $setting); 
    } 
} 

$this->db चर एक निर्माता के माध्यम से पारित कर दिया है। इसके अलावा, के बाद से मैं एक डेटाबेस का इस्तेमाल कर रही हूँ, मेरी डेटाबेस कनेक्शन

public function __construct($db, $data, $tpl) 
{ 
    $this->db = $db; 
    $this->tpl = $tpl; 
    $this->data = $data; 
    $this->data->setData('global', 'theme', $this->getSetting('theme')); 
} 

:

class Database 
{ 
    private $data; 

    public function __construct($data) 
    { 
    $this->data = $data; 
    $this->conn = new MySQLi(
     $this->data->getData('database', 'hostname'), 
     $this->data->getData('database', 'username'), 
     $this->data->getData('database', 'password'), 
     $this->data->getData('database', 'database') 
    ); 
    if ($this->conn->errno) 
    { 
     __('failed.db.connection', $this->conn->errno); 
    } 
    date_default_timezone_set('Europe/Amsterdam'); 
} 

मैं पहले से ही कनेक्शन परीक्षण किया है, 100% सकारात्मक जरूरत के मामले में, यहाँ यह है यह इरादे के रूप में काम करता है। मैं एक विन्यास फाइल में डीबी कनेक्शन बातें सेट कर रहा हूं:

'database' => array(
    'hostname' => '127.0.0.1', 
    'username' => 'root', 
    'password' => ******, 
    'database' => 'wscript' 
) 

अब अजीब बात है, तालिका मौजूद है, अनुरोधित सेटिंग मौजूद है, डीबी मौजूद है, लेकिन फिर भी, वह त्रुटि नहीं छोड़ी जाएगी। यहाँ कुछ सबूत है कि डीबी सही है:

IMG

उत्तर

77

समस्या में निहित है:

$query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?'); 
$query->bind_param('s', $setting); 

prepare() विधि false लौट सकते हैं और आपको लगता है कि के लिए जाँच करनी चाहिए। क्यों यह false लौटाता है, शायद तालिका का नाम या कॉलम नाम (SELECT या WHERE खंड में) सही नहीं हैं?

इसके अलावा, SQL को पार्स करने वाली त्रुटियों की जांच करने के लिए $this->db->conn->error_list जैसे कुछ का उपयोग करने पर विचार करें। (मैं वास्तविक SQL विवरण तार भी कभी-कभी गूंज जाएगा और पेस्ट में phpMyAdmin परीक्षण करने के लिए, है, लेकिन वहाँ निश्चित रूप से कुछ वहाँ में नाकाम रहने के है।)

+1

आप '$ query-> error_list'if तैयार तरीकों झूठी (? और इस तरह $ क्वेरी झूठी होगा) एक त्रुटि दिखाई देता है रिटर्न जब कॉल करने के लिए सुझाव है कि क्यों है:

इस देखते हैं? – Adam

+0

@Adam आपके पास एक बिंदु है। कॉलिंग '$ query-> error_list' समझ में आता है bind_param या एक निष्पादित विफल रहता है, लेकिन अगर' $ query' गलत है तो एक 'बुलाना चाहिए * mysqli पर error' या' error_list' * वस्तु, यानी '$ this-> db-> conn-> error_list'। – RobP

9

prepare वापसी एक बूलियन केवल जब यह इसलिए विफल रहता है FALSE, त्रुटि आप की जरूरत से बचने के लिए जांचें कि क्या यह True निष्पादित करने से पहले पहले है:

$sql = 'SELECT value, param FROM ws_settings WHERE name = ?'; 
if($query = $this->db->conn->prepare($sql)){ 
    $query->bind_param('s', $setting); 
    $query->execute(); 
    //rest of code here 
}else{ 
    //error !! don't go further 
    var_dump($this->db->error); 
} 
11

किसी भी समय आप ...

"Fatal error: Call to a member function bind_param() on boolean"

... यह संभावना है आपकी जिज्ञासा के साथ एक मुद्दा है क्योंकि वहाँ मिलता है। prepare()FALSE (एक बूलियन) लौटा सकता है, लेकिन यह सामान्य विफलता संदेश आपको सुराग के रास्ते में ज्यादा नहीं छोड़ता है। आप कैसे पूछते हैं कि आपकी क्वेरी में क्या गलत है? आप पूछें!

सबसे पहले, सुनिश्चित करें कि त्रुटि रिपोर्टिंग को चालू और दृश्य है: सही अपने उद्घाटन के बाद अपनी फ़ाइल (रों) के शीर्ष करने के इन दो पंक्तियों को जोड़ने <?php टैग:

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

अपने त्रुटि रिपोर्टिंग है PHP में सेट किया गया है।ini आपको इसके बारे में चिंता करने की ज़रूरत नहीं है। बस सुनिश्चित करें कि आप त्रुटियों को गहन तरीके से संभालते हैं और कभी भी अपने उपयोगकर्ताओं को किसी भी समस्या का सही कारण प्रकट नहीं करते हैं। जनता के लिए सही कारण बताते हुए उन लोगों के लिए सोने का उत्कीर्ण निमंत्रण हो सकता है जो आपकी साइट्स और सर्वर को नुकसान पहुंचाते हैं। यदि आप ब्राउज़र में त्रुटियां नहीं भेजना चाहते हैं तो आप हमेशा अपने वेब सर्वर त्रुटि लॉग की निगरानी कर सकते हैं। लॉग स्थान सर्वर से सर्वर में भिन्न होंगे उदा।, उबंटू पर त्रुटि लॉग आमतौर पर /var/log/apache2/error.log पर स्थित होता है। क्या आप Linux परिवेश में त्रुटि लॉग जायज़ा ले रहे हैं, तो आप एक कंसोल विंडो में tail -f /path/to/log का उपयोग त्रुटियों को देखने के रूप में वे वास्तविक समय में हो सकता है .... या आप उन्हें बनाने के रूप में।

एक बार जब आप मानक त्रुटि रिपोर्टिंग अपने डेटाबेस कनेक्शन पर त्रुटि जाँच जोड़ने और प्रश्नों आप समस्याओं पर जाने के बारे में और अधिक विस्तार दे देंगे पर दूर चुकता कर रहे हैं। इस उदाहरण पर एक नज़र डालें जहां कॉलम का नाम गलत है। सबसे पहले, कोड जो सामान्य गंभीर त्रुटि संदेश देता है:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; 
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection 
$query->bind_param('s', $definition); 
$query->execute(); 

त्रुटि सामान्य और बहुत सुलझाने क्या चल रहा है में आप के लिए उपयोगी नहीं है।

कोड का अधिक लाइनों आप बहुत विस्तृत जानकारी है जो आप इस मुद्दे को तुरंत हल करने के लिए उपयोग कर सकते हैं प्राप्त कर सकते हैं की एक जोड़ी के साथ

। सच्चाई के लिए prepare() कथन देखें और यदि यह अच्छा है तो आप बाध्यकारी और निष्पादन पर आगे बढ़ सकते हैं।

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; 
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection 
    $query->bind_param('s', $definition); 
    $query->execute(); 
    // any additional code you need would go here. 
} else { 
    $error = $mysqli->errno . ' ' . $mysqli->error; 
    echo $error; // 1054 Unknown column 'foo' in 'field list' 
} 

यदि कुछ गलत है तो आप एक त्रुटि संदेश थूक सकते हैं जो आपको सीधे इस मुद्दे पर ले जाता है। इस मामले में तालिका में foo कॉलम नहीं है, समस्या को हल करना मामूली है।

आप चुनते हैं, तो आप इस एक समारोह या कक्षा में जाँच और शान से त्रुटियों से निपटने जैसा कि पहले उल्लेख के रूप में द्वारा यह विस्तार शामिल कर सकते हैं।

+4

मुख्य रूप से त्रुटि रिपोर्टिंग के बारे में सलाह के लिए बहुत अच्छा जवाब। त्रुटि रिपोर्टिंग अक्षम के साथ प्रोग्रामिंग आंखों के साथ शतरंज खेलना पसंद है। लोग यह भी नहीं जानते कि डीबगर का उपयोग कैसे करें (या यह भी मौजूद है)। –

5

यहां तक ​​कि जब क्वेरी वाक्यविन्यास सही है, तैयार हो सकता है, यदि पिछले विवरण था और यह बंद नहीं था। हमेशा

$statement->close(); 

के साथ अपने पिछले बयान बंद करते हैं वाक्यविन्यास सही है, तो निम्न क्वेरी में अच्छी तरह से भी चलेंगे।

+0

इस उत्तर ने मेरी मदद की। – Amine

1

एक और स्थिति जो इस समस्या का कारण बन सकती है, आपके प्रश्नों में गलत कास्टिंग है।

मुझे पता है कि यह स्पष्ट हो सकता है, लेकिन मैंने Tablename के बजाय tablename का उपयोग करके इसमें भाग लिया है। अपने प्रश्नों की जांच करें, और सुनिश्चित करें कि आप अपनी तालिका में कॉलम के वास्तविक नाम के समान केस का उपयोग कर रहे हैं।

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