【问题标题】:Updating serialised array in mysql (without unserialising?)在mysql中更新序列化数组(不反序列化?)
【发布时间】:2011-03-17 16:54:21
【问题描述】:

我读过的所有内容都说在 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
需要更新的单元格命名为:数组

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

【问题讨论】:

  • array 是单元格名称并假设它必须用引号引起来?
  • 反引号 (`) 不同于引号 (')

标签: php mysql replace serialization


【解决方案1】:

如果您只是像这样进行搜索和替换,您将使序列化数据不可用。以下是您需要做的:

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

请注意,这将替换序列化数组中每次出现的搜索字符串。如果你想替换一个特定的键,你必须更具体,呵呵。

【讨论】:

  • 请注意,它不会替换字符串http://www.original.com/page.html,而只会替换整个字符串正好是http://www.original.com的条目
【解决方案2】:

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

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

你可以在这里找到它:Database Search and Replace Script in PHP

我已将电子商务、wordpress 和其他数据库移至不同的域,我发现它非常宝贵。我没有研究 PHP 脚本本身来了解底层,但如果他们没有混淆代码,你可能会发现一个想法和方法的金矿......哈哈

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多