mysqli_fetch_assoc () parametre / Çağrı bir üye işlevi için bind_param () hataları bekler. Gerçek mysql hatası nasıl alınır ve düzeltilir?


111

Yerel / geliştirme ortamımda, MySQLi sorgusu iyi çalışıyor. Ancak, bunu web barındırma ortamıma yüklediğimde şu hatayı alıyorum:

Ölümcül hata: ... içindeki nesne olmayan bir üye işlevine bind_param () çağırın ...

İşte kod:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

Sorgumu kontrol etmek için, sorguyu phpMyAdmin kontrol paneli aracılığıyla yürütmeyi denedim ve sonuç tamam.


$mysqliDeğişkeni nerede başlattığınızı görebilir miyiz ?
Rikesh

MySQL kullanıcınız bir SELECTsorgu yapma ayrıcalıklarından yoksun olabilir . Kontrol ettin mi
Amal Murali

Akla gelen, kullanılabilir mysqli olmadığı veya MySQL'e bağlanmak için yanlış kimlik bilgileri sağladığınızdır.
NB

Bu yazının gerçekten eski olduğunu biliyorum. Bir yorum ekleyeceğimi düşündüm. Tam olarak aynı hatayı aldım ve sorun, DB'deki bir alan adının yalnızca bir yazım hatasıydı. Bir kez düzelttikten sonra her şey çalıştı. Biraz aptalca ama her neyse.
Brian

Yanıtlar:


123

Bazen MySQLi kodunuz mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...veya benzeri bir hata üretir . Ya da hatasız olsa bile, sorgu aynı şekilde çalışmaz. Bu, sorgunuzun yürütülemediği anlamına gelir.

Bir sorgu her başarısız olduğunda, MySQL'in nedenini açıklayan bir hata mesajı vardır . Ne yazık ki, bu tür hatalar varsayılan olarak PHP'ye aktarılmaz ve sahip olduğunuz tek şey yukarıda bahsedilen şifreli bir hata mesajıdır. Bu nedenle, MySQL hatalarını size bildirmek için PHP ve MySQLi'yi yapılandırmak çok önemlidir. Hata mesajını aldığınızda, düzeltmek çocuk oyuncağı olacaktır.

MySQLi'de hata mesajı nasıl alınır?

Her şeyden önce, tüm ortamlarınızda MySQLi bağlanmadan önce her zaman bu satıra sahip olun:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Bundan sonra tüm MySQL hataları PHP istisnalarına aktarılacaktır. Yakalanmamış istisna, sırayla, PHP ölümcül hatası yapar. Bu nedenle, bir MySQL hatası durumunda, geleneksel bir PHP hatası alırsınız. Bu, anında hata nedeninin farkına varmanızı sağlayacaktır. Ve bir yığın izleme, sizi hatanın meydana geldiği tam noktaya götürecektir.

PHP'yi farklı ortamlarda yapılandırma

İşte PHP hata raporlama hakkındaki makalemin özü :
Bir geliştirme ve canlı sunuculardaki hataları bildirmek farklı olmalıdır. Bir geliştirme sunucusunda hataların ekranda gösterilmesi uygundur, ancak bunun yerine canlı bir sunucuda hata mesajlarının günlüğe kaydedilmesi gerekir, böylece bunları daha sonra hata günlüğünde bulabilirsiniz.

Bu nedenle, ilgili yapılandırma seçeneklerini aşağıdaki değerlere ayarlamalısınız:

  • Bir geliştirme sunucusunda

    • error_reportingE_ALLdeğere ayarlanmalıdır ;
    • log_errors 1 olarak ayarlanmalıdır (bir geliştirme bilgisayarında günlüklerin olması da uygundur)
    • display_errors 1 olarak ayarlanmalıdır
  • Bir üretim sunucusunda

    • error_reportingE_ALLdeğere ayarlanmalıdır ;
    • log_errors 1 olarak ayarlanmalıdır
    • display_errors 0 olarak ayarlanmalıdır

