PHP MySQLi准备语句 - SELECT

4

我在SELECT语法方面遇到了问题。

代码:

$stmt = $this->con->prepare("SELECT ? FROM `shop_items` WHERE `id` = ?");

$stmt->bind_param("si", $what, $itemsId);

$stmt->execute();

$stmt->bind_result($res);

$stmt->fetch();

echo $res;

当我想选择“name”时,它会回显“name”,而不是来自数据库的结果。如何解决?

1
不能这样做 => SELECT ? - Funk Forty Niner
在查询中,您不能使用占位符来代替字段名。 - gen_Eric
2个回答

5

在预处理语句中,占位符?仅能用于替换值,不能用于字段名、表名或语句。

您正在尝试将其用于字段名。

您可以构建查询字符串。

$stmt = $this->con->prepare("SELECT " . $what . " FROM `shop_items` WHERE `id` = ?");

但是你必须确信你可以信任$what里面的内容,以避免 SQL 注入。

否则,你可能会得到所有字段。

$stmt = $this->con->prepare("SELECT * FROM `shop_items` WHERE `id` = ?");

将结果以关联数组的形式获取(请参见http://it1.php.net/manual/en/mysqli-result.fetch-assoc.php),然后仅获取由$what指向的字段值。


2

看起来你在SELECT之后使用了问号(?)符号。正确的是使用星号(*)符号,这样可以从“shop_items”表中选择所有内容。你可以尝试使用正确的语法再次执行查询。


1
@GigaWatt:你不能使用 ? 作为字段名。 - gen_Eric
@GigaWatt 不要放在 SELECT 之后。 - War10ck
应该使用 * 符号,这样你就可以从 'shop_items' 中选择所有内容。或者选择实际的列名。 - Funk Forty Niner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接