Mysqli parametre bağlama sorunu

3 Cevap php

Ben bu bir ilave gözler dizi gerekir. Herhangi bir yardım büyük takdir edilecektir. Bu çok basit bir arama sorgusu, ama ne sebeple olursa olsun ben hata bulamıyorum. Hata nerede olduğunu iyi biliyorum. Ben sadece geçmiş alınamıyor. Her neyse .....

Ben, bir POST değişkeni bir arama değeri alarak bu değişken ayar ve aşağıdaki gibi bir sütun değişken kuruyorum ...

$term = "'%".$_POST['searchTerm']."%'";
$field = "columnName";

Ben bu yankı zaman onlar mükemmel bir şekilde geliyor. Yani "a" şeklinde Ben '% a%' yankılanan olacağını ve columnname yazarsanız.

Sonra sorgu hazırlamak ve parametreleri aşağıdaki gibi bağlamak ...

$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");
$suquery->bind_param('ss', $field, $term);
$suquery->execute();

Sonuç her zaman 0 satır döndürür. Ben bu ile oynamak gibi bulma yaşıyorum ilişkili parametre ne olması gerektiği gibi yankıları olsa bile düzgün çalışıyor olmasıdır. Örneğin, kolon sabit kodlanmış ve sadece arama terimi bağlamak böylece ben sorguyu değiştirmek ....

$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();

Hala sıfır döndürülen satırları olsun. Bu $ alan olarak '% a%' yankıları olsa bir şey hala kapalı olduğunu söyler. Ben gerçekten birinde bir kayıp am. Aynı şekilde, ben zor arama terimi bağlanmalı ve sütun bağladığınızda ....

$suquery=$dbCon->prepare("select * from Table where ? LIKE '%a%'");
$suquery->bind_param('s', $field);
$suquery->execute();

Ben çok fazla satır döndü olsun. Aslında herhangi bir sütunundaki değer "a" harfi içeren tablodan satır çekiyor. Yani, ne sütun veya vadeli doğru bağlayıcıdır. Mayday!

3 Cevap

$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");

Beklendiği gibi çalışmaz. : O olarak tercüme alacak

SELECT * from table WHERE 'columnName' LIKE '%a%'

hangi 'columnName' bir 'a' içerdiğinden tüm satırları döndürür. 'ColumnName' bir dize değil, gerçek bir sütun adıdır.

Eğer vadede fazladan tırnak dışında ikinci bir girişim, doğru. Parametreleri kullanırken, herhangi bir tırnak gerekmez. Çözüm:

$term = "%".$_POST['searchTerm']."%";
$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();

EDIT: Orijinal Cevap (yerine mysqli'nin PDO'yu varsayılır) yanlış bir varsayıma dayanmaktadır. Buna göre cevap değişti.

Sütun adları için parametre değiştirme kullanmak için izin verilmez gibi görünüyor. mysqli::prepare belgeleri:

Note: The markers are legal only in certain places in SQL statements. For example, they are allowed in the VALUES() list of an INSERT statement (to specify column values for a row), or in a comparison with a column in a WHERE clause to specify a comparison value. However, they are not allowed for identifiers (such as table or column names), in the select list that names the columns to be returned by a SELECT statement, or ...

Sen sorguda sütun / alan adını hardcoding ve sadece parametre üzerinden karşılaştırma değerini değiştirerek bu doğrulamak isteyebilirsiniz ...

Sadece bu karşısında tökezleyerek herkes için açıklığa kavuşturmak. Konu oldukça basit ama onu aşağı izleme ayı olduğunu yeterince tuhaftı. Henrik kısmen doğru idi. Benim GİBİ açıklamada kullanmak için değişken $ terimini ayrıştırma zaman aşağıdaki yapıyordu:

$term = "'%".$_POST['searchterm']."%'";

Henrik benim değişken paranteze tek tırnak gerekmez gerektiğine dikkat çekti. Biri sadece hazırlanması ve sorgu olarak yürütülürken, bu doğrudur:

$query=$connection->prepare("select * from DATABASE where $field like '$term'");
$query->execute();

Bu gayet güzel çalışıyor. Ancak, ben aslında gerçekten deyimi kendisi bu gibi bakmak için arama terimi gerektiren tek tırnak gerek yoktu anlamına ciltli bir parametre olarak $ terimini kullanarak edildi: 'vadeli%%'. Bu tek tırnak gerektirir. Eğer bağlı parametre için soru işareti yer tutucu etrafında tek tırnak koymak için çalışırsanız, bir sözdizimi hatası alırsınız ve size bağlı parametre olarak kullandığınız değişkeni içinde tek tırnak koymak yoksa sonuç her zaman olacaktır 0 Bulunan satırlar. Yani, kısacası, herkesten bu karşılaşma için .... sen select deyimi doğrudan koyun gibi doğrudan tek tırnak için gerek sorgu göndererek eğer. Eğer bağlı parametreleri kullanıyorsanız, düzgün çalışması için sorgu için sırayla değişken bir parçası olarak tek tırnak olması gerekir.