Rya*_*yan 6 php mysql serialization replace
我读过的所有内容都说在Mysql中存储序列化数组是一个坏主意 - 我已经知道了;)不幸的是我正在使用一种使用此方法的开源脚本,并且在这种情况下更改结构不是一个选项.
是否可以在不首先反序列化的情况下更新此URL?
我最初尝试使用替换,但它会抛出一个错误:
$rssquery = "UPDATE config SET `array` = replace(`array`, \"http://www.oldurl.com\", \"http://www.newurl.com\") WHERE name='config'";
$insert = $db->insert($rssquery);
Run Code Online (Sandbox Code Playgroud)
无法更新UPDATE配置SET array = replace('array',' http://www.oldurl.com','http ://www.newurl.com ')因为提供的变量必须是数组.
表名:config
列:名称| array
Row Needing更新命名:config
Cell Needing更新名为:array
任何其他想法或方法将不胜感激:)谢谢!
qua*_*oup 12
如果只是像这样搜索和替换,则会使序列化数据不可见.这是你需要做的:
$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}');";
Run Code Online (Sandbox Code Playgroud)
替换$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, '"'));
Run Code Online (Sandbox Code Playgroud)
请注意,这将替换序列化数组中每次出现的搜索字符串.如果您想要更换特定的密钥,您必须更多,具体而言.