MySQL обновляет записи с условием

#php #mysql

#php #mysql

Вопрос:

Таблица A

 id | name | important |
-----------------------
 1   Abe        0
 2   Ann        1
 3   John       1
 4   Bill       0
 

У меня есть php-массив значений идентификаторов

  $ids = [1, 4];
 

Я хочу обновить таблицу, установив значение важного столбца равным 1
, если значение столбца id находится в массиве $ ids, И установив значение важного столбца
равным 0, если нет.

Итак, для примера, таблица после обновления будет:

 id | name | important |
-----------------------
 1   Abe        1
 2   Ann        0
 3   John       0
 4   Bill       1
 

Как это сделать?

Спасибо за любую помощь!

Комментарии:

1. Вы хотите достичь этого в одном конкретном запросе или это не имеет значения? Предпринимали ли вы какие-либо попытки написать запрос / запросы? Это update... where... , ничего больше.

Ответ №1:

В основном вам нужно запустить следующий запрос:

 UPDATE TableA SET important = (id IN (1,4));
 

Ниже приведена реализация php этого:

 <?php
$ids = [1,4];

//prepare SQL statement with plaseholders
$placeholder =  implode(',', array_pad([], count($ids) , '?'));
$sql = "UPDATE TableA SET important = (id IN ($placeholder));";

// run update with ids
$pdo->prepare($sql)->execute($ids);

// Get updated data for check result
$sth = $pdo->prepare("SELECT * FROM TableA");
$sth->execute();

print_r($sth->fetchAll());
 

И здесь вы можете протестировать код.

Ответ №2:

я использую значение идентификатора обновления php pdo . и его работа успешно.

сначала я могу попробовать обновить заданное значение идентификатора в 1. а затем после попытки обновить значение всех идентификаторов в 0.

поэтому, пожалуйста, попробуйте этот код.

 <?php

//This is a database connection

$host_name = 'localhost';
$db_name = 'stackoverflow';
$user_name = 'root';
$password = '';

$conn = new PDO("mysql:host=$host_name; dbname=$db_name;", $user_name, $password);
 
$ids = [1, 4]; //This is a id for update value is 1

$sqlforOneVal = "UPDATE important SET important = 1 WHERE id in (".(implode(', ', $ids)).")";
$updateforOne = $conn->prepare($sqlforOneVal);
$updateforOne->execute();

$sqlforZeroVal = "UPDATE important SET important = 0 WHERE id not in (".(implode(', ', $ids)).")";
$updateforZero = $conn->prepare($sqlforZeroVal);
$updateforZero->execute();

?>
 

Ответ №3:

Сначала сделайте массив безопасным перед вставкой

 $ids = array_map('intval', $ids);
 

Затем вставьте одним запросом

 <?php


"UPDATE TableA SET important=1 WHERE id in(" . implode(',',$ids) . ");"
 

Комментарии:

1. mysql_ Расширение устарело и удалено из PHP начиная с версии 7.

2. @el-vanja также я не использую mysql_ в своем ответе, я пишу только строку!

3. См. О внедрении sql и важности подготовленных и связанных запросов

4. @a55 предоставил безопасное и элегантное решение.

5. Спасибо, a55. Ваше решение в этом отношении достаточно хорошо для меня!