2013-10-17 116 views
0

我一直在做的和预处理语句一些工作,因为他们更安全的一列,但在以前版本的SQL阵列的读取($查询 - > fetch_array(MYSQL_ASSOC)),它并没有允许从数组中返回一个项目。获取从MySQL准备好的语句

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'); 

将它列名,其中id = 7只返回值?

+0

' “?SELECT(东西)FROM表名WHERE ID =”' –

+0

@弗雷德-II-是啊,我绑定,当我取回,我的问题主要是关于:$ OUT = $ stmt->取()[$ VAL]; – MysteryDev

+0

如果行不被用户提供的,那么最好让它'选择$行从论坛WHERE ID =?'但是你的做法真的很麻烦,而且一个什么样的代码应该** **从未像 – samayo

回答

1

准备好的语句中的标记不允许用于标识符(例如表或列名称),选择列表中名称将由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 
+0

感谢深入一点解释了整个事情更多,我很欣赏它。 – MysteryDev