PHP / MYSQL – MySQLi准备语句 – 可以将bind_param用于ORDER BY吗? (订购结果集)

前端之家收集整理的这篇文章主要介绍了PHP / MYSQL – MySQLi准备语句 – 可以将bind_param用于ORDER BY吗? (订购结果集)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我看来,我有一个类似这样的查询
  1. $sort = isset($sort) ? sanitize($_sort) : 'id';
  2.  
  3. if ($result = $link->prepare("
  4. SELECT id,price
  5. FROM items
  6. ORDER BY ?
  7. "))
  8. {
  9. $result->bind_param("s",$sort);
  10. $result->execute();
  11. etc...
  12. }

当我运行此代码块而不设置排序变量时,它运行没有与使用?相关的错误?在ORDER BY子句中,结果集显示在带有“ORDER BY id”的结果集中.

这是一个问题:

现在,如果我将sort变量设置为“price ASC”之类的东西,我仍然会得到一个似乎是“ORDER BY id”而不是“ORDER BY price ASC”的结果集.

当我在PHPmyadmin中作为查询运行查询时,如果我以这种方式定义查询,它将根据“价格ASC”返回正确的结果集.

现在,如果我改变代码并像这样运行它:

  1. $sort = isset($sort) ? sanitize($_sort) : 'id';
  2.  
  3. if ($result = $link->prepare("
  4. SELECT id,price
  5. FROM items
  6. ORDER BY $sort
  7. "))
  8. {
  9. $result->execute();
  10. etc...
  11. }

它运行正常,结果集与我在PHPmyadmin中的查询相同…

有人可以告诉我这里究竟发生了什么,以及为什么查询不能像我最初使用bind_param那样运行.

在我看来,它应该工作,因为没有出现与此类使用相关的错误……但在实践中,它似乎不适用于ORDER BY子句.它几乎就像在运行bind_param时没有翻译sort变量一样.

感谢您阅读我的问题,任何有关它的输入将不胜感激!

编辑:

对任何感兴趣的人

  1. if (isset($sort))
  2. {
  3. $acceptableSortValues = array('name','price ASC','price DESC');
  4. $sort = sanitize($sort);
  5. if (!in_array($sort,$acceptableSortValues))
  6. {
  7. $sort = 'name';
  8. }
  9. }
  10. else
  11. {
  12. $sort = 'name';
  13. }
  14.  
  15. if ($result = $link->prepare("
  16. SELECT name,price
  17. FROM items
  18. ORDER BY $sort
  19. "))
  20. {
  21. $result->execute();
  22. etc...
  23. }
只有数据可以与占位符绑定.

列/表名称是架构的一部分,不能绑定. (它产生“奇怪的结果”而不是简单地产生错误的事实是实现的特殊性.)

我建议使用列名称和受控字符串插值的白名单.

猜你在找的PHP相关文章