我读过的所有内容都说在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
任何其他想法或方法将不胜感激:)谢谢!
答案 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