首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Mysqli选择?(bind_param)

Mysqli选择?(bind_param)
EN

Stack Overflow用户
提问于 2014-07-11 01:08:32
回答 2查看 903关注 0票数 1

我试图在依赖于变量$garment的列中查询数据。查询可以工作,直到我尝试绑定参数$garment。知道我做错什么了吗?

谢谢!

代码语言:javascript
代码运行次数:0
运行
复制
//THIS WORKS
if ($stmt = mysqli_prepare($mysqli, "SELECT $garment FROM user WHERE uid=?")) {
mysqli_stmt_bind_param($stmt, "i", $uid);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $total);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}

//DOESN'T WORK - $total returns the value of $garment
if ($stmt = mysqli_prepare($mysqli, "SELECT ? FROM user WHERE uid=?")) {
mysqli_stmt_bind_param($stmt, "si", $garment, $uid);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $total);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-11 01:11:37

这是因为使用准备好的语句,您只能构建(而不是标识符)。就这样

代码语言:javascript
代码运行次数:0
运行
复制
SELECT ? 

变成了

代码语言:javascript
代码运行次数:0
运行
复制
SELECT 'somevalue'

第一段代码是正确的,但是为了安全起见,您必须确保$garment变量值是白色的。

票数 0
EN

Stack Overflow用户

发布于 2014-07-11 01:12:46

不能为列名使用标记。因此,您必须指定实际的列名w/o标记。

来自正式php文档

这些标记仅在SQL语句中的某些位置是合法的。例如,在INSERT语句的VALUES()列表中(为一行指定列值)或与WHERE子句中的列进行比较时允许使用它们来指定比较值。 但是,在select语句要返回的列的SELECT列表中,它们不允许用于标识符(例如表或列名),也不允许指定二进制运算符的两个操作数,例如=相等号。后一种限制是必要的,因为不可能确定参数类型。通常,参数仅在数据操作语言(DML)语句中是合法的,而在数据定义语言(DDL)语句中是不合法的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24688712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档