Aslında nasıl kullanılır?

Sadece herhangi kodunu kaldırmanızı elle hata olup olmadığını kontrol eder , tüm bu or die(), if ($result)ve bu tür. Veritabanı etkileşim kodunuzu hemen yazın:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

yine, etrafta herhangi bir koşul olmadan . Bir hata oluşursa, kodunuzdaki diğer herhangi bir hata olarak değerlendirilecektir. Örneğin, bir geliştirme bilgisayarında sadece ekranda görünecektir, canlı bir sitede ise bir programcı için oturum açılacaktır, oysa kullanıcının rahatlığı için bir hata işleyicisi kullanabilirsiniz (ancak bu konu dışı olan farklı bir hikaye MySQLi, ancak yukarıda bağlantısı verilen makalede okuyabilirsiniz).

Aldığınız hata mesajıyla ne yapmalısınız?

Öncelikle sorunlu sorguyu bulmanız gerekir. Hata mesajı , hatanın meydana geldiği tam noktanın dosya adını ve satır numarasını içerir. Yeterli basit kod için, ancak kodunuz işlevler veya sınıflar kullanıyorsa , sorun sorgusunu bulmak için yığın izlemeyi izlemeniz gerekebilir .

Hata mesajını aldıktan sonra onu okuyup anlamanız gerekir. Küçümseyici değilse de kulağa çok açık geliyor, ancak öğrenciler genellikle hata mesajının sadece bir alarm sinyali olmadığı, aslında sorunun ayrıntılı bir açıklamasını içerdiği gerçeğini gözden kaçırıyorlar . Ve ihtiyacınız olan tek şey hata mesajını okumak ve sorunu düzeltmektir.

  • Diyelim ki, belirli bir tablonun olmadığını söylüyorsa, yazımı, yazım hatalarını ve harf durumunu kontrol etmelisiniz. Ayrıca PHP betiğinizin doğru bir veritabanına bağlandığından emin olmalısınız.
  • Veya SQL sözdiziminde bir hata olduğunu söylüyorsa, SQL'inizi incelemelisiniz. Ve sorun nokta haklı önce sorgu parçası hata iletisinde gösterdi.

Hata mesajını anlamıyorsanız, Google'ı deneyin. Ve sonuçlara göz atarken , çözümü açıkça vermek yerine hatayı açıklayan yanıtlara bağlı kalın. Sizin durumunuzda bir çözüm işe yaramayabilir ancak açıklama, sorunu anlamanıza ve sorunu kendi başınıza çözmenize yardımcı olacaktır.

Ayrıca hata mesajına da güvenmelisiniz . O jeton sayısını bağlı değişkenlerin sayısını eşleşmiyor diyorsa o zaman olduğunu bu yüzden. Aynı şey eksik tablolar veya sütunlar için de geçerlidir. İster kendi hatanız olsun, ister hata mesajı yanlış olsun, her zaman öncekine bağlı kalın. Kulağa küçümseyici geliyor, ancak bu sitedeki yüzlerce soru bunun son derece yararlı olduğunu kanıtlıyor.

Hata raporlama konusunda asla yapmamanız gereken şeylerin bir listesi

  • Asla bir hata bastırma operatörü ( @) kullanmayın! Bir programcının hata mesajını okuyamamasına ve bu nedenle hatayı düzeltememesine neden olur
  • Kullanmayın die()veya echokoşulsuz ekranda hata mesajı yazdırmak veya başka bir fonksiyonu. PHP hataları kendi kendine rapor edebilir ve bunu ortama bağlı olarak doğru şekilde yapabilir - bu yüzden onu PHP'ye bırakın.
  • Sorgu sonucunu manuel olarak test etmek için bir koşul eklemeyin (gibi if($result)). Hata istisnaları etkinleştirildiğinde, bu tür bir durum işe yaramaz.
  • try..catchHata mesajını tekrarlamak için operatörü kullanmayın . Bu operatör, işlem geri alma gibi bazı hata işlemlerini gerçekleştirmek için kullanılmalıdır. Ancak bunu asla hataları bildirmek için kullanmayın - yukarıda öğrendiğimiz gibi, PHP bunu zaten doğru şekilde yapabilir.

