it-swarm.com.de

Wie kann ich ORDER BY-Parameter mit der vorbereiteten PDO-Anweisung einstellen?

Ich habe Probleme bei der Verwendung von Params im ORDER BY-Abschnitt meiner SQL. Es gibt keine Warnungen aus, druckt aber nichts aus. 

$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();

Der :my_param funktioniert, aber nicht :order oder :direction. Wird es nicht intern korrekt entkommen? Hänge ich es direkt in die SQL ein? So wie:

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

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

Gibt es eine PDO::PARAM_COLUMN_NAME-Konstante oder ein Äquivalent?

Vielen Dank!

29
Marlorn

Hier stellt sich die Frage, dass weithin beliebte vorbereitete Aussagen nicht die Silberkugel sind, hehe :)

Ja, Sie stecken fest und fügen es direkt in die SQL ein. Mit gewissen Vorsichtsmaßnahmen natürlich. Jeder Operator/Identifier muss fest codiert sein in Ihrem Skript wie folgt:

$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";

Gleiche Richtung.

Beachten Sie, dass bindParam keine Escapezeichen ausführt, da überhaupt keine Escapezeichen benötigt werden. es bindet.

46

Ich glaube nicht, dass du das kannst:

  • Verwenden Sie Platzhalter in einer order by-Klausel
  • Spaltennamen binden: Sie können nur Werte oder Variablen binden und deren Wert in die vorbereitete Anweisung einfügen.
12
Pascal MARTIN

Es ist möglich Verwenden Sie vorbereitete Anweisungen in der ORDER BY-Klausel, leider müssen Sie die Reihenfolge der Spalte insted des Namens übergeben und müssen mit PDO_PARAM_INT den Typ angeben.

In MySQL können Sie die Reihenfolge der Spalten mit dieser Abfrage ermitteln:

SELECT column_name, ordinal_position FROM information_schema.columns 
WHERE table_name = 'table' and table_schema = 'database'

PHP-Code:

$order = 2;

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

Ich glaube nicht, dass Sie ASC/DESC als Teil der vorbereiteten Anweisung erhalten können, sondern die Spalte, die Sie können.

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

Da es sich bei ASC/DESC nur um zwei mögliche Werte handelt, können Sie diese als hartcodierte Werte einfach überprüfen und auswählen.

Sie können auch die ELT-Funktion (FIELD (,) ,) verwenden. Die Reihenfolge wird jedoch immer als Zeichenfolge ausgeführt, auch wenn es sich um eine numerische Spalte handelt.

4
goat

Es ist möglich. Sie können number anstelle des Feldnamens in der 'order by'-Klausel verwenden. Dies ist eine Zahl, die bei 1 beginnt und in der Reihenfolge der Feldnamen in der Abfrage steht. Und Sie können einen String für ASC oder DESC verketten. Zum Beispiel "Wählen Sie col1, col2, col3 aus tab1 um:" + strDesc + "limit 10,5" . StrDesc = "ASC"/"DESC". 

0
bithom

Ich schätze, Sie konnten es leider nicht mit vorbereiteten Anweisungen schaffen. Dies würde es nicht zwischenspeichern, da verschiedene Spalten Werte enthalten können, die mit speziellen Sortierstrategien sortiert werden könnten.

Erstellen Sie eine Abfrage mit Standard-Escape-Anweisungen und führen Sie sie direkt aus.

0
cavila