2013-10-31 22 views
1

我想構建一個更新某些表中的字段變量的ajax函數。 表,字段和行都是可變的,並基於通過ajax函數發佈的內容。使用變量表,列,行的PDO更新

這是我的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; 

代碼正如你所看到的,我要動態地選擇表,列和行。

我並不知道一大堆異常,但沒有一個被拋出 ,它成功地迴應了我告訴它的底部的東西。

+1

您不能對錶名或列使用佔位符。 –

+2

您不能使用佔位符表名稱或列名稱。 – aynber

+0

啊,有道理。任何方式動態選擇表呢? –

回答

0

正如您所看到的,我希望動態選擇表,列和行。

是的,我們看到它。
這就是你的想法錯誤的地方。

這是相當傳染性的疾病,每個優秀的程序員都不得不長大。您正在嘗試製作通用更新程序。不幸的是,雖然一些自動化的想法通常都是正確的,但是過多的自動化可能是一場災難。

你的應用程序必須有一個想法它更新什麼和爲什麼。所有查詢必須預先寫入,只有數據部分可能會有所不同。從幾個領域構建動態更新是可以的,但是甚至會使表名稱動態化太多。

由於您的特定問題,ORM是你真正想要的。看看如何使用Yii Active record來完成:

$post=$table::model()->findByPk($id); 
$post->$field=$value; 
$post->save(); // save the change to database 
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注入相當容易。

+0

是的。這就是爲什麼這個答案是不可接受的。 –

+0

有人贊成它,負擔很多可能的注射負擔 –

+0

如果我沒有過濾字段,這是一個可以接受的答案? –