PHP / MySQL的 - 库MySQLi预处理语句 - 可以使用bind_param的ORDE

2019-05-12 07:46发布

在我心目中,我有一个查询是这样的:

$sort = isset($sort) ? sanitize($_sort) : 'id';

if ($result = $link->prepare("
    SELECT id, price
    FROM items
    ORDER BY ?
"))
{
    $result->bind_param("s", $sort);
    $result->execute();
    etc...
}

当我运行没有设置它运行排序变量不与使用的错误这个代码块? 在ORDER BY子句和结果集显示这似乎是一个结果集与“ORDER BY ID”。

这里是IN ONE森泰斯问题:

现在,如果我设置排序变量类似“价格ASC”我仍然得到一个结果集,这似乎是“ORDER BY ID”,而不是“按价格排序ASC”。

当我运行查询作为在phpMyAdmin查询,它返回一个基于“价格ASC”正确的结果集,如果我定义查询的方式。

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

$sort = isset($sort) ? sanitize($_sort) : 'id';

if ($result = $link->prepare("
    SELECT id, price
    FROM items
    ORDER BY $sort
"))
{
    $result->execute();
    etc...
}

它运行正常,用的结果集是一样的我在phpMyAdmin查询...

可能有人请赐教,究竟是怎么回事,为什么查询不运行,因为我使用bind_param最初打算。

在我看来,它应该工作,因为没有错误出现与这种使用......但在实践中它似乎没有一个ORDER BY子句中使用。 它几乎就像它在运行bind_param没有翻译的那种变量。

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

编辑:

任何有兴趣 -

if (isset($sort))
{
    $acceptableSortValues = array('name', 'price ASC', 'price DESC');
    $sort = sanitize($sort);
    if (!in_array($sort, $acceptableSortValues))
    {
        $sort = 'name';
    }   
}
else
{
    $sort = 'name';
}

if ($result = $link->prepare("
    SELECT name, price
    FROM items
    ORDER BY $sort
"))
{
    $result->execute();
    etc...
}

Answer 1:

只有数据可与占位符绑定。

列/表名是模式的一部分, 不能约束 。 (它产生“奇怪的结果”,而不是简单地产生一个错误的事实是实施的一个特性)。

我会建议使用列名的白名单和可控串插。



文章来源: PHP/MYSQL - MySQLi Prepared Statements - Possible to use bind_param for ORDER BY? (ordering a result set)