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
Libérer: 2024-12-27 01:39:09
original
948 Les gens l'ont consulté

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";
Copier après la connexion
  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]);
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal