在mysql中更新序列化数组(没有反序列化?)

时间:2010-07-19 00:02:25

标签: php mysql replace serialization

我读过的所有内容都说在Mysql中存储序列化数组是一个坏主意 - 我已经知道了;)不幸的是我正在使用一个使用此方法的开源脚本,并且更改结构不是一个选项在这种情况下。

是否可以在不首先反序列化的情况下更新此URL?

我最初尝试使用replace,但是它会抛出错误:

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

无法更新UPDATE配置SET array = replace('array','http://www.oldurl.com','http://www.newurl.com')因为提供的变量必须是数组。

表名:配置
列:名称|阵列
行需要更新名为:config
Cell Needing已更新名为:array

任何其他想法或方法将不胜感激:)谢谢!

2 个答案:

答案 0 :(得分: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替换为当前和目标网址,运行脚本并执行生成的$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 :(得分:1)

以为我会分享一个用PHP(脚本)编写的工具,你可以下载它来进行数据库搜索和替换。从网站引用作者:

  

搜索替换数据库版本3.0.0(目前是BETA版本)允许您   执行数据库范围的搜索/替换不损坏的操作   PHP序列化的字符串或对象具有用户友好的界面和   经验。

您可以在此处找到它:Database Search and Replace Script in PHP

我已将电子商务,wordpress和其他数据库移至不同的域名,我发现它非常宝贵。我没有深入研究PHP脚本本身,但如果他们没有讨论代码,你可能会找到一个想法和方法的金矿... lol