PHP:输入到.txt和html页面
所以,我让我的PHP脚本将输入存储在一个.txt文件中,但是,我的html页面出现了一些问题。我想将文本输出到.txt文件以及html页面上的div 我个人认为这与脚本本身在一个单独的页面上这一事实有关,我正在刷新页面,所以从来没有机会出现。我觉得PHP脚本应该做的是从.txt文件中提取。但不确定 我尝试了PHP:输入到.txt和html页面,php,html,Php,Html,所以,我让我的PHP脚本将输入存储在一个.txt文件中,但是,我的html页面出现了一些问题。我想将文本输出到.txt文件以及html页面上的div 我个人认为这与脚本本身在一个单独的页面上这一事实有关,我正在刷新页面,所以从来没有机会出现。我觉得PHP脚本应该做的是从.txt文件中提取。但不确定 我尝试了action=”“并将PHP放在同一页面上,但没有写入.txt文件。它写入.txt文件的唯一方式是执行action=“[php文件]”操作 有什么想法吗 HTML: <?php
action=”“
并将PHP放在同一页面上,但没有写入.txt文件。它写入.txt文件的唯一方式是执行action=“[php文件]”
操作
有什么想法吗
HTML:
<?php
if(isset($_POST['submit']))
{
$file = 'posts.txt';
// Open the file to get existing content
$msg = file_get_contents($file);
// Append new content to the file
$msg .= (isset($_POST['msg']) ? $_POST['msg'] : null);
// Write the contents back to the file
file_put_contents($file, $msg);
header("Location: profile.html");
}
?>
参考资料:
<?php require_once('storeText.php');?>
用于在任何文件上存储数据Nikhil Patel在对您的问题的评论中几乎击败了我,但让我尝试提供一些更详细的信息 我不能100%确定我是否正确地阅读了您的问题,因此,如果我有任何错误,请纠正我:您在profile.html上有一个表单,它将数据汇总到storeText.php。php写入文件并重定向回profile.html。然后,您希望profile.html显示写入文本文件的相同
$msg
变量,但它没有这样做。是这样吗
希望.html文件作为PHP代码执行可能会有问题。我不知道您的Web服务器是如何设置的,但通常只有.php文件由php解析。您可以尝试将profile.html重命名为profile.php,看看这是否会有所不同。从这里开始,我将假设profile.html被解析为PHP;如果我错了,你可能需要重新命名这个文件
真正的问题是重定向。在这里,您可以采用两种不同的方法中的任何一种。一种方法是在profile.html中包含storeText.php,并将表单提交到profile.html。然后,$msg
变量将在profile.html中可用,并应显示。另一种方法是设置表单提交到storeText.php,由storeText.php完成工作并将用户重定向回profile.html
问题是,您不能同时执行include和重定向。这就是你遇到问题的地方。请参阅,来自客户端的每个HTTP请求,包括客户端为响应重定向头而发送的新请求,都会导致重新运行脚本。重定向后启动的全新profile.html从未见过包含写入文件的值的$msg
变量。提交到profile.html不起作用的原因是它包含了storeText.php中的所有代码,包括重定向,即使重定向到同一个文件,它仍然是一个新的请求
如果要使用重定向,则需要某种方法将该变量存储在服务器端,以便profile.html能够访问该变量。通常的做法是使用。只需让profile.html和storeText.php都设置会话,让storeText.php将$msg
保存到会话,然后让profile.html将其拉出即可。然后删除require_一次('storeText.php')代码>profile.html中的行,因为您不再需要该逻辑
如果你没有加入重定向,那么你可以做我通常做的事情(以及Nikhil Patel在评论中的建议)。我通常将表单显示逻辑和表单处理逻辑放在一个文件中,该文件根据是否有表单输入来决定要做什么。我发现这样做更容易进行验证,但我离题了。这里真正需要更改的是将表单提交到profile.html(action=“
可以正常工作)并从storeText.php中删除重定向。然后一切都会像你期望的那样
然而,如果您所做的全部工作都是让profile.html输出文本文件中的任何内容,而不管您是否在表单提交后立即看到它,那么这两种方法都是完全错误的。在这种情况下,根本不用担心保持$msg
变量。让storeText.php保持原样,包括重定向。从profile.html中删除include。然后,不要让profile.html尝试回显$msg
,而是让它打开文件并回显其内容。(您甚至可以设置一个循环,一次读取一行内容,如果需要,还可以将每个内容放在单独的div中。)
重读你的问题,我不太清楚你到底想要什么样的行为。第一个版本的storeText.php仅将新内容存储在$msg
中,并使用fopen/fwrite/etc.函数将其附加到文件中。因此,如果$msg
确实在重定向中幸存下来(例如,如果您将其存储在会话中),用户将只看到添加到文件中的新位。备用版本将文件加载到$msg
,将新内容附加到该文件,并用$msg
覆盖该文件。如果在这种情况下,$msg
在重定向中幸存下来,用户将看到文件的全部内容
然而,在任何一种情况下,用户都只能在提交表单后立即看到结果;对profile.html的新GET请求仍将显示一个空div。如果希望在用户查看profile.html时显示信息,则从文件中读取该信息是唯一的选项
顺便说一句,您可能已经知道这一点,但无论如何都值得明确说明:不要显示从用户处获得的任何值而不进行转义。如果您这样做,则您的页面将允许攻击者输入恶意代码并在用户的浏览器中运行。无论您是从上次表单输入还是从文件中获取值,这都适用。阅读IT Security StackExchange或OWASP.org上的跨站点脚本(XSS)。我可以使用上述脚本写入文件。我现在的问题是在同一个html页面中显示输入
<div class="menuItem" >
<?php echo $msg; ?>
</div>
<?php
if ( isset( $_POST['submit'] ) ) {
$filename = 'posts.txt';
$msg = (isset($_POST['msg']) ? $_POST['msg'] : null);
if ( is_writable( $filename ) ) {
if ( $handle = fopen( $filename, 'a') ) {
fwrite( $handle, $msg );
echo "Success, wrote ( $msg ) to file ( $filename )";
fclose( $handle );
} else {
echo "Could not open file.";
}
} else {
echo "File not writable.";
}
header("Location: profile.html");
}
?>
<?php
if(isset($_POST['submit']))
{
$file = 'posts.txt';
// Open the file to get existing content
$msg = file_get_contents($file);
// Append new content to the file
$msg .= (isset($_POST['msg']) ? $_POST['msg'] : null);
// Write the contents back to the file
file_put_contents($file, $msg);
header("Location: profile.html");
}
?>