PHP header()不起作用?

时间:2017-04-21 08:52:48

标签: php html5 php-7

由于某些原因,我正在努力解决这个问题header("Location:http://corocloud.com/index.php/"); 不工作,我已尝试其他路径到文件但没有工作, header("Location:index.php");header("index.php");header("./index.php/");

这些都不起作用,我的代码就是这样:

<!DOCTYPE html>
<html>
    <head>
      <title>CoroCloud</title>
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <script src="./js/material.min.js"></script>
      <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
      <link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.pink-indigo.min.css" />
      <style>.mdl-layout{align-items:center;justify-content:center;}.mdl-layout__content{padding:24px;flex:none;}</style>
  </head>
  <body>
    <div class="mdl-layout mdl-js-layout mdl-color--grey-100">
      <main class="mdl-layout__content">
        <div class="mdl-card mdl-shadow--6dp">
          <div class="mdl-card__title mdl-color--primary mdl-color-text--white">
            <h2 class="mdl-card__title-text">CoroCloud</h2>
          </div>
          <div class="mdl-card__supporting-text">
            <form method="POST">
              <div class="mdl-textfield mdl-js-textfield">
                <input class="mdl-textfield__input" type="text" name="uname" />
                <label class="mdl-textfield__label" for="uname">Username</label>
              </div>
              <div class="mdl-textfield mdl-js-textfield">
                <input class="mdl-textfield__input" type="password" name="pass"/>
                <label class="mdl-textfield__label" for="pass">Password</label>
              </div>
              <div class="mdl-card__actions">
                <input type="submit" class="mdl-button mdl-button--colored mdl-js-button mdl-js-ripple-effect" name="sub">
              </div>
            </form>
          </div>
        </div>
      </main>
    </div>
    <?php 
      session_start();
      	// this will trigger when submit button click
      	if(isset($_POST['sub'])){
       
      		$db = new mysqli("localhost","user","password","db");
       
      		// create query
      		$query = "SELECT * FROM users WHERE user='".$_POST['uname']."' AND password='".sha1($_POST['pass'])."'";
       
      		// execute query
      		$sql = $db->query($query);
      		// num_rows will count the affected rows base on your sql query. so $n will return a number base on your query
      		$n = $sql->num_rows;
       
      		// if $n is > 0 it mean their is an existing record that match base on your query above 
      		if($n > 0){
                              $_SESSION['username'] = $_POST['uname'];
                              $_SESSION['password'] = $_POST['pass'];
                              $_SESSION['userobj'] = mysql_fetch_assoc($query);
  			header("Location: index.php");
			exit();
      		} else {
       
      			echo "Incorrect username or password";
      		}
      	}
      ?>
  </body>
</html>

我知道代码正在执行,因为每个$ _SESSION var都获得了值,为什么标头不起作用?

顺便说一句,我正在尝试重定向的文件位于同一个文件夹中。

编辑: 不要运行代码片段,因为它有PHP

6 个答案:

答案 0 :(得分:2)

您无法输出内容,然后执行&#34;标题&#34;在php中操作。 所以,修改你的代码,先做所有的PHP东西,然后输出html。 在此之前你不得有任何输出(html,警告等)&#34;标题&#34;线。 见:http://php.net/manual/en/function.header.php

答案 1 :(得分:2)

在代码顶部//在html代码

之前添加此代码
ob_start();
session_start();
    // this will trigger when submit button click
    if(isset($_POST['sub'])){

        $db = new mysqli("localhost","user","password","db");

        // create query
        $query = "SELECT * FROM users WHERE user='".$_POST['uname']."' AND password='".sha1($_POST['pass'])."'";

        // execute query
        $sql = $db->query($query);
        // num_rows will count the affected rows base on your sql query. so $n will return a number base on your query
        $n = $sql->num_rows;

        // if $n is > 0 it mean their is an existing record that match base on your query above 
        if($n > 0){
                      $_SESSION['username'] = $_POST['uname'];
                      $_SESSION['password'] = $_POST['pass'];
                      $_SESSION['userobj'] = mysql_fetch_assoc($query);
        header("Location: index.php");
        exit();
        } else {

            echo "Incorrect username or password";
        }
    }

// Put here html code //

答案 2 :(得分:1)

请先尝试使用ob_start()函数和标题位置

ob_start();
header("Location:http://corocloud.com/index.php/");
exit;

我希望它会有所帮助!你请提供你在那里得到的错误。

答案 3 :(得分:1)

在调用标头之前,您可能不会生成输出(HTML或echo)。 http://php.net/manual/en/function.header.php

答案 4 :(得分:1)

正如Icewine指出的那样,应该在创建任何输出之前设置标题。

因此,要么将设置标题的代码移动到脚本的开头,要么通过在脚本开头调用ob_start()来捕获带输出缓冲的所有输出。

此外,习惯上在使用Location标头重定向时不发送任何内容,将重定向的逻辑移动到脚本开头的另一个原因是,然后在设置标头后调用exit()

答案 5 :(得分:0)

更好的方法是尝试遵循一些PHP基础知识。

<?php
ob_start();
session_start();
标题

退出

header("Location:demo.php");
exit;