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

Mar 26 2014

Yerel / geliştirme ortamımda, MySQLi sorgusu iyi çalışıyor. Ancak, 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.

Yanıtlar

131 YourCommonSense Mar 26 2014 at 20:32

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 belirtilen ş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 bu satırı her zaman bulundurun :

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 bir hata 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 oluştuğu noktaya götürecektir.

PHP'yi farklı ortamlarda yapılandırma

İşte PHP hata raporlaması 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 yalnızca ekranda görünecek, canlı bir sitede bir programcı için günlüğe kaydedilecek, 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 olan basit kod için, ancak kodunuz işlevler veya sınıflar kullanıyorsa , sorun sorgusunu bulmak için yığın izini 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 dolayısıyla 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 koşullar işe yaramaz.
  • try..catchHata mesajını tekrarlamak için operatörü kullanmayın . Bu operatör, işlemin geri alınması 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.