bind_param可能忽略变量而没有错误

时间:2014-05-28 17:44:04

标签: php mysqli

我在PHP和MySQL之间遇到了一个奇怪的问题。我有以下代码来获取HTML表的值($sortfield设置为table1.colb DESCtable1.colb ASC,具体取决于测试。

if (!($stmt = $db_handle->prepare("SELECT table1.cola, table1.colb ORDER BY ? LIMIT ?,20"))) {
    exit('Prepare failed: (' . $db_handle->errno . ') ' . $db_handle->error);
}
if (!$stmt->bind_param('si', $sortfield, $start)) {
    exit('Binding parameters failed: (' . $stmt->errno . ') ' . $stmt->error);
}
if (!$stmt->execute()) {
    exit('Execute failed: (' . $stmt->errno . ') ' . $stmt->error);
}
$stmt->store_result();

此代码执行时没有错误,但ORDER BY子句在其值作为变量给出时完全被忽略。结果按table1.cola排序,就好像ORDER BY不存在一样。如果我将ORDER BY ?替换为ORDER BY table1.colb(并相应地修改bind_param),则查询将按预期运行并按该列排序。

如果我echo包含变量的完整语句(即echo "SELECT table1.cola, table1.colb ORDER BY $sortfield LIMIT $start,20")并直接针对MySQL手动运行结果,那么查询将按预期工作。

$sortfield取自GET方法,并在语句准备之前由htmlentities()处理。它应该是一个字符串值,这就是它看起来的样子,所以我对结果感到很困惑。

0 个答案:

没有答案