2012-06-19 239 views
1

我正在重定向感谢PHP,但它根本不重定向(但使其他重定向)。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结果,我看到了标签之前的空间。我不知道哪里有空间,我知道这是错误的!

感谢帮助我:-)

+1

尝试使用:header('Location:path/here');出口; –

+0

$ redirect = ...的目的是什么?只需确保在header()将被调用之前在aol中没有输出到浏览器。 – Brian

+0

标签之前的空间?您可能在标题之前发送输出。用'headers_sent'和'headers_list'检查。 – hakre

回答

0

您所看到的空白可能是UTF 字节顺序标记(BOM)。 使用Notepad ++或甚至十六进制编辑器等程序将其删除。 这里是参考:http://www.sunfinedata.com/tips/remove-bom-from-utf-8-files/

如果有一个BOM,PHP告诉Apache发送响应头,然后没有额外的头可以设置。

如果启用在php.ini的display_errors,你会看到这样的事情:

警告:不能更改头信息 - 头已经发出(输出开始/blah/blah.php:1)在上线

session_start()/blah/blah.php也将产生一个错误。

编号:http://en.wikipedia.org/wiki/Byte_order_mark

附:我不知道为什么有些人会低估可能的正确答案。

2

在标题启动之前,您正在输出内容。

即:$messagee = $messagee."<br />".$sql."<br />";

为了重定向到正常工作,你应该避免标题行之前输出任何东西。

另请在您的文件开始处尝试此操作:error_reporting(E_ALL);。看看它是否返回错误或警告。

+0

正确的答案,错误的理由;-)不必要的空格来自'?>'和'<!DOCTYPE html>'之间的换行符,并且不能与重定向失败有任何关系,因为标题会被发送之前,空白将得到回应... – feeela

+1

是的,我想你是对的。这意味着要做的正确事情就是放一个exit();每个标题启动后的声明。 – edwardmp

+0

行'$ messagee = $ messagee。“
”。$ sql。“
”;'实际上并不输出任何内容。其实上面的代码根本没有什么可输出的。 –

0

发送头之前,一定要放弃你的输出:

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

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

的理由不得到执行的标题也许驻留在第一if -construct。你有没有检查过,在任何时候这种情况都可能是真的?

0

有时我会在打开<?php标记之前找到一个空格,无论是在php文件还是包含文件中,这似乎并不是这里的情况。或关闭后?>