【问题标题】:php redirection that won't redirect不会重定向的php重定向
【发布时间】:2012-06-21 16:18:11
【问题描述】:

感谢 PHP,我正在进行重定向,但它根本不重定向(但会进行其他所有重定向)。

这是我实现的代码:

<?php 
session_start();    // pour pouvoir récupérer /creer desvariables de session

try
{
    $bdd = new PDO('mysql:host=localhost;dbname=youf', 'root', 'root');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

$redirection="command.php";
if (!isset($_SESSION['Login'])){ header('Location: connect.php'); } // Si pas de sessionactives, redirect
    if (!isset($_SESSION['CommandId'])){
        $long = strlen($_SESSION['Login']);
        $table = $_SESSION['Login'][$long-2].$_SESSION['Login'][$long-1];
        $zone = $_SESSION['Login'][$long-4].$_SESSION['Login'][$long-3];
        $createCommand="INSERT INTO `youfood`.`command` (`Number`, `Date`, `isPaid`, `Table`, `Zone`, `Server`, `State`) VALUES (NULL, current_date, '0', '".$table."', '".$zone."', '".$_SESSION['NumberEmployee']."', '5');";
        $bdd->query($createCommand);

        $sqlCommandNumber=$bdd->query("SELECT * FROM  `command` WHERE  `Table` =".$table." AND  `Zone` =".$zone." AND  `State` =0 LIMIT 0 , 1");
        $commandNumber="";
        while ($data=$sqlCommandNumber->fetch()){
            $commandNumber = $data['Number'];
        }
        $_SESSION['CommandId'] = $commandNumber ;
        header('Location: actionValidateCommand.php');
        $redirection="actionValidatedCommand.php";
    } else {
        foreach ( $_SESSION['cart'] as $key => $value ) {
            if($value != 0){
                $sql = "INSERT INTO  `youfood`.`commanddishe` (`Number` ,`command` ,`Dishe` ,`Quantity`)VALUES (NULL, '".$_SESSION['CommandId']."', '".$key."', '".$value."')";
                $bdd->query($sql);
                $messagee = $messagee."<br />".$sql."<br />";
                $_SESSION['cart'][$key] = 0 ;
            }
        }
    header('Location: command.php');
    $redirection="command.php";
}
?>
<!DOCTYPE html> 
<html> 

当我检查未重定向页面的 html 结果时,我看到标记前有一个空格。我不知道空间在哪里,我知道这是错误的!

感谢帮助我:-)

【问题讨论】:

  • 尝试使用:header('Location: path/here');退出;
  • $redirect= ...的目的是什么?只需确保在调用 header() 之前没有任何内容输出到浏览器。
  • 哪个标签前的空格?您可能在标题之前发送输出。检查headers_sentheaders_list

标签: php redirect http-headers http-redirect


【解决方案1】:

你是在标题启动之前输出的东西。

即:$messagee = $messagee."&lt;br /&gt;".$sql."&lt;br /&gt;";

为了使重定向正常工作,您应该避免在标题行之前输出任何内容。

也可以试试这个:error_reporting(E_ALL); 在文件的开头。查看它是否返回错误或警告。

【讨论】:

  • 正确答案,错误理由 ;-) 不必要的空格来自 ?&gt;&lt;!DOCTYPE html&gt; 之间的换行符,与重定向失败没有任何关系,因为标头将在空白被回显之前发送......
  • 是的,我想你是对的。这意味着正确的做法就是放一个 exit();每次标头启动后的语句。
  • $messagee = $messagee."&lt;br /&gt;".$sql."&lt;br /&gt;"; 行实际上并没有输出任何东西。其实上面的代码根本没有任何输出。
【解决方案2】:

在发送标头之前始终删除您的输出:

// at the beginning of your script
ob_start();

// clean output before sending headers
ob_clean();
header( /* … */ );

标头未执行的原因可能在于第一个if-construct。您是否检查过该条件是否/可以在任何时候为真?

【讨论】:

    【解决方案3】:

    有时我会在打开的 &lt;?php 标记之前找到一个空格,无论是在相关的 php 文件中还是在包含的文件中,这里似乎不是这种情况。或者收盘后?&gt;

    【讨论】:

      【解决方案4】:

      您看到的空格可能是 UTF 字节顺序标记 (BOM)。 使用 Notepad++ 之类的程序甚至十六进制编辑器来删除它。 这是一个参考:http://www.sunfinedata.com/tips/remove-bom-from-utf-8-files/

      如果有 BOM,PHP 会告诉 Apache 发送响应头,之后就不能设置额外的头了。

      如果您在 php.ini 中启用 display_errors,您将看到如下内容:

      警告: 无法修改标头信息 - 标头已由 /blah/blah.php 中的(输出开始于 /blah/blah.php:1)在线发送1

      session_start() 也会产生错误。

      参考:http://en.wikipedia.org/wiki/Byte_order_mark

      附:我不知道为什么有些人会对可能正确的答案投反对票。

      【讨论】:

        猜你喜欢
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        • 2012-06-09
        • 1970-01-01
        相关资源
        最近更新 更多