我一直在使用预处理语句做一些工作,因为它们更安全,但在先前版本的sql数组提取($ query-> fetch_array(MYSQL_ASSOC))中,它不允许从数组中返回一个项目
function getForumInfo( $id, $col ){
global $mysqli, $db_table_prefix;
$stmt = $mysqli->prepare("SELECT ? FROM forums WHERE id = ?");
$stmt->bind_param("si", $col, $id);
$stmt->execute();
$stmt->bind_result($val);
$out = $stmt->fetch()[$val];
$stmt->close();
return $out;
}
关于它的一些东西只是看起来。
如果我要做以下事情:
echo getForumInfo( 7, 'name');
它会返回JUST来自列名的值,其中id = 7?
答案 0 :(得分:2)
准备语句中的标记不允许用于标识符(例如表名或列名),用于命名要由SELECT
语句返回的列的选择列表,或指定二进制文件的两个操作数运算符,例如=
符号。后一种限制是必要的,因为无法确定参数类型。我也不允许将标记与NULL
进行? IS NULL
比较。你应该做点什么:
function getForumInfo( $id, $col ){
global $mysqli, $db_table_prefix;
$stmt = $mysqli->prepare("SELECT {$col} WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
// and so on...
现在,问你的主要问题:
$out = $stmt->fetch()[$val];
不会产生你的结果。您已经拨打了bind_result
电话;所以只需使用以下内容:
$stmt->bind_result($out);
$stmt->fetch();
$stmt->close();
return $out; // It could be `$val` if you use bind_result to $val