【问题标题】:Serialize multiple data from database of same column序列化同一列数据库中的多个数据
【发布时间】:2013-05-21 12:10:38
【问题描述】:

我是 PHP 新手并使用序列化数据,

我有一个数据库,它有 2 个表,用户和字符。 characterId 与 userId 有关系。

一个用户有2个字符,所以我想用以下代码获取数据:

public static function getCharacter() {
        $mysqli = Controller_Core_Config::getDB();
        if ($mysqli != null) {
            $user = unserialize($_SESSION['user']);
            $sql = "SELECT * FROM `character` WHERE `userId`='" . $user->getId() . "'";
            $result = $mysqli -> query($sql);

            if ($result !== FALSE && $result -> num_rows > 0) {
                $row = $result -> fetch_assoc();
                $_SESSION["character"] = serialize(new Model_Game_User(
                    $row['characterId'], 
                    $row['characterName'], 
                    $row['userId'], 
                    $row['level']
                    ));
            } else {
                echo "You have no characters.";
            }
        }
    }

如果我想显示数据,我使用以下代码:

//some code
$character = unserialize($_SESSION["character"]);
$output .= $character->getCharacterName() . "<br>";
//some code

我的问题是,当我 var_dump ($_SESSION["character"]) 我只得到 1 个字符:

string(202) "O:15:"Model_Game_User":4:{s:28:"Model_Game_UsercharacterId";s:1:"3";s:30:"Model_Game_UsercharacterName";s:9:"adminious" ;s:23:"Model_Game_UseruserId";s:1:"2";s:22:"Model_Game_Userlevel";s:1:"3";}"

我的问题是,序列化数据中是否可以有多个“字符”?

【问题讨论】:

  • 为什么要序列化数据?

标签: php database serialization


【解决方案1】:

你没有循环你的结果。您只是将找到的第一个结果添加到会话中

你需要这样的东西来代替你 if 块:

if ($result !== FALSE && $result -> num_rows > 0) {
    $_SESSION["character"][] = array();
    while($row = $result -> fetch_assoc()) {
        $_SESSION["character"][] = serialize(new Model_Game_User(
            $row['characterId'], 
            $row['characterName'], 
            $row['userId'], 
            $row['level']
            ));
    }
}

【讨论】:

  • 您好,感谢您的回答,但额外的 [] 会给我以下错误:致命错误:字符串不支持 [] 运算符
  • 首先出现错误是因为您需要在循环结果之前将$_SESSION["character"] 初始化为带有$_SESSION["character"] = array(); 的数组,但是重新阅读您的问题似乎您甚至没有循环在结果上,所以只会将找到的第一个字符加载到会话中。
  • 感谢您的回答,我会想办法把这个放在一个循环中看看结果,否则我必须使用其他方法。再次感谢您的帮助。
  • 看看我重写的答案,它应该让你得到你所追求的
猜你喜欢
  • 2020-01-05
  • 2013-03-01
  • 1970-01-01
  • 2020-03-12
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多