我有这个程序,用户可以在其中输入消息和姓名。然后程序将该信息保存在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>
答案 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程序读取新条目之前已更新。
否<!/强>
在所面临的问题是因为,当你从文件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;
然后在循环你所访问的元素作为对象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);
?>