除非在“WHERE”之后插入,否则预准备语句中的MySQLi绑定参数不起作用

时间:2013-08-12 18:57:58

标签: php sql mysqli prepared-statement

我有一些从数据库中提取信息的PHP代码。它使用一个准备好的语句,如下所示工作正常:

<?php

$n = '5';

if ($stmt = $connection->prepare("SELECT Title FROM Items WHERE ID = ?"))
{
    $stmt->bind_param("s", $n);
    $stmt->execute();
    $stmt->bind_result($title);
    while ($stmt->fetch())
    {
        echo $title;
    }
    $stmt->close();
}
?>

让我们说这将回应“蝙蝠侠”。

但是,当我将占位符移动到此处时:

"SELECT ? FROM Items WHERE ID = 5"

并改变:

$n = 'Title';

它没有回应“蝙蝠侠”,而是回应“标题”。是否无法将占位符用作SELECT参数?

2 个答案:

答案 0 :(得分:2)

你做的是:

SELECT "Title" FROM Items WHERE ID = 5

您不能将准备好的语句绑定用于标识符,仅用于参数。

答案 1 :(得分:0)

是的,它就是这样的。
为数据准备的语句,而不是任意查询部分。

因此,您不能将占位符用于具有原始mysqli的标识符。但是,您可以使用safemysql

执行此操作
$field = $db->getOne("SELECT ?n FROM Items WHERE ID = 5", 'Title');

但如果您确实需要动态选择一个特定字段,那么您的设计就会出现问题。