обновление базы данных на основе пользовательского ввода из массива

#php #mysql

#php #mysql

Вопрос:

Данные, введенные пользователем:

 "product_description": [{
    "language_id": 1,
    "name": "okayt321sd1a"
}
 

Обновить базу данных:

 foreach ($data['product_description'] as $product_description) {
    foreach ($product_description as $key => $value) {
        $a[$key] = $value;

        if($a[$key]){
            $this->db->query("UPDATE " . DB_PREFIX . "product_description SET language_id = '" . (int)$language_id . "', name = '" . $this->db->escape(html_entity_decode($product_description['name'])) . "', meta_keyword = '" . $this->db->escape(html_entity_decode($product_description['meta_keyword'])) . "', meta_description = '" . $this->db->escape(html_entity_decode($product_description['meta_description'])) . "', description = '" . $this->db->escape($product_description['description']) . "', tag = '" . $this->db->escape($product_description['tag']) . "',
                                  page_title = '" . $this->db->escape($product_description['page_title']) . "',
                                  highlight = '" . $this->db->escape($product_description['highlight']) . "',
                                  whatbox = '" . $this->db->escape($product_description['whatbox']) . "' WHERE product_id = '" . (int)$product_id . "', 
                              ");
        }
    }
}
 

Как я могу обновить данные на основе пользовательского ввода, например, если пользователь вводит

 "language_id": 1,
"name": "okayt321sd1a"
 

тогда я обновляю только эти 2 данные в базу данных, остальные данные останутся, если ввести 3 данные:

 "language_id": 1,
"name": "okayt321sd1a"
page_title
 

тогда я обновляю только эти 3 данные в базу данных, остальные данные останутся.

Ответ №1:

Вероятно, вы хотите создать функцию, которая будет создавать sql для вас. Я предполагаю, что вы используете PDO (я не знаю, но в этом примере используется PDO). Вы должны привязать параметры / значения в любом случае. Чтобы добавить пользовательские поля, просто используйте array_merge() . Вы можете использовать array_diff() или unset() удалять ненужные значения / ключи:

 function updateProductDesc($array,$where,$db)
    {
        foreach($array as $key => $value) {
            $sKey           =   ":{$key}";
            $bind[$sKey]    =   htmlspecialchars($value);
            $sql[]          =   "`{$key}` = {$sKey}";
        }

        $bind[":where"] =   (int) $where;
        $query  =   $db->prepare("UPDATE ".DB_PREFIX."product_description SET ".implode(", ",$sql)." WHERE `product_id` = :where");
        $query->execute($bind);
    }

foreach ($data['product_description'] as $product_description) {
    foreach ($product_description as $key => $value) {
        $a[$key] = $value;
        if($a[$key]){
            updateProductDesc($product_description,$product_id,$this->db);
        }
    }
}