Поле MYSQL UPDATE со значением другого поля * и * с использованием REPLACE в подготовленном выражении внутри цикла foreach

0

Первоначальный вопрос (позже расширенный - см. Ниже):

Возможно ли обновить поле со значением из другого поля и в этом процессе заменить строку внутри этого обновленного значения?

Я попробовал следующее (очень упрощенное):

UPDATE table1 SET field1 = REPLACE(field2, string1, string2);

Пример: field2 содержит "темно-синий", string1 - "синий", string2 - "красный".

Я ожидал, что все значения из field2 будут скопированы в field1, но при копировании заменит любой экземпляр string1 который будет заменен на string2 в field1. Поэтому в моем примере значение field2 должно стать "темно-красным".

Но это только скопировало неизменные значения field2 в field1 без каких-либо изменений/изменений. (в моем примере field2 становится "темно-синим")


EDIT/ADDITION:

Скрипты, которые @axiac и @2SRTVF создали и связали в своих комментариях, показали мне, что код, который я написал, фактически работает. Большое спасибо вам обоим!

Однако мой исходный код встроен в подготовленный оператор. Также подготовленное выражение работает, как и ожидалось. Но этот подготовленный оператор находится внутри цикла foreach который проходит через массив, и в этой ситуации запрос обновления не работает...

Вот код, который я действительно использую:

$db = new mysqli("my_host", "my_user", "my_pw", "my_database");

foreach($my_array AS $x=>$y) {
  if($ps = $db->prepare("UPDATE table1 SET field1 = REPLACE(field2, ?, ?) ")) {
    $ps->bind_param("ss", $x, $y);
    $ps->execute();
    $ps->close();
  }
}

Массив содержит пары ключ/значение, один из них в моем примере выше будет blue/red.

  • 1
    Отправленный вами запрос должен работать. Проверьте это здесь: sqlfiddle.com/#!9/6115e2/1 Убедитесь, что string1 присутствует в field2 и field2 внимание на заглавные буквы. REPLACE() чувствителен к регистру.
  • 1
    @Johannes Можете ли вы сказать, что вы хотите в качестве конечных значений для field1 и field2?
Показать ещё 1 комментарий
Теги:
mysqli
prepared-statement

2 ответа

1
Лучший ответ

Ваша проблема - ваш цикл. Все замены, которые происходят в первом count($my_array)-1 проходят через цикл, отбрасываются последним проходом, потому что UPDATE всегда копирует из текущего значения field2, а не (возможно, ранее измененную копию field1. Попробуйте добавить это перед циклом:

UPDATE table1 SET field1 = field2

а затем измените запрос в цикле на:

UPDATE table1 SET field1 = REPLACE(field1, ?, ?)

Обратите внимание, что при подготовке запроса в цикле вы теряете преимущество в эффективности подготовленных запросов. Было бы лучше написать его как:

if ($ps = $db->prepare("UPDATE table1 SET field1 = REPLACE(field1, ?, ?) ")) {
    foreach ($my_array as $x => $y) {
        $ps->bind_param("ss", $x, $y);
        $ps->execute();
    }
    $ps->close();
}

Итак, если, например, ваша таблица содержит

field1  field2
x       dark blue
y       light green

и $my_array = array('blue' => 'red', 'green' => 'pink') затем после запуска этого кода вы получите:

field1      field2
dark red    dark blue
light pink  light green
  • 0
    Большое спасибо, это работает!
  • 0
    Не беспокойтесь, рад помочь.
0

Назначения UPDATE с одним столом обычно оцениваются слева направо. Что вы можете сделать, так это:

UPDATE table1 SET field1 = field2, field2 = REPLACE(field2, string1, string2);
  • 0
    ОП спрашивает, как изменить значение поля field1 . field2 не должно быть изменено.
  • 0
    Я так не думаю. Он говорит, что field2 должно стать темно-красным.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню