使用准备好的mysqli语句将参数绑定到查询的SELECT部分

时间:2010-01-26 10:44:40

标签: php mysqli prepared-statement

我正在构建一个从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子句。我在这个断言中是对的还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

预准备语句只允许您绑定,其他构造(例如字段函数 ,更不用说整个SQL的部分了。

答案 1 :(得分:0)

@Victor Nicollet是正确的 - 您只能在可以使用文字值的上下文中使用查询参数。

如果需要创建查询变量的其他部分(例如列名,表名,SQL关键字或整个SQL表达式),则需要构建一个动态SQL查询作为字符串,并将PHP变量或表达式插入到字符串。请务必小心谨慎,以避免SQL注入漏洞。

代码中的另一个WTF是您没有检查prepare()函数是否返回了mysqli_stmt类型的对象。在这种情况下,由于您以无效方式使用查询参数,prepare()返回 false 以指示语法错误。当然 false 不是一个对象;它没有bind_param()方法。这就是你得到错误的原因。