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

Php 使用准备好的mysqli语句将参数绑定到查询的SELECT部分,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我正在构建一个web应用程序,从php/mysql中的数据源导入数据。我将数据导入缓冲区/临时保存表。由于每种数据格式不同,我根据特定的源选择要选择的列 在这种情况下,我无法使此查询正常工作: $stmt = $this->dbObj->prepare("SELECT mk.PK_phone_maker, b.?, b.phoneDescription b.thumbPic, FROM buffer_table b left join mobi

我正在构建一个web应用程序,从php/mysql中的数据源导入数据。我将数据导入缓冲区/临时保存表。由于每种数据格式不同,我根据特定的源选择要选择的列

在这种情况下,我无法使此查询正常工作:

$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上的prepare没有工作,因为$stmt不是对象


因此,在我看来,您不能将参数绑定到select列和join字段,只能绑定到where子句。这个断言我是对的还是遗漏了什么?

准备好的语句只允许您绑定值,其他构造(如字段、表或函数)是不允许的,更不用说整个SQL了。

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

如果需要生成查询变量的其他部分,例如列名、表名、SQL关键字或整个SQL表达式,则需要将动态SQL查询构建为字符串,并在字符串中插入PHP变量或表达式。请务必小心执行此操作,以避免SQL注入漏洞

代码中的另一个WTF是,您没有检查prepare函数是否返回mysqli_stmt类型的对象。在本例中,由于您以无效的方式使用了查询参数,prepare返回false以指示语法错误。当然,false不是一个对象;它没有bind_param方法。这就是为什么你会犯这样的错误