Nasıl hazırlanmış PDO deyimi kullanarak params ORDER BY ayarlarım?

5 Cevap php

Benim SQL ORDER BY bölümünde params'ı kullanırken sorun yaşıyorum. Herhangi bir uyarı verecek, ama hiçbir şey yazdırır değildir.

$order = 'columnName';
$direction = 'ASC';

$stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY :order :direction");
$stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR);
$stmt->bindParam(':order', $order, PDO::PARAM_STR);
$stmt->bindParam(':direction', $direction, PDO::PARAM_STR);
$stmt->execute();

:my_param çalışır, ancak :order ya da :direction. Bu dahili doğru kaçtı ediliyor değil mi? Ben SQL doğrudan takarak şaşırıp? Şöyle:

$order = 'columnName';
$direction = 'ASC';

$stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");

Bir PDO::PARAM_COLUMN_NAME sabit veya bazı eşdeğer var mı?

Teşekkürler!

5 Cevap

Burada hehe, yaygın hazırlanmış deyimleri sevilen soru gösterileri gümüş kurşun değil geliyor :)

Yes, you're stuck inserting it directly in the SQL With some precautions, of course. Every operator/identifier must be hardcoded in your script, like this:

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$order=$orders[$key];
$query="SELECT * from table WHERE is_live = :is_live ORDER BY $order";

Yön için aynı.

Hayır hiç gerekli öncelenimin gibi bindParam, hiçbir kaçışa yapar unutmayın. Bu bağlama yok.

Yapabileceğini sanmıyorum:

  • Bir order by maddesinde yer tutucuları kullanın
  • Bind sütun adları: Yalnızca değerleri bağlamak olabilir - ya da değişkenleri ve bunların değeri hazırlanan açıklamada enjekte var.

Ben hazır deyimi bir parçası olarak ASC / DESC alabilirsiniz sanmıyorum, ama sütun yapabilirsiniz.

 order 
    by 
       case :order
           when 'colFoo' then colFoo
           when 'colBar' then colBar
           else colDefault
       end
       $direction

ASC / DESC yalnızca iki olası değerler olduğundan, kolayca doğrulamak ve aralarında olarak kodlanmış değerleri seçebilirsiniz.

Bunu sayısal bir sütun bile olsa, ayrıca ELT (FIELD (,,,,,),,,,,) bu fonksiyonlar faydalanmak olabilir, ama sonra her zaman bir dize olarak yapılacaktır SİPARİŞİ.

Unfortunely I guess you could not make it with prepared statements. It would make it no cacheable since different columns may have values that could be sorted with special sorting strategies.

Standart kaçar kullanarak sorgu oluşturma ve doğrudan çalıştırmak.

If I'm not entirely mistaken, Pascal is right.
The only binding possible in PDO is the binding of values, as you did with the ':my_param' parameter.
However, there's no harm done in:

$stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY ".$order ." ".$direction);
$stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR);
$stmt->execute();

Haber almak için tek şey $order ve $direction doğru kaçışa olurdu, ancak bunları elle ayarlamak ve kullanıcı girişi aracılığıyla bunları set vermedi beri, Bence sen Tüm set.