2010-07-19 2 views
4

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

Можно ли обновить этот URL без предварительного удаления?

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

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

Could not update UPDATE config SET array = replace('array', ' http://www.oldurl.com ', ' http://www.newurl.com ') as variable supplied must be an array.

Имя таблицы: конфиг
Колонки: имя | Массив
Row Нуждаясь Обновленный имени: конфиг
Cell Нуждаясь Обновленный имени: массив

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

+1

Почему 'array' в кавычках ? – casablanca

+0

array - это имя ячейки и предположил, что оно должно быть в кавычках? – Ryan

+0

Backticks '(\') 'отличаются от кавычек' (') ' – quantumSoup

ответ

10

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

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

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

+0

Работал отлично, спасибо большое :) – Ryan

1

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

Search Replace DB version 3.0.0 (currently a BETA version) allows you to carry out database wide search/replace actions that don’t damage PHP serialized strings or objects with a user friendly interface and experience.

Вы можете найти здесь: Database Search and Replace Script in PHP

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

Смежные вопросы