2013-10-17 154 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