Bir sorgunun SELECT bölüme parametreleri bağlamak için hazırlanmış mysqli ifadeleri kullanarak

2 Cevap php

Ben veri ithalat verileri PHP / MySQL besleyen bir web uygulaması inşa ediyorum. Ben bir tampon / geçici tutma tabloya veri alma. Her veri formatı farklı olduğu gibi, belirli bir kaynaktan dayalı seçmek için sütun seçin.

Ben bu bağlamda çalışmak için bu sorguyu alıyorum sorun yaşıyorum:

$stmt = $this->dbObj->prepare("SELECT mk.PK_phone_maker, b.?, b.phoneDescription
            b.thumbPic,
        FROM buffer_table b left join mobile_phone pm on b.? = pm.phoneModel
            LEFT JOIN phone_maker mk on mk.CompanyName = b.?
        WHERE pm.phoneModel is null
        group by b.?");
$stmt->bind_param('ssss',$phoneModelField, $phoneModelField, $phnMakerField,$phoneModelField);
$stmt->execute();

Ben hata msg ararken:

Fatal error: Call to a member function bind_param() on a non-object

Bu, hat anlamına gelir:

 $stmt->bind_param('ssss',$phoneModelField, $phoneModelField, 

Ve ben benim sql "hazırlamak" $ stmt olarak görev değil, çünkü bu bir nesne değil varsayalım

Bu nedenle de sütunları seçin ve alanları katılmak için parametreleri bağlamak değil bana görünür, sadece burada yan tümcesi bağlayabilirsiniz. Birazdan bu iddianın muyum veya bir şey eksik?

2 Cevap

Hazırlanan tablolar sadece böyle fields, tables veya functions, SQL, tek başına bütün bitlerini izin gibi values, diğer yapıları (bağlamaya izin ) izin verilmez.

@ Victor Nicollet doğru - sadece bir literal value kullanılmış olabilir bağlamında bir sorgu parametresini kullanabilirsiniz.

Eğer sorgu değişkeni (örneğin, sütun adı, tablo adı, SQL anahtar kelime veya tüm SQL ifadeleri) diğer parçaları yapmak gerekirse, bir dize olarak dinamik bir SQL sorgusu oluşturmak ve dizeye PHP değişkenleri veya ifadeleri katmak gerekir. SQL enjeksiyon açıklarını önlemek için dikkatli bir şekilde bunu yapmak için emin olun.

Kodunuzu diğer WTF prepare() function türü bir nesne döndürdü kontrol etmedi ki mysqli_stmt. Geçersiz bir şekilde sorgu parametreleri kullanılır, çünkü bu durumda, prepare() false, bir sözdizimi hatası göstermek için döndü. Tabii false bir nesne değildir; Bir bind_param() yöntemi yok. Sen yaptın hata var bu yüzden.