嗨,作爲標題狀態,我正在尋找一種方法來動態查詢我的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部分查詢之前的末尾添加一個額外的逗號,但希望你明白我想要的目的。
您是大開[SQL注入(http://php.net/manual/en/security.database.sql-injection.php)和確實應該使用[Prepared Statements](準備好的語句)(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php),而不是串聯你的查詢。特別是因爲你沒有逃避用戶輸入! –
你應該真的切換到準備好的語句的值和列名的白名單,以避免SQL注入。 – jeroen
您無法通過預準備語句綁定列名稱。所以,如果你要在你的SQL查詢字符串中放置一個可變字符串,那麼正確地轉義它們並且你沒事。 –