2014-12-03 54 views
1

我正在嘗試在我的網站中進行就地編輯。 現在我設置了所有我需要的東西。 當用戶點擊提交時,它會發送div元素的id(什麼樣的內容)和要更新的新值。到位編輯更新文本

這裏是我的代碼:

if($pedit = $mysqli->prepare("UPDATE `accounts` SET ? = ? WHERE `id`= ? ")){ 
    $pedit->bind_param("sss", $id, $value, $_SESSION["user_id"]); 
    $pedit->execute(); 
    $pedit->free_result(); 
    $pedit->close(); 
} 

我不知道爲什麼它不更新信息。 $id =改變的行:描述,全名,電子郵件等。 $value =有關$id的新信息。用戶可以更新其個人資料信息。

該代碼不會顯示任何類型的錯誤,但仍不會更新。

+0

它不起作用,因爲您不允許使用'?'佔位符代替_column或table_標識符。它們只能用於標量值(這些值_assigned_到列) – 2014-12-03 19:32:54

+0

因此,對於您的輸入變量'$ id',您不能使用佔位符。相反,您必須將該變量放入查詢中(您試圖通過使用'prepare()/ bind_param()/ execute()'來避免),但是您可以首先使用可接受的可能列名進行驗證。我正在尋找一個解釋它的現存問題 - 這經常被問到...... – 2014-12-03 19:34:36

回答

5

無法在預準備語句中將列名稱指定爲參數。您必須在準備之前將列名替換爲該語句。不要忘記將可編輯的列名列入白名單,以確保不會執行不需要的SQL。

<?php 
$accounts_editable_cols = array(
    'name'=>true, 'street'=>true, 'city'=>true, 
    'region'=>true, 'postal'=>true, 'phone'=>true 
); 

// prevent SQL injection by whitelisting column names 
if (!array_key_exists($id, $accounts_editable_cols)) return false; 

$pedit = $mysqli->prepare("UPDATE `accounts` SET $id = ? WHERE `id`= ? ") 
if ($pedit) { 
    $pedit->bind_param("ss", $value, $_SESSION["user_id"]); 
    $pedit->execute(); 
    $pedit->free_result(); 
    $pedit->close(); 
}