Обновление сериализированного массива в mysql (без несериализации?)

Все, что я считал, говорит, что хранение сериализированных массивов в Mysql является плохой идеей - я уже знаю это ;) К сожалению, я работаю со сценарием с открытым исходным кодом, который использует этот метод, и изменение структуры не является опцией в этом сценарии.

Действительно ли возможно обновить этот URL без первой несериализации?

Я первоначально пытался использовать замену, однако она бросает ошибку:

  $rssquery = "UPDATE config SET `array` = replace(`array`, \"http://www.oldurl.com\", \"http://www.newurl.com\") WHERE name='config'";
  $insert = $db->insert($rssquery);

Не мог обновить массив НАБОРА конфигурации ОБНОВЛЕНИЯ = замена ('массив', 'http://www.oldurl.com', 'http://www.newurl.com'), поскольку предоставленная переменная должна быть массивом.

Имя таблицы: конфигурация
Столбцы: назовите | массив
Необходимость строки, Обновленная названный: конфигурация
Необходимость ячейки, Обновленная названный: массив

Любые другие идеи или подходы ценились бы :) Спасибо!

6
задан Ryan 19 July 2010 в 00:18
поделиться

1 ответ

Если вы просто выполните поиск и замену таким образом, вы сделаете сериализованные данные недоступными. Вот что вам нужно сделать:

$old = 'http://www.google.com';
$new = 'http://www.someplace.com';

$search = 's:' . strlen($old) .':"' . $old . '"';
$replace = 's:' . strlen($new) .':"' . $new . '"';

$query = "UPDATE config SET array=REPLACE(array, '{$search}', '{$replace}');";

Заменить $ old и $ new на ваш текущий и целевой URL, запустить сценарий и выполнить сгенерированный $ query .

Вот чистое решение SQL:

SET @search := 'http://www.original.com';
SET @replace := 'http://www.target.com';
UPDATE config SET array=REPLACE(array, CONCAT('s:', LENGTH(@search), ':"', @search, '"'), CONCAT('s:', LENGTH(@replace), ':"', @replace, '"'));

Обратите внимание, что это заменит КАЖДОЕ вхождение строки поиска в вашем сериализованном массиве. Если вы хотите заменить определенный ключ, вы должны быть более конкретными.

12
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: