php - query - ¿Cómo configuro ORDER BY params usando una declaración PDO preparada?




php pdo execute (6)

Aquí viene la pregunta que muestra que las declaraciones preparadas ampliamente amadas no son la bala de plata, jeje :)

Sí, estás atrapado insertándolo directamente en el SQL. Con algunas precauciones, por supuesto. Cada operador / identificador debe estar codificado en su script, así:

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

Lo mismo para la dirección.

Tenga en cuenta que bindParam no escapa, ya que no se necesita ningún escape. lo hace vinculante.

Tengo problemas al usar params en la sección ORDER BY de mi SQL. No emite advertencias, pero no imprime nada.

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

El :my_param funciona, pero no :order or :direction . ¿No se está escapando internamente correctamente? ¿Estoy atascado insertándolo directamente en el SQL? Al igual que:

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

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

¿Hay una constante PDO::PARAM_COLUMN_NAME o algún equivalente?

¡Gracias!


Crea una condición if-else.
If (ascCondion) luego une los valores pero el código duro ORDER BY columnName ASC
Más
Enlace los valores pero el código duro ORDER BY COlumnName DESC


Es posible Puede usar el número en lugar del nombre del campo en la cláusula 'ordenar por'. Este es un número que comienza en 1 y está en el orden de los nombres de campo en la consulta. Y puede concatenar una cadena para ASC o DESC. Por ejemplo, "Seleccione col1, col2, col3 de tab1 ordenar por?" + StrDesc + "límite 10,5". strDesc = "ASC" / "DESC".


No creo que pueda obtener ASC / DESC como parte de la declaración preparada, pero la columna puede hacerlo.

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

Como ASC / DESC solo tiene dos valores posibles, puede validar y seleccionar fácilmente entre ellos como valores codificados.

También puede hacer uso de las funciones ELT (FIELD (,,,,,) ,,,,,) para esto, pero luego el orden siempre se hará como una cadena, incluso si se trata de una columna numérica.


Si no estoy del todo equivocado, Pascal tiene razón.
El único enlace posible en PDO es el enlace de valores, como lo hizo con el parámetro ': my_param'.
Sin embargo, no hay daño hecho en:

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

Lo único que debe tener en cuenta sería el correcto escape de $order y $direction , pero como los configuró manualmente y no los configuró a través de la entrada del usuario, creo que ya está listo.


Es posible usar sentencias preparadas en la cláusula ORDER BY , lamentablemente necesita pasar el orden de la columna en lugar del nombre y se requiere establecer PDO_PARAM_INT con tipo.

En MySQL puede obtener el orden de las columnas con esta consulta:

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

Código PHP:

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






pdo