Объединить, но если уже сделано, игнорировать

#php #mysql #sql #mysqli

#php #mysql #sql #mysqli

Вопрос:

Я хотел бы добавить звездочку (*) после имени пользователя, если часть информации о профиле устарела.

Дональд

 $stmt = $conn->prepare("UPDATE contacts SET name = concat(name, '*') WHERE phone = ?");
$stmt->bind_param("s",$phone);
$stmt->execute();
  

Дональд*

В первый раз это работает нормально, но если ничего не изменилось, и я обновляю профиль, он добавляет еще одну звездочку, так что тогда имя Дональд **. В следующий раз это будет Дональд *** и т.д.

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

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

1. Если определение того, что что-то устарело, не является довольно дорогостоящим, похоже, что это было бы лучше обрабатывать так же, как форматирование на стороне клиента на основе устаревшего статуса. Если в этом сценарии вы думаете «кто-то пытался дозвониться по номеру, и он был отключен», как это * будет указывать на то, что номер телефона является устаревшей частью, а не чем-то другим, например, почтовым адресом, с которого было возвращено письмо или посылка?

Ответ №1:

Вы можете использовать right() для проверки, является ли последний символ a * , и обновлять строки только там, где это не так.

 UPDATE contacts
       SET name = concat(name, '*')
       WHERE phone = ?
             AND right(name, 1) <> '*';
  

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

1. Я даже не сталкивался с этой функцией раньше, но, похоже, мне стоит взглянуть. Кажется, он выполняет работу так, как я хотел. Большое спасибо!

Ответ №2:

Один из способов — использовать условный тест в выражении, которое выводит новое значение. например

 UPDATE contacts
   SET name = CONCAT(name, CASE 
                             WHEN name LIKE '%*' THEN ''
                             ELSE '*'
                           END
              )     
 WHERE phone = ?