我正在编写html表单的代码(使用bootstrap),当完成所有操作(输入验证+成功添加到数据库)后,我想返回主页面(main.php)。
这是newtask.php的代码(为简单起见,我包含了注释而不是代码)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Nueva tarea</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link href="css/bootstrap-theme.min.css" rel="stylesheet">
<link href="css/thestyle.css" rel="stylesheet">
/Some scripts
</head>
<body>
<!----------------------Checking rights------------------------>
<?php include 'rights.php'?>
<!-------------------Top navigation bar---------------- -->
<!--------------- DB queries for some select fields in the form------------------->
<!---------------------- The FORM itself --------------------------->
<!-----------------------Validate the input ------------------------------>
<?php include 'validate.php' ?>
<!----------------------- Add an entry a DB table------------------------------>
<?php include 'addtask.php' ?>
</body>
</html>
这是代码addtask.php
<?php
function changeDateFormat($input){
$list = explode('/',$input);
$newdate = $list[2] . '-' . $list[1] . '-' . $list[0];
return $newdate;
}
//Check if the form was validated
if ($validated == 0){
exit();
}
// Create connection
$con=mysqli_connect("localhost","task_user","task","tasks");
// Check connection
if (mysqli_connect_errno()) {
echo "No se puede conectar a la base de datos: " . mysqli_connect_error();
}
else{
//Adding a new task.
//Getting username ID.
$userid = $_SESSION["user_key_id"];
$name = $_POST["thename"];
$description = $_POST["desc"];
$start_date = changeDateFormat($_POST["date_s"]);
$update_date = changeDateFormat($_POST["date_u"]);
$status = $_POST["states"];
$percent = $_POST["percent"];
$proyect = $_POST["proyect"];
//Getting the project ID number.
$sqlquery="SELECT name,keyid FROM proyects WHERE name IN ('$proyect')";
$name_key_pair=mysqli_query($con,$sqlquery);
$proyect = mysqli_fetch_array($name_key_pair)['keyid'];
$sqlquery = "INSERT INTO tasks (proyect,start_date,update_date,description,status,percent,user,name) VALUES ('$proyect','$start_date','$update_date','$description','$status','$percent','$userid','$name')";
if (!mysqli_query($con,$sqlquery)){
echo '<h3><label> ERROR en el query: ' . mysqli_error($con) . '</label></h3>';
}
else{
mysqli_close($con);
header("location:main.php");
}
}
?>
我使用ECHO验证代码是否到达标头。另外phpmyadmin验证条目IS是否已添加到数据库中。这也使用用户登录系统。在用户成功登录后,用户登录使用相同的header命令将用户发送到main.php。
任何人都可以告诉我为什么标题在这种特殊情况下不起作用吗?
只是为了澄清发生了什么,当用户提交表单时,他会留在newtask.php而不是去main.php。如果我尝试从导航栏到那里,我可以毫无问题地访问main.php。
答案 0 :(得分:1)
PHP不允许您在设置标题之前向浏览器输出任何内容。因此,如果在头函数调用之前有HTML代码,则需要重构代码,以便在将任何内容写入输出流之前设置标题,或者可以使用Output Control Functions控制输出。
答案 1 :(得分:1)
标题必须为空才能重定向才能生效
http://php.net/manual/en/function.header.php
答案 2 :(得分:1)
标题只能在第一次输出之前发送(以UTF-8 Bom为输出)。
您应该根据输入,处理,输出原则进行开发。
$_POST
,$_GET
)并将其保存到对象和变量中。这是一个基本的原则,你应该在那里开始。更复杂的是像MVC
。
快速修复将使用输出缓冲区,可以通过ob_start()
和ob_end_flush()
方法轻松实现。
答案 3 :(得分:0)
@ob_end_clean();
header("location:main.php");
答案 4 :(得分:0)
我想添加一个替代方案。我已经提出了几个答案,因为很明显我不会理解正确的标题。考虑到我一周前对网络技术一无所知。所以我有这样的时刻。任何方式,即使我有点理解输出缓冲的概念我也找不到正确使用它的方法(再次,可能是由于缺乏经验)。但我确实找到了一个适合我的替代方案。我调用了一个JavaScript函数,只是将我重定向到我的主页面。像这样:
我没有使用header命令(addtask.php),而是使用了这一行:
echo '<script type = "text/javascript"> goToMain(); </script>';
然后在newtask.php中我在头部分添加了这个:
<script type="text/javascript">
function goToMain(){
window.location="main.php";
}
</script>
这很有效。我确定有一些不好的事情(因为没有人提出它,虽然我想知道为什么,如果有人可以打扰)但现在似乎更简单了。因此,我不会将此作为正确的答案而是投票给Christian Gollhardt,因为它似乎是最有用的。