我在使用参数时遇到问题ORDER BY
我的 SQL 部分。它不发出任何警告,但不打印任何内容。
$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();
The :my_param
有效,但没有:order
or :direction
。是不是没有正确地进行内部转义?我是否直接将其插入 SQL 中?就像这样:
$order = 'columnName';
$direction = 'ASC';
$stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");
有没有PDO::PARAM_COLUMN_NAME
常数或等价物?
Thanks!
是的,您只能将其直接插入 SQL 中。当然,要采取一些预防措施。每个运算符/标识符都必须进行硬编码在你的脚本中,像这样:
$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";
方向也一样。
我写了一个白名单辅助函数 https://phpdelusions.net/pdo_examples/order_by在这种情况下使用,它大大减少了需要编写的代码量:
$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]);
这里的想法是检查该值并在不正确的情况下引发错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)