Witajcie, jak sugeruje tytuł, szukam sposobu na tworzenie dynamicznych zapytań do mojego serwera MySQL. W tej chwili jest to kod używać do aktualizacji danych na serwerze:Dynamiczne kwerendy MySQL z PHP
$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);
}
Jak widać, nazwy kolumn SQL są takie same jak deskAttr
kluczy. Poszukuję sposobu na uczynienie tej linii pętlą, więc nie będę musiał zmieniać tej linii, jeśli chcę dodać więcej kolumn do tabeli MySQL.
To będzie wyglądać mniej więcej tak:
$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";
}
Jak napisać powyższy kod tak będzie to rzeczywiście działa? Dzięki.
EDIT
Może to będzie pomocne, aby wiedzieć, że $deskAttr
jest tablicą obiektów i nazwy kolumn są takie same jak nazwy klawiszy obiektów.
Oto co mam na myśli pseudo kod:
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);
}
Oczywiście byłoby dodać dodatkowy przecinek na końcu zapytania przed którym część, ale mam nadzieję, że masz za co próbuję osiągnąć.
Jesteś szeroko otwarte [SQL injection] (http://php.net/manual/en/security.database.sql-injection.php) i powinien naprawdę korzystaj z [Przygotowań] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) zamiast łączenia zapytań. Zwłaszcza, że w ogóle nie wychodzisz z wejść użytkownika! –
Powinieneś naprawdę przejść do przygotowanych instrukcji dla wartości i białej listy dla nazw kolumn, aby uniknąć iniekcji sql. – jeroen
Nie można powiązać nazw kolumn za pomocą przygotowanej instrukcji. Więc jeśli umieścisz łańcuch znaków w ciągu zapytań SQL, po prostu uniknij ich poprawnie i wszystko jest w porządku. –