我正在构建一个从php / mysql中的数据源导入数据的Web应用程序。我将数据导入缓冲区/临时保存表。由于每种数据格式不同,我根据特定来源选择要选择的列。
我无法在此上下文中使用此查询:
$stmt = $this->dbObj->prepare("SELECT mk.PK_phone_maker, b.?, b.phoneDescription
b.thumbPic,
FROM buffer_table b left join mobile_phone pm on b.? = pm.phoneModel
LEFT JOIN phone_maker mk on mk.CompanyName = b.?
WHERE pm.phoneModel is null
group by b.?");
$stmt->bind_param('ssss',$phoneModelField, $phoneModelField, $phnMakerField,$phoneModelField);
$stmt->execute();
我收到错误消息:
Fatal error: Call to a member function bind_param() on a non-object
这是指行:
$stmt->bind_param('ssss',$phoneModelField, $phoneModelField,
我认为这是因为我的sql上的“准备”没有工作,因为$ stmt不是一个对象
因此在我看来,您无法绑定参数以选择列和连接字段,您只能绑定到where子句。我在这个断言中是对的还是我错过了什么?
答案 0 :(得分:1)
预准备语句只允许您绑定值,其他构造(例如字段,表或函数 ,更不用说整个SQL的部分了。
答案 1 :(得分:0)
@Victor Nicollet是正确的 - 您只能在可以使用文字值的上下文中使用查询参数。
如果需要创建查询变量的其他部分(例如列名,表名,SQL关键字或整个SQL表达式),则需要构建一个动态SQL查询作为字符串,并将PHP变量或表达式插入到字符串。请务必小心谨慎,以避免SQL注入漏洞。
代码中的另一个WTF是您没有检查prepare()
函数是否返回了mysqli_stmt
类型的对象。在这种情况下,由于您以无效方式使用查询参数,prepare()
返回 false 以指示语法错误。当然 false 不是一个对象;它没有bind_param()
方法。这就是你得到错误的原因。