Как обновить колонку, не затрагивая другие? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть этот код для обновления записи из моей базы данных, обычно я обновляю только один столбец, например: в массиве у меня есть 6 столбцов в списке, я хочу обновить только столбец keywords, а остальные столбцы должныЭто не касается меняв моей базе данных нет значений.

Мой вопрос:

  1. Как обновить столбец, не затрагивая другие?

    if(isset($_POST["updateBTN"])){    
      $insert_data = array(
    
        ':title'            => $_POST['title'],
        ':keywords'         => $_POST['keywords'],
        ':img'              => $_POST['img'],
        ':widht'            => $_POST['widht'],
        ':status'           => $_POST['status'],
        ':name'             => $_POST['name'],
        ':height'           => $_POST['height']
    
      );
    
    $query = "UPDATE table SET keywords = :keywords, img = :img, widht = :widht, status = :status, name = :name, height = :height WHERE title = :title";
    $statement = $conn->prepare($query);
    $statement->execute($insert_data);
    
    }
    

html:

<form  method="post">
<div>
    <input type="text" name="title"> 
    <span data-placeholder="Title"></span>          
</div>
<div>
    <input type="text" name="keywords"> 
    <span data-placeholder="keywords"></span>          
</div>
.
.
.
<button type="submit" name="updateBTN">Send</button>
</form>

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

посмотрите, работает ли это

UPDATE table
SET keywords = :keywords,
    img = CASE WHEN img IS NOT NULL THEN img ELSE :img END,
    widht = CASE WHEN widht IS NOT NULL THEN widt ELSE :widht END,
    status = CASE WHEN status IS NOT NULL THEN status ELSE :status END,
    name = CASE WHEN name IS NOT NULL name ELSE :name END,
    height = CASE WHEN height IS NOT NULL THEN height ELSE :height END
 WHERE title = :title;
0 голосов
/ 21 ноября 2018

Вы можете изменить запрос SQL, чтобы обновлять только столбцы, для которых у вас есть данные, или заполнить любые неопределенные значения в $insert_data, используя значения, полученные из базы данных.Первое, вероятно, является лучшей идеей, но второе легче реализовать.

Я не писал немного PHP, но, возможно, что-то вроде:

    if(isset($_POST["updateBTN"])) {
      $query = "SELECT title, keywords, img, widht, staus, name, height FROM table WHERE title = :title";
      $stmt = $conn->prepare($query);
      $stmt->execute(array(":title" => $_POST['title']));
      $row = $stmt->fetch(PDO::FETCH_ASSOC);

      $insert_data = array(
        ':title'            => $_POST['title'] ? $_POST['title'] : $row['title'],
        ':keywords'         => $_POST['keywords'] ? $_POST['keywords'] : $row['keywords'],
        ...
      );

      $query = "UPDATE table SET keywords = :keywords, img = :img, widht = :widht, status = :status, name = :name, height = :height WHERE title = :title";
      $statement = $conn->prepare($query);
      $statement->execute($insert_data);
    }
0 голосов
/ 21 ноября 2018

Если вы не хотите устанавливать ни один из столбцов на значения NULL, вы можете использовать COALESCE():

UPDATE table
    SET keywords = COALESCE(:keywords, keywords),
        img = COALESCE(:img, img),
        widht = COALESCE(:widht, widht),
        status = COALESCE(:status, status),
        name = COALESCE(:name, name),
        height = COALESCE(:height height)
WHERE title = :title;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...