2014-12-03 57 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(); 
}