Maison >développement back-end >tutoriel php >Pourquoi ne puis-je pas utiliser les paramètres PDO dans la clause ORDER BY de mon instruction SQL ?

Pourquoi ne puis-je pas utiliser les paramètres PDO dans la clause ORDER BY de mon instruction SQL ?

DDD
DDDoriginal
2024-12-27 01:39:09943parcourir

Why Can't I Use PDO Parameters in the ORDER BY Clause of My SQL Statement?

ORDER BY Params dans les instructions PDO

Vous rencontrez des difficultés à utiliser les paramètres dans la clause ORDER BY de votre instruction SQL. Les paramètres :order et :direction ne produisent aucun résultat.

Cause du problème

Les paramètres PDO ne peuvent pas être utilisés directement dans la clause ORDER BY. Il doit s'agir de chaînes statiques.

Solution

Il n'y a pas de constantes PDO pour les noms de colonnes ou les instructions de tri. Par conséquent, vous devez insérer ces valeurs directement dans l'instruction SQL. Cependant, il est crucial de prendre des précautions :

  1. Codez en dur chaque opérateur et identifiant dans votre script.
$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";
  1. Utiliser un assistant de liste blanche fonction :
$order = white_list($order, ["name", "price", "qty"], "Invalid field name");
$direction = white_list($direction, ["ASC", "DESC"], "Invalid ORDER BY direction");

$sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction";
$stmt = $db->prepare($sql);
$stmt->execute([$is_live]);

Explication

La fonction de liste blanche vérifie la valeur et génère une erreur si elle est incorrecte, atténuant ainsi le risque de SQL attaques par injection.

Exemple

$sql = "SELECT field from table WHERE column = :my_param";

$stmt = $db->prepare($sql);
$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();

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn