Soru Önemli hata: boolean'daki bir üye işlevine bind_param () çağırın.


Bir DB'den ayarları alan bir işlevle meşgulüm ve aniden bu hatayı yaşadım:

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

Normalde bu, var olmayan tablolardan ve materyallerden bir şeyler seçmem anlamına gelir. Ama bu durumda, ben değilim ...

Burada getSetting fonksiyon:

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 değişken bir kurucudan geçirilir. İhtiyaç halinde, işte burada:

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

Ayrıca, bir veritabanından yararlandığım için veritabanı bağlantım:

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

Bağlantıyı zaten test ettim,% 100 olumlu olduğu gibi çalışıyor. DB bağlantı şeylerini bir yapılandırma dosyasında ayarlıyorum:

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

Şimdi tuhaf olan şey; tablo var, istenen ayar var, DB var, ancak yine de, bu hata bırakmayacak. İşte DB'nin doğru olduğuna dair bir kanıt:

IMG


44
2017-12-10 06:39


Menşei




Cevaplar:


Sorun şu:

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

prepare() yöntem geri dönebilir false ve bunun için kontrol etmelisin. Neden döndüğüne gelince falsebelki de tablo adı veya sütun isimleri SELECT veya WHERE yan tümce) doğru değil mi?

Ayrıca, gibi bir şey kullanmayı düşünün $this->db->conn->error_list SQL ayrıştırma gerçekleşen hataları incelemek için. (Bazen gerçek SQL deyim dizelerini yankılanır ve test etmek için phpMyAdmin'e yapıştıracağım, ama kesinlikle orada başarısız olan bir şey var.)


85
2017-12-10 06:43



Neden aramayı önerirsin $query->error_listBir hata görüntülendiğinde, hazırlama yöntemleri false (ve böylece $ query yanlış olur?) verirse? - Adam
@Adam bir nokta var. çağrı $query->error_list bind_param veya bir yürütme başarısız olursa, mantıklı $query yanlış ise o zaman aramalıdır error veya error_list üzerinde mysqli nesne, yani $this->db->conn->error_list. - RobP


Ne zaman istersen ...

"Önemli hata: boolean'da bir üye işlevine bind_param () çağırın"

... büyük olasılıkla sorgunuzda bir sorun var. prepare() dönebilir FALSE (bir Boolean), ama bu genel başarısızlık mesajı ipuçlarından çok fazla ayrılmıyor. Sorgunuzda neyin yanlış olduğunu nasıl anlıyorsunuz? Sen Sor!

Her şeyden önce, hata raporlamanın açık ve görünür olduğundan emin olun: bu iki satırı, açılışınızdan hemen sonra dosyalarınızın üstüne ekleyin. <?php etiket:

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

Hata bildiriminiz php.ini içinde ayarlanmışsa, bunun için endişelenmenize gerek kalmayacaktır. Sorunları hassas bir şekilde ele aldığınızdan ve kullanıcılarınızdaki sorunların gerçek nedenini asla göstermediğinizden emin olun. Gerçek nedeni kamuya açıklamak, sitelerinize ve sunucularınıza zarar vermek isteyenler için bir altın oyulmuş davetiye olabilir. Tarayıcıya hata göndermek istemiyorsanız, web sunucusu hata kayıtlarınızı her zaman izleyebilirsin. Günlük yerleri sunucudan sunucuya değişir, örneğin Ubuntu'da hata günlüğü genellikle /var/log/apache2/error.log. Linux ortamında hata günlüklerini inceliyorsanız tail -f /path/to/log Bir konsol penceresinde gerçek zamanlı olarak ortaya çıkan hataları görmek için .... veya bunları yaparken.

Standart hata raporlamasından sonra, veritabanı bağlantınızda hata denetimi ekleyerek sorgular ve sorgular, devam eden sorunlar hakkında size çok daha fazla ayrıntı verecektir. Sütun adının yanlış olduğu bu örneğe bakın. İlk olarak, genel ölümcül hata iletisini veren kod:

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

Hata genel ve neler olup bittiğini çözmek için çok yararlı değildir.

Birkaç kod satırıyla, sorunu çözmek için kullanabileceğiniz çok ayrıntılı bilgiler alabilirsiniz. hemen. Kontrol edin prepare() doğruluk beyanı ve eğer iyi ise bağlayıcı ve yürütmeye devam edebilirsiniz.

$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'
}

Bir şey yanlışsa, sizi doğrudan konuya yönlendiren bir hata mesajı çıkartabilirsiniz. Bu durumda hayır yok foo Tablodaki sütun, problemin çözülmesi önemsizdir.

Seçerseniz, bu denetimi bir işlev veya sınıfa dahil edebilir ve hataları daha önce belirtildiği gibi inceleyerek genişletebilirsiniz.


16
2017-08-05 21:01



Hata raporlama ile ilgili öneriler için çok iyi bir cevap. Hata raporlama devre dışı bırakılması ile programlama, gözleri kapalı olan satranç oynamak gibidir. İnsanlar ayrıca bir hata ayıklayıcısını nasıl kullanacaklarını bilmiyorlar (hatta mevcut). - Dawid Ferenczy


prepare bir booleanı yalnızca bu nedenle başarısız olduğunda döndür FALSE, olup olmadığını kontrol etmek için hatayı önlemek için True önce yürütmeden önce:

$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





Sorgu sözdizimi doğru olduğunda bile, HAZIRLAMA Bir önceki ifade olsaydı ve kapatılmadığı taktirde yanlış olabilirdi. Her zaman önceki ifadenizi

$statement->close();

Sözdizimi doğruysa, aşağıdaki sorgu da iyi çalışır.


6
2018-05-24 08:08



Bu cevap bana yardımcı oldu. - Amine


Bu soruna neden olabilecek başka bir durum, sorgularınızda yanlış dökümdür.

Bilindiği belli olabileceğini biliyorum, ama bunu kullanarak içine girdim tablename yerine Tablename. Sorgularınızı kontrol edin ve tablonuzdaki sütunların gerçek isimleriyle aynı durumu kullandığınızdan emin olun.


1
2017-09-22 12:04





Bazen, aynı zamanda bir yanlış masa ad veya sütun adı  hazırlık ifadesinde.

Bunu gör:

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


0
2018-02-17 11:40





Her zaman ifadelerinizi bir try catch bloğuna koymak için her zaman mümkün olduğunca denemelisiniz ... her zaman bu gibi durumlarda yardımcı olur ve neyin yanlış olduğunu size bildirir. Belki de tablo adı veya sütun adı yanlış.


0
2018-03-27 14:49