2017-07-18 69 views
5

嗨,作爲標題狀態,我正在尋找一種方法來動態查詢我的MySQL服務器。目前,這是我用在服務器上更新數據的代碼:使用PHP動態查詢MySQL

$deskAttr = json_decode($_POST["desk_attributes"]); 

foreach($deskAttr as $key => $value) { 
    $sql = "UPDATE desk_attributes SET iw_standard=".$value->iw_standard.", avaya_standard=".$value->avaya_standard.", avaya_withcallid=".$value->avaya_withcallid.", avaya_withtransfer=".$value->avaya_withtransfer.", dual_screen=".$value->dual_screen.", air_conditioning=".$value->air_conditioning.", iw_obdialler=".$value->iw_obdialler." WHERE id=".$value->id; 
    $conn->query($sql); 
} 

正如你所看到的,SQL列名是一樣的deskAttr鍵。我正在尋找一種方法讓這一行成爲一個循環,這樣我就不需要改變這一行,如果我要添加更多的列到MySQL表中。

這將是這個樣子:

$deskAttr = json_decode($_POST["desk_attributes"]); 

foreach($deskAttr as $key => $value) { 
    $sql = "UPDATE desk_attributes SET"; 
    foreach($value as $k => $v) { 
     $sql .= " $k = $value->$k ,"; 
    } 
    $sql .= "WHERE id=".$value->id"; 
} 

我怎麼會寫上面的代碼,以便它會實際工作? 謝謝。


編輯

也許這將有助於知道$deskAttr是對象數組和列的名稱是一樣的對象鍵的名稱。

這裏是我的意思是僞代碼:

foreach($object in $deskAttr) { 
    $sql = "UPDATE table SET "; 
    foreach($key in $object) { 
     if($key != "id") 
      $sql .= "$key = $object->$key, "; 
    } 
    $sql .= "WHERE id = $object->id; 
    $conn->query($sql); 
} 

顯然,這將在WHERE部分查詢之前的末尾添加一個額外的逗號,但希望你明白我想要的目的。

+1

您是大開[SQL注入(http://php.net/manual/en/security.database.sql-injection.php)和確實應該使用[Prepared Statements](準備好的語句)(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php),而不是串聯你的查詢。特別是因爲你沒有逃避用戶輸入! –

+1

你應該真的切換到準備好的語句的值和列名的白名單,以避免SQL注入。 – jeroen

+0

您無法通過預準備語句綁定列名稱。所以,如果你要在你的SQL查詢字符串中放置一個可變字符串,那麼正確地轉義它們並且你沒事。 –

回答

1

您可以使用PHP的implode()函數對代碼進行輕微更改。

取一個空白數組,連接更新參數。

然後如果不是empty(),implode()得到字符串。

更新的代碼:

$sql = "UPDATE desk_attributes SET "; 
foreach ($deskAttr as $key => $value) { 
$value = mysqli_real_escape_string($link, $value); // $links is database connection string. 
$key = mysqli_real_escape_string($link, $key); // $links is database connection string. 
$updtAttrs[] = $key ." = '" . $value . "'"; 
} 
$sql .= ! empty($updtAttrs) ? implode(', ', $updtAttrs) : ''; 
$sql .= " WHERE id=" . $value->id; 
+2

此代碼** **非常不安全。它對SQl注射開放很大。您應該使用Prepared Statements,而不是像這樣直接連接用戶輸入。您還應該有一個允許的列名稱列表。 –

+0

不,不是。不要成爲準備好聲明納粹,並閱讀'mysqli_real_escape_string'文檔 –

+0

@KiJéy - 也許你應該檢查評論的時間線和帖子的編輯。 ** 1。**當我寫評論時,'mysqli_real_escape_string()'不包含在答案_at all_中。 ** 2。'$ key'完全未轉義,_still_使SQL注入100%打開。順便說一句,實際上有'mysqli_real_escape_string()'是不夠的情況下:https://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string/12118602#12118602 –