Skip to content
Advertisement

Dynamic MySQL Query with PHP

I am looking for a way to make dynamic queries to my MySQL server. At the moment this is the code I use to update data on the server:

$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);
}

As you can see, the SQL column names are the same as thedeskAttrkeys. I’m looking for a way to make this line a loop so, that I don’t need to change this line if I were to add more columns to the MySQL table.

It would look something like this:

$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";
}

How would I write the code above so it will actually work?


**EDIT**

Maybe it will be helpful to know that$deskAttr is an array of objects, and the name of the columns are the same as the name of the objects keys.

Here is what I mean in pseudo code:

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);
}

Obviously this would add an extra comma at the end of the query before the WHERE part, but hopefully you get what I’m trying to achieve.

Advertisement

Answer

You can do it with slight change in your code by using PHP’s implode() function.

Take a blank array, concatenate the update parameters to it.

And then if is not empty(), implode() to get string.

Updated Code:

$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;
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement