1

我想构建一个 ajax 函数来更新某些表中的字段变量。表、字段和行都是可变的,并且基于通过 ajax 函数发布的内容。

这是我的 quickedit.php 的代码

define( "DB_DSN", "mysql:host=$host;dbname=$data" );
define( "DB_USERNAME", $user );
define( "DB_PASSWORD", $pass );

if(isset($_POST['table'])){ $table = $_POST['table'];}
if(isset($_POST['id'])){ $id = $_POST['id'];}
if(isset($_POST['field'])){ $field = $_POST['field'];}
if(isset($_POST['value'])){ $value = $_POST['value'];}

try {
    $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
} catch (Exception $e) {
    die("Connection Error");
}

try {
    $st = $con->prepare("UPDATE :table SET :field = :value WHERE id = :id");
    $st->execute(array(':table'=>$table, ':id'=>$id, ':field'=>$field, ':value'=>$value));
} catch (Exception $e) {
    die("Query Error");
}
echo "table: ".$table." id: ".$id." field: ".$field." value: ".$value;

如您所见,我希望动态选择表、列和行。

我对异常知之甚少,但它们都没有被抛出,它成功地呼应了我告诉它的底部的东西。

4

2 回答 2

0

您需要以旧方式构建原始 mysql 语句,使用 PHP 来评估表名和列名。然后使用 PDO 将值绑定到字段。

 $st = $con->prepare("UPDATE $table SET $field = :value WHERE id = :id");
 $st->bindValue(':id',$id,PDO::PARAM_INT);
 $st->bindValue(':value',$value,PDO::PARAM_STR);
 $st->execute();

注意不要在您正在评估的变量中使用引号或分号。以这种方式执行 SQL 注入相当容易。

于 2013-10-31T16:22:45.203 回答
0

如您所见,我希望动态选择表、列和行。

是的,我们看到了。
这就是你的想法是错误的。

这是每个优秀程序员都必须克服的传染性疾病。您正在尝试制作 Universal Updater。不幸的是,虽然一些自动化的想法通常是可以的,但过多的自动化可能是一场灾难。

您的应用程序必须知道它更新了什么以及为什么。所有查询都必须预先编写,只有数据部分可能会有所不同。从多个字段构建动态更新是可以的,但即使是动态表名也太过分了。

对于您的特定问题,ORM是您真正需要的。看看如何使用Yii Active 记录来完成:

$post=$table::model()->findByPk($id);
$post->$field=$value;
$post->save(); // save the change to database
于 2013-10-31T16:29:11.183 回答