2015-10-30 29 views
1

我想,当用户获得从API特定响应放置头之后将用户重定向时不能更改头信息。它的工作原理的大部分时间,但有时头不工作,我得到以下错误:在这种情况下我正在试图提交表单

Warning: Cannot modify header information - headers already sent by (output started at /home/ubuntu/workspace/Payment.php:90) in /home/ubuntu/workspace/Payment.php on line 126 Call Stack: 0.0001 238200 1. {main}() /home/ubuntu/workspace/Payment.php:0 2.6037 271848 2. header() /home/ubuntu/workspace/Payment.php:126 

线126,是唯一的头我的页面上,

header("Location: $ConfirmationPage", false); 

我不清楚为什么发生这种情况(特别是因为它并不总是发生)。我的代码中有没有错误?

<!DOCTYPE html> 

<!-- 
// Cardnumber = "4005550000000001"; 
// Expiry = "01/19"; 
// CVV = "124"; 
--> 

<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width,initial-scale=1.0" /> 
    <meta name="format-detection" content="telephone=no" /> 
    <title>Payment</title> 
    <link href="../static/css/bootstrap.css" rel="stylesheet" /> 
    <link href="../static/css/style.css" rel="stylesheet" /> 
    <script src="../static/js/jquery.js"></script> 
    <script src="../static/js/bootstrap.js"></script> 
</head> 
<body> 
<title>Payment</title> 
<div> 
    <?php 
     include("nav.php"); 
     require_once ("./CheckoutFunctions.php"); 
     require_once('./api/securepay.php'); 
     $ConfirmationPage = "/Confirmation.php"; 
    ?> 
</div> 

<div class="col-md-9 col-xs-8 col-lg-8 col-lg-offset-1"> 
    <form action="" method="post" class="form-inline" id="form-signin"> 
     <div class="col-xs-12"><h2>Processing Payment</h2></div> 
     <div class="form-group col-xs-12"> 
      <div class="col-xs-3 col-md-2 form-label"><label>Name on card:</label></div> 
      <div class="col-xs-9 col-md-6"><input type="text" name="cardname" class="form-control" placeholder="Name on Card"/></div> 
     </div> 
     <div class="form-group col-xs-12"> 
      <div class="col-xs-3 col-md-2 form-label"><label>Card Number:</label></div> 
      <div class="col-xs-9 col-md-6"><input type="text" name="creditcard" class="form-control" placeholder="Credit Card"/></div> 
     </div> 
     <div class="form-group col-xs-12"> 
      <div class="col-xs-3 col-md-2 form-label"><label>Expiry Date:</label></div> 
      <div class="col-xs-4 col-md-3"> 
       <select class="form-control" name="ExpMon" title="select a month"> 
        <option value="01">Jan</option> 
        <option value="02">Feb</option> 
        <option value="03">Mar</option> 
        <option value="04">Apr</option> 
        <option value="05">May</option> 
        <option value="06">June</option> 
        <option value="07">July</option> 
        <option value="08">Aug</option> 
        <option value="09">Sept</option> 
        <option value="10">Oct</option> 
        <option value="11">Nov</option> 
        <option value="12">Dec</option> 
       </select> 
      </div> 
      <div class="col-xs-4 col-md-3"> 
       <select name="ExpYear" class="form-control" title="select a year"> 
        <option value="15">2015</option> 
        <option value="16">2016</option> 
        <option value="17">2017</option> 
        <option value="18">2018</option> 
        <option value="19">2019</option> 
        <option value="20">2020</option> 
       </select> 
      </div> 
     </div> 
     <div class="form-group col-xs-12"> 
      <div class="col-xs-3 col-md-2 form-label"><label>CVV: </label></div> 
      <div class="col-xs-4 col-md-3"><input type="text" name="CVV" class="input-block-level form-control" placeholder="CVV" /></div> 
     </div> 
     <div class="col-xs-12"> 
      <div class="col-xs-offset-2"> 
       <button class="btn btn-large btn-primary" id="process-btn" type="submit" name="submit">Submit Payment</button> 
      </div> 
     </div> 


     <!--Take the form values on submit and run them through the securepay API. Print the response on the page.--> 
     <?php 
     if(isset($_POST['submit'])) 
      { 
       $trans = new SecurePay(); 

       //PLEASE SANITIZE $_POST data. We will be heavily marked down otherwise. 
       //THIS will need to put put into a form and posted to the confirmation page. 
       //get values from form and set them to variables 

       $creditcard = filter_var($_POST['creditcard'], FILTER_SANITIZE_NUMBER_INT); 
       $ExpYear = filter_var($_POST['ExpMon'] . "/". $_POST['ExpYear'], FILTER_SANITIZE_STRING); 
       $CVV = filter_var($_POST['CVV'], FILTER_SANITIZE_NUMBER_INT); 


       $trans->cardnumber = $creditcard; 
       $trans->expiry = $ExpYear; 
       $trans->cvv = $CVV; 
       $trans->orderId = "PO123456"; 
       $trans->amount = str_replace(".","",urlencode("100.00")); 

       $responseCode = $trans->processPayment(); 

       /* If the response code is 00 (success from securePay), send an email and redirect to confirmation page, if not display an error */ 
       if ($trans->getLastResponseCode() == "00") { 
        //Email information 

        $to  = getEmail($shId); 
        $subject = 'the subject'; 
        $message = 'hello'; 
        $headers = 'From: [email protected]' . "\r\n" . 
         'Reply-To: [email protected]' . "\r\n" . 
         'X-Mailer: PHP/' . phpversion(); 

        mail($to, $subject, $message, $headers); 


        header("Location: $ConfirmationPage", false); 

        } elseif ($trans->getLastResponseCode() == "") { 
         echo "<h1> Card details incorrect, please enter correct details.</h1>"; 
        } else { 
         echo "<h1>".$trans->getLastResponseCode()."  ".$trans->getLastResponseText()."</h1>"; 

        } 


      } 
     ?> 
     </form> 
    </div> 
    <div> 
     <?php include("sidebar.php"); ?> 
    </div> 
    <div> 
     <?php include("footer.php"); ?> 
    </div> 
</body> 
</html> 
+0

你'header'通话内容后,已经输出...用头通话内容被输出干扰 - 包头第一或它不是一个标题。 –

回答

1

使用ob_flush。在代码的开始,使用

ob_start(); 

header("Location: $ConfirmationPage", false); 
ob_flush(); 
+0

伟大的我认为这工作! – bandoy123

0

如果页面上有任何输出,PHP header()将不起作用。

解决方案:

1)添加ob_start()在页面的开始。

ob_start()将您输出保存到缓冲区,将发生重定向。

2)使用的JavaScript重定向。即使页面上有任何输出,Javascript重定向也会发生。

<?php 
echo "<script>window.location.href='" . $ConfirmationPage . "';</script>"; 
?> 
+0

我会在哪里把ob_start()?在页面顶部? – bandoy123

+0

@ bandoy123,是的,你应该把它放在页面的最顶端。 – Pupil