2012-01-06 289 views
0

Possible Duplicate:
Headers already sent by PHP包括contactform.php到HTML頁面錯誤:警告:不能更改頭信息 - 頭已經發出已

我一直都在互聯網上試圖弄清楚這一點。大約有一百萬個線程討論這個錯誤,但是他們都沒有清楚說明如何解決這個錯誤。

這是我想要完成的,我不認爲它很複雜。

我想把html-form-guide.com's contact form script contactform.php­link放在現有的html頁面上。我已經將它重命名爲.php,這很好。對於實際的表單提交.php爲是一個單獨的文件,我已經列入我的HTML的主體部分與

<? 
    include ('contactform.php') 
?> 

的聯繫方式精細顯示出來,你可以進入一切正常。但是,當你點擊提交,您得到上述錯誤:

Warning: Cannot modify header information - headers already sent by... etc 

當你點擊提交按鈕,另一個PHP腳本運行一個驗證一切,發送電子郵件。這也運行良好,因爲電子郵件實際上正在發送。然後,它應該加載一個頁面,說:謝謝您的提交與此代碼:

function RedirectToURL($url) 
{ 
    header("Location: $url"); 
    exit; 

但是沒有,反而我得到的錯誤。這聽起來像是從我的主頁面中加載了一些實際顯示錶單的東西,這阻止了這部分工作。我已經有很多線程已經說過你不能在header命令之前顯示任何html或其他東西,但是這對我沒有任何幫助。我不明白還有哪些裝載,更重要的是,我不明白如何使其工作。我隱約明白這個問題,我根本不明白的是如何解決這個問題。

的index.php

<body> 
<div id="container"> 
    <div id="header"> 
    <p style="font-size:36px;">VoiceOverGenie.com</p> 
    </div> 
    <div id="social"> 
     <ul id="soclist"> 
      <li><a href="#">facebook</a></li> 
      <li><a href="#">twitter</a></li> 
      <li><a href="#">linkedin</a></li> 
      <li><a href="#">blog</a></li> 
     </ul> 
    </div> 
    <? 
     include ('contactform.php') 
    ?> 

    <div id="content"> 
    </div> 
</div> 

</body> 
</html> 

contactform.php

<?PHP 
/* 
    Contact Form from HTML Form Guide 
    This program is free software published under the 
    terms of the GNU Lesser General Public License. 
    See this page for more info: 
    http://www.html-form-guide.com/contact-form/simple-php-contact-form.html 
*/ 
require_once("./include/fgcontactform.php"); 

$formproc = new FGContactForm(); 

//1. Add your email address here. 
//You can add more than one receipients. 
$formproc->AddRecipient('[email protected]'); //<<---Put your email address here 

//2. For better security. Get a random tring from this link: http://tinyurl.com/randstr 
// and put it here 
$formproc->SetFormRandomKey('CnRrspl1FyEylUj'); 

if(isset($_POST['submitted'])) 
{ 
    if($formproc->ProcessForm()) 
    { 
    $formproc->RedirectToURL("thank-you.php"); 
    } 
} 

?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> 
<head> 
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> 
    <title>Contact us</title> 
    <link rel="STYLESHEET" type="text/css" href="contact.css" /> 
    <script type='text/javascript' src='scripts/gen_validatorv31.js'></script> 
</head> 
<body> 

<!-- Form Code Start --> 
<form id='contactus' action='<?php echo $formproc->GetSelfScript(); ?>' method='post' accept-charset='UTF-8'> 
<fieldset > 
<legend>Contact us</legend> 

<input type='hidden' name='submitted' id='submitted' value='1'/> 
<input type='hidden' name='<?php echo $formproc->GetFormIDInputName(); ?>' value='<?php echo $formproc->GetFormIDInputValue(); ?>'/> 
<input type='text' class='spmhidip' name='<?php echo $formproc->GetSpamTrapInputName(); ?>' /> 

<div class='short_explanation'>* required fields</div> 

<div><span class='error'><?php echo $formproc->GetErrorMessage(); ?></span></div> 
<div class='container'> 
    <label for='name' >Your Full Name*: </label><br/> 
    <input type='text' name='name' id='name' value='<?php echo $formproc->SafeDisplay('name') ?>' maxlength="50" /><br/> 
    <span id='contactus_name_errorloc' class='error'></span> 
</div> 
<div class='container'> 
    <label for='email' >Email Address*:</label><br/> 
    <input type='text' name='email' id='email' value='<?php echo $formproc->SafeDisplay('email') ?>' maxlength="50" /><br/> 
    <span id='contactus_email_errorloc' class='error'></span> 
</div> 
<div class='container'> 
    <label for='phone' >Phone Number*:</label><br/> 
    <input type='text' name='phone' id='phone' value='<?php echo $formproc->SafeDisplay('phone') ?>' maxlength="15" /><br/> 
    <span id='contactus_phone_errorloc' class='error'></span> 
</div> 
<div class='container'> 
    <label for='message' >Message:</label><br/> 
    <span id='contactus_message_errorloc' class='error'></span> 
    <textarea rows="10" cols="50" name='message' id='message'><?php echo $formproc->SafeDisplay('message') ?></textarea> 
</div> 


<div class='container'> 
    <input type='submit' name='Submit' value='Submit' /> 
</div> 

</fieldset> 
</form> 
<!-- client-side Form Validations: 
Uses the excellent form validation script from JavaScript-coder.com--> 

<script type='text/javascript'> 
// <![CDATA[ 

    var frmvalidator = new Validator("contactus"); 
    frmvalidator.EnableOnPageErrorDisplay(); 
    frmvalidator.EnableMsgsTogether(); 
    frmvalidator.addValidation("name","req","Please provide your name"); 

    frmvalidator.addValidation("email","req","Please provide your email address"); 

    frmvalidator.addValidation("email","email","Please provide a valid email address"); 

    frmvalidator.addValidation("message","maxlen=2048","The message is too long!(more than 2KB!)"); 

    frmvalidator.addValidation("phone","req","Please provide your phone number"); 

// ]]> 
</script> 

</body> 
</html> 

fgcontactform.php

<?PHP 
/* 
    Contact Form from HTML Form Guide 

    This program is free software published under the 
    terms of the GNU Lesser General Public License. 

This program is distributed in the hope that it will 
be useful - WITHOUT ANY WARRANTY; without even the 
implied warranty of MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

@copyright html-form-guide.com 2010 
*/ 
require_once("class.phpmailer.php"); 

/* 
Interface to Captcha handler 
*/ 
class FG_CaptchaHandler 
{ 
    function Validate() { return false;} 
    function GetError(){ return '';} 
} 
/* 
FGContactForm is a general purpose contact form class 
It supports Captcha, HTML Emails, sending emails 
conditionally, File atachments and more. 
*/ 
class FGContactForm 
{ 
    var $receipients; 
    var $errors; 
    var $error_message; 
    var $name; 
    var $email; 
    var $message; 
    var $from_address; 
    var $form_random_key; 
    var $conditional_field; 
    var $arr_conditional_receipients; 
    var $fileupload_fields; 
    var $captcha_handler; 

    var $mailer; 

    function FGContactForm() 
    { 
     $this->receipients = array(); 
     $this->errors = array(); 
     $this->form_random_key = 'HTgsjhartag'; 
     $this->conditional_field=''; 
     $this->arr_conditional_receipients=array(); 
     $this->fileupload_fields=array(); 

     $this->mailer = new PHPMailer(); 
     $this->mailer->CharSet = 'utf-8'; 
    } 

    function EnableCaptcha($captcha_handler) 
    { 
     $this->captcha_handler = $captcha_handler; 
     session_start(); 
    } 

    function AddRecipient($email,$name="") 
    { 
     $this->mailer->AddAddress($email,$name); 
    } 

    function SetFromAddress($from) 
    { 
     $this->from_address = $from; 
    } 
    function SetFormRandomKey($key) 
    { 
     $this->form_random_key = $key; 
    } 
    function GetSpamTrapInputName() 
    { 
     return 'sp'.md5('KHGdnbvsgst'.$this->GetKey()); 
    } 
    function SafeDisplay($value_name) 
    { 
     if(empty($_POST[$value_name])) 
     { 
      return''; 
     } 
     return htmlentities($_POST[$value_name]); 
    } 
    function GetFormIDInputName() 
    { 
     $rand = md5('TygshRt'.$this->GetKey()); 

     $rand = substr($rand,0,20); 
     return 'id'.$rand; 
    } 


    function GetFormIDInputValue() 
    { 
     return md5('jhgahTsajhg'.$this->GetKey()); 
    } 

    function SetConditionalField($field) 
    { 
     $this->conditional_field = $field; 
    } 
    function AddConditionalReceipent($value,$email) 
    { 
     $this->arr_conditional_receipients[$value] = $email; 
    } 

    function AddFileUploadField($file_field_name,$accepted_types,$max_size) 
    { 

     $this->fileupload_fields[] = 
      array("name"=>$file_field_name, 
      "file_types"=>$accepted_types, 
      "maxsize"=>$max_size); 
    } 

    function ProcessForm() 
    { 
     if(!isset($_POST['submitted'])) 
     { 
      return false; 
     } 
     if(!$this->Validate()) 
     { 
      $this->error_message = implode('<br/>',$this->errors); 
      return false; 
     } 
     $this->CollectData(); 

     $ret = $this->SendFormSubmission(); 

     return $ret; 
    } 

    function RedirectToURL($url) 
    { 
     header("Location: $url"); 
     exit; 
    } 

    function GetErrorMessage() 
    { 
     return $this->error_message; 
    } 
    function GetSelfScript() 
    { 
     return htmlentities($_SERVER['PHP_SELF']); 
    } 

    function GetName() 
    { 
     return $this->name; 
    } 
    function GetEmail() 
    { 
     return $this->email; 
    } 
    function GetMessage() 
    { 
     return htmlentities($this->message,ENT_QUOTES,"UTF-8"); 
    } 

/*-------- Private (Internal) Functions -------- */ 


    function SendFormSubmission() 
    { 
     $this->CollectConditionalReceipients(); 

     $this->mailer->CharSet = 'utf-8'; 

     $this->mailer->Subject = "Contact form submission from $this->name"; 

     $this->mailer->From = $this->GetFromAddress(); 

     $this->mailer->FromName = $this->name; 

     $this->mailer->AddReplyTo($this->email); 

     $message = $this->ComposeFormtoEmail(); 

     $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); 
     $this->mailer->AltBody = @html_entity_decode($textMsg,ENT_QUOTES,"UTF-8"); 
     $this->mailer->MsgHTML($message); 

     $this->AttachFiles(); 

     if(!$this->mailer->Send()) 
     { 
      $this->add_error("Failed sending email!"); 
      return false; 
     } 

     return true; 
    } 

    function CollectConditionalReceipients() 
    { 
     if(count($this->arr_conditional_receipients)>0 && 
      !empty($this->conditional_field) && 
      !empty($_POST[$this->conditional_field])) 
     { 
      foreach($this->arr_conditional_receipients as $condn => $rec) 
      { 
       if(strcasecmp($condn,$_POST[$this->conditional_field])==0 && 
       !empty($rec)) 
       { 
        $this->AddRecipient($rec); 
       } 
      } 
     } 
    } 

    /* 
    Internal variables, that you donot want to appear in the email 
    Add those variables in this array. 
    */ 
    function IsInternalVariable($varname) 
    { 
     $arr_interanl_vars = array('scaptcha', 
          'submitted', 
          $this->GetSpamTrapInputName(), 
          $this->GetFormIDInputName() 
          ); 
     if(in_array($varname,$arr_interanl_vars)) 
     { 
      return true; 
     } 
     return false; 
    } 

    function FormSubmissionToMail() 
    { 
     $ret_str=''; 
     foreach($_POST as $key=>$value) 
     { 
      if(!$this->IsInternalVariable($key)) 
      { 
       $value = htmlentities($value,ENT_QUOTES,"UTF-8"); 
       $value = nl2br($value); 
       $key = ucfirst($key); 
       $ret_str .= "<div class='label'>$key :</div><div class='value'>$value </div>\n"; 
      } 
     } 
     foreach($this->fileupload_fields as $upload_field) 
     { 
      $field_name = $upload_field["name"]; 
      if(!$this->IsFileUploaded($field_name)) 
      { 
       continue; 
      }   

      $filename = basename($_FILES[$field_name]['name']); 

      $ret_str .= "<div class='label'>File upload '$field_name' :</div><div class='value'>$filename </div>\n"; 
     } 
     return $ret_str; 
    } 

    function ExtraInfoToMail() 
    { 
     $ret_str=''; 

     $ip = $_SERVER['REMOTE_ADDR']; 
     $ret_str = "<div class='label'>IP address of the submitter:</div><div class='value'>$ip</div>\n"; 

     return $ret_str; 
    } 

    function GetMailStyle() 
    { 
     $retstr = "\n<style>". 
     "body,.label,.value { font-family:Arial,Verdana; } ". 
     ".label {font-weight:bold; margin-top:5px; font-size:1em; color:#333;} ". 
     ".value {margin-bottom:15px;font-size:0.8em;padding-left:5px;} ". 
     "</style>\n"; 

     return $retstr; 
    } 
    function GetHTMLHeaderPart() 
    { 
     $retstr = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'."\n". 
        '<html><head><title></title>'. 
        '<meta http-equiv=Content-Type content="text/html; charset=utf-8">'; 
     $retstr .= $this->GetMailStyle(); 
     $retstr .= '</head><body>'; 
     return $retstr; 
    } 
    function GetHTMLFooterPart() 
    { 
     $retstr ='</body></html>'; 
     return $retstr ; 
    } 
    function ComposeFormtoEmail() 
    { 
     $header = $this->GetHTMLHeaderPart(); 
     $formsubmission = $this->FormSubmissionToMail(); 
     $extra_info = $this->ExtraInfoToMail(); 
     $footer = $this->GetHTMLFooterPart(); 

     $message = $header."Submission from 'contact us' form:<p>$formsubmission</p><hr/>$extra_info".$footer; 

     return $message; 
    } 

    function AttachFiles() 
    { 
     foreach($this->fileupload_fields as $upld_field) 
     { 
      $field_name = $upld_field["name"]; 
      if(!$this->IsFileUploaded($field_name)) 
      { 
       continue; 
      } 

      $filename =basename($_FILES[$field_name]['name']); 

      $this->mailer->AddAttachment($_FILES[$field_name]["tmp_name"],$filename); 
     } 
    } 

    function GetFromAddress() 
    { 
     if(!empty($this->from_address)) 
     { 
      return $this->from_address; 
     } 

     $host = $_SERVER['SERVER_NAME']; 

     $from ="[email protected]$host"; 
     return $from; 
    } 

    function Validate() 
    { 
     $ret = true; 
     //security validations 
     if(empty($_POST[$this->GetFormIDInputName()]) || 
      $_POST[$this->GetFormIDInputName()] != $this->GetFormIDInputValue()) 
     { 
      //The proper error is not given intentionally 
      $this->add_error("Automated submission prevention: case 1 failed"); 
      $ret = false; 
     } 

     //This is a hidden input field. Humans won't fill this field. 
     if(!empty($_POST[$this->GetSpamTrapInputName()])) 
     { 
      //The proper error is not given intentionally 
      $this->add_error("Automated submission prevention: case 2 failed"); 
      $ret = false; 
     } 

     //name validations 
     if(empty($_POST['name'])) 
     { 
      $this->add_error("Please provide your name"); 
      $ret = false; 
     } 
     else 
     if(strlen($_POST['name'])>50) 
     { 
      $this->add_error("Name is too big!"); 
      $ret = false; 
     } 

     //email validations 
     if(empty($_POST['email'])) 
     { 
      $this->add_error("Please provide your email address"); 
      $ret = false; 
     } 
     else 
     if(strlen($_POST['email'])>50) 
     { 
      $this->add_error("Email address is too big!"); 
      $ret = false; 
     } 
     else 
     if(!$this->validate_email($_POST['email'])) 
     { 
      $this->add_error("Please provide a valid email address"); 
      $ret = false; 
     } 

     //message validaions 
     if(strlen($_POST['message'])>2048) 
     { 
      $this->add_error("Message is too big!"); 
      $ret = false; 
     } 

     //captcha validaions 
     if(isset($this->captcha_handler)) 
     { 
      if(!$this->captcha_handler->Validate()) 
      { 
       $this->add_error($this->captcha_handler->GetError()); 
       $ret = false; 
      } 
     } 
     //file upload validations 
     if(!empty($this->fileupload_fields)) 
     { 
     if(!$this->ValidateFileUploads()) 
     { 
      $ret = false; 
     } 
     } 
     return $ret; 
    } 

    function ValidateFileType($field_name,$valid_filetypes) 
    { 
     $ret=true; 
     $info = pathinfo($_FILES[$field_name]['name']); 
     $extn = $info['extension']; 
     $extn = strtolower($extn); 

     $arr_valid_filetypes= explode(',',$valid_filetypes); 
     if(!in_array($extn,$arr_valid_filetypes)) 
     { 
      $this->add_error("Valid file types are: $valid_filetypes"); 
      $ret=false; 
     } 
     return $ret; 
    } 

    function ValidateFileSize($field_name,$max_size) 
    { 
     $size_of_uploaded_file = 
       $_FILES[$field_name]["size"]/1024;//size in KBs 
     if($size_of_uploaded_file > $max_size) 
     { 
      $this->add_error("The file is too big. File size should be less than $max_size KB"); 
      return false; 
     } 
     return true; 
    } 

    function IsFileUploaded($field_name) 
    { 
     if(empty($_FILES[$field_name]['name'])) 
     { 
      return false; 
     } 
     if(!is_uploaded_file($_FILES[$field_name]['tmp_name'])) 
     { 
      return false; 
     } 
     return true; 
    } 
    function ValidateFileUploads() 
    { 
     $ret=true; 
     foreach($this->fileupload_fields as $upld_field) 
     { 
      $field_name = $upld_field["name"]; 

      $valid_filetypes = $upld_field["file_types"]; 

      if(!$this->IsFileUploaded($field_name)) 
      { 
       continue; 
      } 

      if($_FILES[$field_name]["error"] != 0) 
      { 
       $this->add_error("Error in file upload; Error code:".$_FILES[$field_name]["error"]); 
       $ret=false; 
      } 

      if(!empty($valid_filetypes) && 
      !$this->ValidateFileType($field_name,$valid_filetypes)) 
      { 
       $ret=false; 
      } 

      if(!empty($upld_field["maxsize"]) && 
      $upld_field["maxsize"]>0) 
      { 
       if(!$this->ValidateFileSize($field_name,$upld_field["maxsize"])) 
       { 
        $ret=false; 
       } 
      } 

     } 
     return $ret; 
    } 

    function StripSlashes($str) 
    { 
     if(get_magic_quotes_gpc()) 
     { 
      $str = stripslashes($str); 
     } 
     return $str; 
    } 
    /* 
    Sanitize() function removes any potential threat from the 
    data submitted. Prevents email injections or any other hacker attempts. 
    if $remove_nl is true, newline chracters are removed from the input. 
    */ 
    function Sanitize($str,$remove_nl=true) 
    { 
     $str = $this->StripSlashes($str); 

     if($remove_nl) 
     { 
      $injections = array('/(\n+)/i', 
       '/(\r+)/i', 
       '/(\t+)/i', 
       '/(%0A+)/i', 
       '/(%0D+)/i', 
       '/(%08+)/i', 
       '/(%09+)/i' 
       ); 
      $str = preg_replace($injections,'',$str); 
     } 

     return $str; 
    } 

    /*Collects clean data from the $_POST array and keeps in internal variables.*/ 
    function CollectData() 
    { 
     $this->name = $this->Sanitize($_POST['name']); 
     $this->email = $this->Sanitize($_POST['email']); 

     /*newline is OK in the message.*/ 
     $this->message = $this->StripSlashes($_POST['message']); 
    } 

    function add_error($error) 
    { 
     array_push($this->errors,$error); 
    } 
    function validate_email($email) 
    { 
     return eregi("^[_\.0-9a-zA-Z-][email protected]([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$", $email); 
    } 

    function GetKey() 
    { 
     return $this->form_random_key.$_SERVER['SERVER_NAME'].$_SERVER['REMOTE_ADDR']; 
    } 

} 