Not:
Bazen hata yok ama sonuç da yok. O zaman , veritabanında kriterlerinize uyan hiçbir veri olmadığı anlamına gelir . Bu durumda, verilere ve kriterlere yemin etseniz bile, bu gerçeği kabul etmelisiniz. Onlar değil. Tekrar kontrol etmelisiniz. Bu konuda yardımcı olabilecek bir makalem var, Veritabanı etkileşimlerinde hata ayıklama . PDO için yazılmış olmasına rağmen, prensip aynıdır. Bu talimatı adım adım izleyin ve sorununuzu çözdürün veya Stack Overflow için yanıtlanabilir bir soru sorun.


@AdamWinter @ kullanmak her zaman yanlıştır ve bu özel durumda on kattır. Programınıza gönderilen hata mesajları, vücudunuz için bir acı ile aynıdır. Bacağın kırılmış gibi bir şeylerin ters gittiğini söylüyor. Ve sadece bir ağrı kesici alıp devam etmemelisiniz. BURADA AYNI. PHP size beklediğiniz değişken olmadığını söyler. Dolayısıyla, bu değişkeni kullanılabilir hale getirmek için formu veya her neyse onu düzeltmeniz gerekir. Bir hatayı önlemek için sadece bir kod yazmakla kalmayın.
Sizin Common Sense

Çoğunlukla, kabul ediyorum, ancak 'Ortak Aklınız' ile aynı fikirde değilim, "Bir hatayı aşmak için kod yazmakla kalmayın, bir denemenin ne yaptığını sanıyorsunuz ... yakalama, kod tabanının çıkmasını önlemek için hatayı atlatıyor Kontrolsüz bir şekilde, EG DB sunucusu kodunda düzeltemeyeceğiniz bazı hatalar ortadan kalktı, sadece hatayı yönetmeniz ve geçerli bir sonuç elde etmek için hatayı atlatmanız gerekir.
Barkermn01

@ Barkermn01 bu senin için uygun bir endişen ama bundan yanlış sonuçlar çıkarıyorsun. Elbette uygulamanız geçerli bir sonuç üretmelidir ("Mysql gitti" hatası durumunda genel bir 500 hata sayfası olmalıdır). Ancak, böyle geçerli bir sonucun veritabanı kodunuzla ilgili olmadığını anlamalısınız . Veritabanına ilişkin kodunuz bir veritabanıyla çalışmalıdır. Oysa hata sayfasının gösterilmesi farklı bir kodun endişesi olmalıdır. Buraya bakın: phpdelusions.net/articles/error_reporting
Sizin Common Sense

Bunun sadece 'Ama bunu sadece hataları bildirmek için asla kullanmayın' gibi şeyler olduğunu anlıyorum, bu tamamen nesnel kod tabanlarını engelliyor, EG MVC'm, eğer modellerim bir hatayla karşılaşırsa, hatayı halletmeleri gerekiyor ve sonra onu geri atmaları için denetleyicim model kullanımının sarmalandığı durumlarda hatayı ele alabilir ve hatayı gösterebilir, bu durumda, bir API kullanıyorum, bu nedenle hata ve tüm izleme bilgileri Uzak sistemimizden geliyorsa API çağrısı gönderilir (Kaynak Doğrulama ) bir çok web malzemesi olarak şimdi PHP arka ucu REACT veya Angular Front end
Barkermn01

@ Barkermn01 lütfen bağlantılı makaleyi tekrar okuyun. Her iki durumda da, bunun böyle bir tartışma için doğru yer olduğunu düşünmüyorum. Genel olarak hata raporlama ile ilgili bir sorunuz varsa, bunu ayrı bir soru olarak sormanız daha iyi olur. Şerefe.
Sizin Common Sense
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.