PHP更新表为时过早

时间:2019-02-02 20:45:20

标签: php html

我有这个程序,用户可以在其中输入消息和姓名。然后程序将该信息保存在json文件中。然后,将json文件中的条目输出到表中。

一切正常,我希望它只是当我添加表中的一个新条目。当我单击提交按钮时,该表将更新为空条目。如果我随后更新页面,则表将获得正确值的输入。

我看过将json对象保存到的文件,并且正确发送了表单数据。从我的角度来看,似乎表在get程序读取新条目之前已更新。不过,我真的不明白为什么,因为它是当地的阵列$tempArray通过的foreach循环和这个数组会随着新的条目进行更新时进行提交。

<?php
//open & read php file
$json = file_get_contents("../../../writeable/test2.json");
$tempArray = json_decode($json);

//get form values
if(isset($_POST['submit'])) {
    $name = $_POST['name'];
    $text = $_POST['text'];
    $date = date("m-d-Y h:i", time());
    //create new json object
    $new_post = array(
        'name' => $name,
        'text' => $text,
        'date' => $date,
        'ip' => $_SERVER['REMOTE_ADDR']
    );
    //add new json object to array
    $tempArray[] = $new_post;
    print_r($tempArray);
}

//encode array into json & save to file
$my_json = json_encode($tempArray);
$fh = fopen("../../../writeable/test2.json", 'wd') or die("can't open file");
fwrite($fh, $my_json);
fclose($fh);

?>

<!DOCTYPE html>
<html lang="sv-SE">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css"/>
    <title>DT161G-Laboration1</title>
</head>
<body>
  <table id="guestbook">
          <?php
                    foreach ($tempArray as $obj) { //loop through array with posts
                        echo '<tr>';
                        echo '<td>' . $obj->name . '</td>';
                        echo '<td>' . $obj->text . '</td>';
                        echo '<td>' . 'IP: ' . $obj->ip . '</br>TID: ' . $obj->date . '</td>';
                        echo '</tr>';
                    }
                ?>
  </table>
 <form action="guestbook.php" method="POST">
            <input type="text" placeholder="Write your name"
                   name="name">
            <br>
            <label for="text">Your message</label>
            <textarea id="text" name="text"
                      rows="10" cols="50"
                      placeholder="Message .."></textarea>
            <br>
            <button type="submit" name ="submit">Send</button>
    </form>
</body>

3 个答案:

答案 0 :(得分:3)

JavaScript没有关联数组。因此,这样的PHP数组被转换成对象。您正在从JSON文件中读取对象,但会附加一个关联数组。

在循环中,除使用最新添加的数组外,其他所有功能均正常运行。 $obj->name无法访问数组元素$obj['name']

与对象句柄通过改变您的代码到

$new_post = (object)[
  'name' => $name,
  'text' => $text,
  'date' => $date,
  'ip'   => $_SERVER['REMOTE_ADDR'],
];

答案 1 :(得分:2)

  

从我的角度来看,表似乎在get程序读取新条目之前已更新。

否<!/强>

  1. 在所面临的问题是因为,当你从文件JSON-数据,并使用解码它json_decode你的对象的阵列并如果表单提交您可以在对象数组中插入一个数组。

    $new_post = array( 'name' => $name, 'text' => $text, 'date' => $date, 'ip' => $_SERVER['REMOTE_ADDR'] ); //add new json object to array $tempArray[] = $new_post;

  2. 然后在循环你所访问的元素作为对象e.g $obj->name;

最简单的解决方案

的最简单的解决方案是键入铸您的$new_post阵列到一个对象,如:

$new_post =(object) array(
    'name' => $name,
    'text' => $text,
    'date' => $date,
    'ip' => $_SERVER['REMOTE_ADDR']
);

您可以了解有关投射Here

的更多信息

答案 2 :(得分:1)

的事情是json_decode($json)返回PHP的标准类对象,它是stdClass。在if块,要追加的$tempArray与阵列文字对象。要解决此问题,您只需将第二个参数true传递给json_decode

$tempArray = json_decode($json, true);

此返回一个关联阵列,这样就可以将新阵列追加到$tempArray。您还可以按照其他答案中的说明将array转换为object

顺便说一句,你是装甚至在新的数据JSON数据添加到该文件,你也正在试图即使窗体不会提交添加数据。但是实际上,当表单未提交时,您将重新添加现有数据。这是我对您的代码所做的更改。

<?php

//open & read php file
$json = file_get_contents("../../../writeable/test2.json");
$tempArray = json_decode($json, true);

//get form values
if(isset($_POST['submit'])) {
    $name = $_POST['name'];
    $text = $_POST['text'];
    $date = date("m-d-Y h:i", time());
    //create new json object
    $new_post = array(
        'name' => $name,
        'text' => $text,
        'date' => $date,
        'ip' => $_SERVER['REMOTE_ADDR']
    );
    //add new json object to array
    $tempArray[] = $new_post;
    print_r($tempArray);

    //encode array into json & save to file
    $my_json = json_encode($tempArray);
    $fh = fopen("../../../writeable/test2.json", 'wd') or die("can't open file");
    fwrite($fh, $my_json);
    fclose($fh);
}

//open & read php file
$json = file_get_contents("../../../writeable/test2.json");
$tempArray = json_decode($json);

?>