2013-05-02 70 views
0

我試圖更新我的數據庫使用PDO語句,我沒有真正的問題,直到我嘗試使用變量作爲名稱和字段進行更新。PDO語句,其中表和字段名稱是變量

$real_function = 'top' ; 
    $value = 99 ; 
    $tableName = "twitter_control" ; 

    $stmt = $pdo->prepare("UPDATE ? SET ?=? WHERE id='control' "); 
    $stmt->execute(array($tableName, $real_function, $value)); 

如果我使用此代碼都按預期工作

$stmt = $pdo->prepare("UPDATE twitter_control SET top=? WHERE id='control' "); 
    $stmt->execute(array($value)); 

我怎樣才能使這項工作? ,有什麼建議嗎?

回答

3

你總是可以做:

$stmt = $pdo->prepare("UPDATE {$tableName} SET {$real_function}=? WHERE id='control' "); 

在你準備語句來得到它的工作。據我所知,你只能將值綁定到你的執行的輸入參數或bindParam功能。如果有人可以糾正,否則我..

DINS

1

當你通過執行它將該值作爲參數一個字符串,當它被轉義並將其包含在引號中。這導致UPDATE 'twitter_control' SET 'top' = '99',這是無效的。

你應該儘早知道你的表和列的名字。如果它們確實必須是變量,則應在創建值的白名單之後才能在查詢中插入它們。

if (!in_array($real_function, array('top')) { 
    return; 
} 
..."UPDATE twitter_control SET $real_function = ?..." 
+0

當使用實際準備好的語句(而不是仿真)時,說參數被轉義並用引號括起來是不正確的。實際情況是,字符串*作爲單獨的變量*傳遞給數據庫,該數據庫將其直接插入* compile *查詢計劃中,而不是SQL語句本身。 (效果是一樣的,但它解釋了爲什麼*你不能在其他上下文中使用參數。) – IMSoP 2013-05-02 22:04:25

相關問題