标头在我的PHP代码中没有响应

时间:2014-08-22 09:55:37

标签: php html mysql twitter-bootstrap

我正在编写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。

5 个答案:

答案 0 :(得分:1)

PHP不允许您在设置标题之前向浏览器输出任何内容。因此,如果在头函数调用之前有HTML代码,则需要重构代码,以便在将任何内容写入输出流之前设置标题,或者可以使用Output Control Functions控制输出。

答案 1 :(得分:1)

答案 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,因为它似乎是最有用的。