【问题标题】:Updating php serialize array value in database更新数据库中的php序列化数组值
【发布时间】:2015-08-21 15:42:23
【问题描述】:

因此,我们在包含旧用户数据的数据库中拥有历史日志。我们不想删除日志,而只想删除其中的一些数据。它作为一个数组存储在 MySQL 中的一个字段中。

a:1:{s:4:"Test";s:17:"user data";} 

如何更新 test(用户数据)的值?通过 MySQL 或 php,它看起来像下面这样?这会影响数百行。

a:1:{s:4:"Test";s:17:"***";} 

这是我刚刚尝试检索的一些数据

$sqltext = "SELECT log_data FROM log WHERE log_data != '' LIMIT 1";
$result = mysql_query ($sqltext) or die(SqlError(__FILE__,__LINE__,__FUNCTION__));

$row = mysql_fetch_array($result);
$deserialized = unserialize($row->log_data);
var_dump($deserialized);

返回:bool(false)

数组包含一堆东西,包括html

【问题讨论】:

  • 你有没有尝试过?你可以做一个循环,为每一行反序列化,替换你需要的,然后序列化回来。
  • 你看过函数serializeunserialize吗?
  • 不,我还没有尝试任何东西 - 不知道如何开始
  • 我认为也许从@caCtus 的建议开始,使用两个链接的函数将是一个好的开始。然后返回一个更具体的问题,关于您遇到问题的部分。
  • 好的,我已经更新了我的帖子

标签: php mysql serialization


【解决方案1】:

警告 MySQL 函数集自 PHP 5.5.0 起已弃用,自 PHP 7.0.0 起已被删除。相反,应该使用 MySQLi 或 PDO_MySQL 扩展。

我怀疑查询的结果可能没有正确返回。当我测试(http://codepad.org/Rhlwm82A)以下代码时,它按预期工作:

<?php

$row = array("log_data" => 'a:1:{s:4:"Test";s:9:"user data";}');

$deserialized = unserialize($row['log_data']);
var_dump($deserialized);

?>

所以也许你需要检查你是否有结果或者它是序列化的数据:

<?php
$sqltext = "SELECT log_data FROM log WHERE log_data != '' LIMIT 1";
$result = mysql_query ($sqltext);
if(!$result){
    die(SqlError(__FILE__,__LINE__,__FUNCTION__));
}

$row = mysql_fetch_assoc($result);
$deserialized = unserialize($row['log_data']);
var_dump($deserialized);
?>

【讨论】:

  • mysql function set 已弃用,而不是 mysql
【解决方案2】:

下面是我需要提取序列化数据,对其进行反序列化,更改多行中的值并再次重新序列化更新。

while ($row_something = mysql_fetch_assoc($something)) {
    $log_id       = $row_something['log_id'];
    $deserialized = unserialize($row_something['log_data']);

    foreach ($deserialized AS $key => $value) {
        if ($key == 'user_data') {
            $deserialized['user_data'] = "***";
        }

        $updateSQL = sprintf("UPDATE log SET log_data=%s WHERE log_id=%s", 
        GetSQLValueString(serialize($deserialized), "text"), 
        GetSQLValueString($row_something['log_id'], "int"));

        mysql_select_db($database_connection, $connection);
        $Result1 = mysql_query($updateSQL, $connection) or die(mysql_error());
    }
}

【讨论】:

    猜你喜欢
    • 2013-01-04
    • 2012-03-22
    • 2013-08-03
    • 1970-01-01
    • 2023-03-03
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多