代码之家  ›  专栏  ›  技术社区  ›  Allamo Olsson

为什么文件只添加部分序列化内容和序列化,即使数据正在进入?

php
  •  0
  • Allamo Olsson  · 技术社区  · 5 年前

    我正在尝试添加一个包含其他类中的数据的对象,然后将其序列化到数据文件中。当我查看数据文件时,只添加了2个字符“b:0;”,并且无论我更改了多少对象内容,它们总是相同的,而且当我尝试添加更多文章时,文件保持不变。

    我尝试将对象更改为普通字符串,结果是相同的(相同的两个字符“b:0;”。我还尝试检查函数是否得到了正确的输入。

    这是我在post类中的构造函数:

    function __construct($nam, $mess, $dat){
            $this->name = $nam;
            $this->message = $mess;
            $this->date = $dat;
        }
    

    这是我在留言簿类中使用的数组和函数:

    protected $PostList = [];
    function addPost($nam, $mes, $dat){
        $obj = new Post($nam, $mes, $dat);
        array_push($this->PostList, $obj);
        // Serialize and save all of the new object array to file
        file_put_contents("guestbook/Postdata.txt", serialize($this->PostList));
    }
    

    数据文件的预期结果是这样的?

    a:size:{key definition;value definition;(repeated per element)}
    

    但我只得到“B:0;

    下面是我在index.php上使用类的地方:

    <?php
    $guestbook = new Guestbook();
    if (isset($_REQUEST['addpost'])) {
        if (isset($_POST['author'])  && isset($_POST['message'])){    
            if ($_REQUEST['author'] != ""  && $_REQUEST['message'] != "") {
    
                $guestbook->addPost($_REQUEST["author"], $_REQUEST["message"], Date('Y-m-d H:i:s'));
            }
        }
    
        unset($_REQUEST["addpost"]);
        header("Location: index.php");
        exit();
    }
    

    ?gt;

    解决方案: 文件_exists()始终为真,因此,我在数组中插入了一个bool值。所以我用函数filesize(“filepath”)来解决这个问题。

    2 回复  |  直到 5 年前
        1
  •  0
  •   John Morris    5 年前

    只是一个想法,但是您设置了uu结构($nam,$mess,$dat),但是您将它传递给addpost($nam,$mes,$dat)。如果您丢失了消息,请将其更改为mess或mess,或者如果您有$name、$message、$date,则不会造成伤害,只是为了清楚起见,请同时更改这两个消息

        2
  •  0
  •   Allamo Olsson    5 年前

    问题出在我读取文件的方式上。 这是它的样子:

                 if(file_exists("data.txt")>0){
                 //$this->PostList = unserialize(file_get_contents("data.txt"));
                array_push($this->PostList, unserialize(file_get_contents("data.txt") ) );
                var_dump($this->PostList);
            }
    

    “文件存在”函数始终为“真”,因为文件存在,并且数组最初加载的值为“假”,因此为了解决此问题,我将改为:

    if(filesize("data.txt")){
              //...
            }