我想添加一个"发送消息"的形式到现有的网站。我找到了这个教程:
PHP Contact Form
我回顾了教程中的代码,了解了它是如何工作的,然后编写了它。我启动并运行了它,它通过了我所有的测试,在我的PC上本地运行。
然后我把它作为现有网站的一部分放在服务器上。它失败了。单击Submit按钮将清除屏幕,窗体将消失在视图中。没有错误消息。没有。
XAMPP和实际服务器都运行PHP版本8.1.12。
在这行PHP代码中失败:header('Location: contact.php', true, 303);
我花了相当多的时间调试它,学习更多关于PHP的知识,遵循这里的Stack Overflow的建议,并且我阅读了关于函数header()的PHP文档。我参加了两个LinkedIn学习PHP的课程。我不知道出了什么问题。
然后我把这个问题简化成这个简单的代码,使它尽可能简单,一个只有提交按钮的表单。它和完整的表单有同样的问题。
下面是我的测试代码:<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Contact</title>
</head>
<?php
session_start();
$request_method = strtoupper($_SERVER['REQUEST_METHOD']);
if ($request_method === 'GET'){
?><form action="for_stack_overflow.php" method="post">
<button type="submit">Send Message</button>
</form>
<?php
}
elseif ($request_method === 'POST'){
header('Location: for_stack_overflow.php', true, 303);
exit;
}
?></html>
这个简单的html/php代码有我的完整的表单相同的问题:在点击提交按钮,屏幕被清除,表单,只有一个按钮,消失了。
我故意删除了所有缩进,因为我了解到一个常见的问题是看不见的空白会导致PHP函数header()失败。
这个程序(和我的完整表格):
- 在本地PC上测试时工作完美;
- 在真实服务器上运行时失败,在我的网站托管帐户上。
为了解决这个问题,我已经用尽了所有的方法。
怎么了?会出什么问题呢?我不明白的是什么?
将header()
和session_start()
调用移到HTML输出之前。
<?php session_start();
...
?>
<!doctype html>
...
裁判:https://www.php.net/manual/en/function.header.php
请记住,header()必须在任何实际输出之前调用可以通过普通的HTML标签,文件中的空白行或PHP发送。
裁判:https://www.php.net/manual/en/function.session-start.php
注意:
To use cookie-based sessions, session_start() must be called before outputting anything to the browser.