我在PHP和MySQL之间遇到了一个奇怪的问题。我有以下代码来获取HTML表的值($sortfield
设置为table1.colb DESC
或table1.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()
处理。它应该是一个字符串值,这就是它看起来的样子,所以我对结果感到很困惑。