2017-07-18 18 views
5

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ąć.

+1

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! –

+1

Powinieneś naprawdę przejść do przygotowanych instrukcji dla wartości i białej listy dla nazw kolumn, aby uniknąć iniekcji sql. – jeroen

+0

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. –

Odpowiedz

1

Możesz to zrobić z niewielką zmianą kodu przy użyciu funkcji PHP implode().

Weź pustą tablicę, połącz parametry aktualizacji z nią.

A jeśli nie jest empty(), , aby uzyskać ciąg znaków.

Updated Kod:

$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

Ten kod jest ** _ bardzo _ ** niezabezpieczony. Jest szeroko otwarty na iniekcje SQI. Powinieneś używać Przygotowanych instrukcji zamiast łączenia danych użytkownika bezpośrednio w ten sposób. Powinieneś także mieć listę dozwolonych nazw kolumn. –

+0

Nie, nie jest. Przestańcie być przygotowanymi na-nazistami i idźcie przeczytać dokumentację "mysqli_real_escape_string" –

+0

@ KiJéy - Może powinieneś sprawdzić linię czasu komentarza i zmiany postu. ** 1. ** Kiedy napisałem komentarz, 'mysqli_real_escape_string()' nie zostały uwzględnione w odpowiedzi _at all_. ** 2. ** '' $ key' jest _still_ całkowicie unescaped, który _still_ sprawia, że ​​jest on w 100% otwarty na iniekcje SQL. Przy okazji są sytuacje, w których 'mysqli_real_escape_string()' to za mało: https://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string/12118602#12118602 –

Powiązane problemy