सवाल घातक त्रुटि: बूलियन पर एक सदस्य फ़ंक्शन 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


44
2017-12-10 06:39


मूल




जवाब:


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

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

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

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


85
2017-12-10 06:43



आप कॉल करने का सुझाव क्यों देते हैं $query->error_listयदि तैयार विधियां झूठी होती हैं (और इस प्रकार $ क्वेरी गलत होगी?) जब कोई त्रुटि प्रकट होती है? - Adam
@ एडम आपके पास एक बिंदु है। कॉलिंग $query->error_list समझ में आता है कि bind_param या निष्पादन विफल रहता है, लेकिन यदि $query झूठ है तो किसी को फोन करना चाहिए error या error_list पर mysqli वस्तु, यानी $this->db->conn->error_list। - RobP


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

"घातक त्रुटि: बूलियन पर एक सदस्य फ़ंक्शन bind_param () पर कॉल करें"

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

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

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

यदि आपकी त्रुटि रिपोर्टिंग php.ini में सेट की गई है तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं होगी। बस सुनिश्चित करें कि आप त्रुटियों को गहन तरीके से संभालते हैं और कभी भी अपने उपयोगकर्ताओं को किसी भी समस्या का सही कारण प्रकट नहीं करते हैं। जनता के लिए सही कारण बताते हुए उन लोगों के लिए सोने का उत्कीर्ण निमंत्रण हो सकता है जो आपकी साइट्स और सर्वर को नुकसान पहुंचाते हैं। यदि आप ब्राउज़र में त्रुटियां नहीं भेजना चाहते हैं तो आप हमेशा अपने वेब सर्वर त्रुटि लॉग की निगरानी कर सकते हैं। लॉग स्थान सर्वर से सर्वर में भिन्न होंगे उदा।, उबंटू पर त्रुटि लॉग आमतौर पर स्थित होता है /var/log/apache2/error.log। यदि आप लिनक्स पर्यावरण में त्रुटि लॉग की जांच कर रहे हैं तो आप इसका उपयोग कर सकते हैं 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 तालिका में कॉलम, समस्या को हल करना मामूली है।

यदि आप चुनते हैं, तो आप इस चेकिंग को फ़ंक्शन या क्लास में शामिल कर सकते हैं और त्रुटियों को पहले से बताए गए त्रुटियों को संभालने के द्वारा बढ़ा सकते हैं।


16
2017-08-05 21:01



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


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);
}

10
2017-12-10 06:48





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

$statement->close();

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


6
2018-05-24 08:08



इस जवाब ने मेरी मदद की। - Amine


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

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


1
2017-09-22 12:04





कभी-कभी, यह भी एक के कारण है गलत टेबल नाम या आम नाम  तैयारी बयान में

यह देखो:

https://www.youtube.com/watch?v=LGHdQ1bBho8


0
2018-02-17 11:40





आपको अपने कथन को हमेशा कोशिश करने के लिए हमेशा प्रयास करना चाहिए ... यह हमेशा इस तरह की स्थितियों में मदद करेगा और आपको बताएगा कि क्या गलत है। शायद तालिका का नाम या कॉलम नाम गलत है।


0
2018-03-27 14:49





वास्तविक त्रुटि के साथ यह विशेष त्रुटि बहुत कम है। यहां मेरा समान अनुभव और समाधान है ... मेरे पास एक टेबल था जिसे मैं अपने कथन में "डेटाबेस-नाम | .login" समग्र नाम के साथ उपयोग करता हूं। मैंने सोचा कि यह कोई समस्या नहीं होगी। वास्तव में यह समस्या थी। स्क्वायर ब्रैकेट के अंदर इसे संलग्न करने से मेरी समस्या हल हो गई ("[| डेटाबेस-नाम |]। [लॉगिन]")। तो, समस्या MySQL संरक्षित शब्द है (अन्य तरीकों के आसपास;)) ... सुनिश्चित करें कि आपके कॉलम भी इस प्रकार की त्रुटि scdenario में विफल नहीं हैं ...


0
2018-03-31 07:40





निम्नलिखित के बाद इस मुद्दे का सबसे संभावित कारण है:

  1. या तो स्तंभ नाम या तालिका नाम में वर्तनी गलती
  2. पहले स्थापित कथन बंद नहीं है। तैयार कथन बनाने से पहले इसे बंद करें।

$stmt->close(); // <<<-----This fixed the issue for me

$stmt = $conn->prepare("Insert statement");

0
2018-05-01 19:10





कभी-कभी स्पष्ट रूप से आपके टेबल कॉलम नामों को बताते हुए (विशेष रूप से एक सम्मिलित क्वेरी में) मदद कर सकते हैं। उदाहरण के लिए, क्वेरी: INSERT INTO tableName(param1,param2,param3) VALUES(?,?,?) इसके विपरीत बेहतर काम कर सकते हैं:INSERT INTO tableName VALUES(?,?,?)


0
2018-05-20 17:32