?> 
+0

你可以發佈錯誤頁面的內容嗎? – Macros 2012-01-06 08:12:49

+0

標題前沒有輸出,這個怎麼不清楚? – 2012-01-06 08:28:36

+0

錯誤消息是錯誤頁面上顯示的唯一文本嗎?是否顯示任何其他錯誤/警告? – Macros 2012-01-06 08:28:59

回答

1

contactform.php顯然沒有爲您的使用創造了index.php

<body> 
<div id="container"> 
    <div id="header"> 
     ... 
    </div> 
    <?php 
     include ('contactform.php') 
    ?> 

    <div id="content"> 
     ... 
    </div> 
</div> 

</body> 
</html> 

相反,它有它的它自己的輸出和處理邏輯。閱讀usage terms,該軟件還沒有被寫入到適合特定用途:

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM 「AS IS」 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

您需要採用contact.php文件本身,使之與您的網站的工作。或者使用<iframe> element`­MDC來「包含」它。

+0

我並沒有完全理解你說的話,但是......它幫助我在短短几分鐘內開發出一個工作解決方案。謝謝! 我曾嘗試從contact.php中刪除和元素,但單靠這一點無法解決問題。 我最終做的是將contact.php的整個部分截至幷包括並將其添加到我的index.php中,替換曾經存在的內容。然後,我刪除了contact.php中的和元素,但仍將其與過去相同的方式鏈接到index.php。這完全解決了這個問題。謝謝! – 2012-01-06 23:39:34

+0

在成爲一名合法的Web開發人員以及學習PHP之外,我可以說做最好的方法就是使用