Обновление сериализованного массива в MySQL (без десериализации?) - PullRequest
5 голосов
/ 19 июля 2010

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

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

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

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

Не удалось обновить UPDATE config. SET array = replace ('array', 'http://www.oldurl.com',' http://www.newurl.com'), поскольку указанная переменная должна быть массивом.

Имя таблицы: config
Колонны: имя | массив
Требуется обновление строки с именем: config
Обновление ячейки с именем: массив

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

Ответы [ 2 ]

11 голосов
/ 19 июля 2010

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

$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, '"'));

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

1 голос
/ 12 августа 2014

Думаю, я бы поделился инструментом, написанным на PHP (скриптом), который вы можете скачать, который выполняет поиск и замену базы данных. Цитировать автора с сайта:

Поиск Заменить БД версии 3.0.0 (в настоящее время бета-версия) позволяет вам выполнять поиск по всей базе данных / заменять действия, которые не наносят ущерба PHP сериализованные строки или объекты с удобным интерфейсом и опыт.

Вы можете найти его здесь: Поиск и замена базы данных в PHP

Я переместил базы данных электронной коммерции, WordPress и другие в другой домен, и я нашел это бесценным. Я не заглядывал в сам скрипт PHP, чтобы заглянуть под капот, но если они не запутали код, вы можете найти золотую жилу идей и методов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...