Page 1 of 1

Regarding Cannot Modify Header Information?

Posted: Fri Jun 15, 2007 8:24 am
by maddenuk
I've been working on some form validation using AJAX and PHP. I've been working from a script however i keep getting an error regarding cannot modify header information. Check the link below and click one of the input fields a javascript message will pop up.

I've had this problem before and am not 100% sure why this occurs and how i can prevent it.

Any advice?

http://www.creativebubbles.co.uk/demo1/ ... gister.php

Code: Select all

<?

session_start();

if (!isset($_SESSION['values']))
{
	$_SESSION['values']['txtName'] = '';
	$_SESSION['values']['txtEmail'] = '';
	$_SESSION['values']['txtEmailChecker'] = '';
	$_SESSION['values']['txtUsername'] = '';
	$_SESSION['values']['txtPassword'] = '';
	$_SESSION['values']['txtPasswordChecker'] = '';
}

if (!isset($_SESSION['errors']))
{

	$_SESSION['errors']['txtName'] = 'hidden';
	$_SESSION['errors']['txtEmail'] = 'hidden';
	$_SESSION['errors']['txtEmailChecker'] = 'hidden';
	$_SESSION['errors']['txtUsername'] = 'hidden';
	$_SESSION['errors']['txtPassword'] = 'hidden';
	$_SESSION['errors']['txtPasswordChecker'] = 'hidden';

}

 ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<link href="./../style/ipi.css" rel="stylesheet" type="text/css" />
<link href="./../style/validate.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../scripts/validate.js"></script>
</head>
<body onload="setFocus()">
<!--<div id="wrapper">
  <div id="header">
    <div id="nav"><span class="nav_txt">Home&nbsp;|&nbsp;Justification&nbsp;|&nbsp;Mortgage&nbsp;|&nbsp;Property&nbsp;|&nbsp;Services&nbsp;|&nbsp;Testimonials&nbsp;|&nbsp;Contact</span></div>
  </div>

  <div id="main">
    <div id="img_holder">
      <div align="right"><img src="./../images/register_img.jpg" width="492" height="220" hspace="2" /></div>
    </div>
    <div id="reg_txt_area1">
      <span class="reg_title1">Register With IPI </span>
      <span class="reg_txt">It's FREE to register & incurs no obligation. Simply fill in your details and we'll keep you up-to-date with the very latest investment opportunities.<br />
    <br />
    As well as this you will have access to our members section which contains full details of all our investments. </span><span class="reg_title2">Fill in your details below</span></div>
  </div> -->
  	  	<form name="frmRegistration" action="validate.php?validationType=php" method="post" enctype="multipart/form-data">

    <div id="form_area">
      <div id="form_details">
        <table width="100%" border="0" cellpadding="0" cellspacing="0" class="form_txt">
          <tr>
            <td width="46%"><label for="txtName">Name</label></td>
            <td width="54%"><input type="text" name="txtName" maxlength="100" id="txtName" onblur="validate(this.value, this.id)" value="<?php echo $_SESSION['values']['txtName'] ?>" />
			</td>
          </tr>
		  <tr>
		  	<td colspan="1"></td><td><span id="txtNameFailed" class="<? echo $_SESSION['errors']['txtName'] ?>">You havent entered the correct a Name.</span></td>
		  </tr>
          <tr>
            <td width="46%"><label for="txtEmail">Email</label></td>
            <td width="54%"><input type="text" name="txtEmail" maxlength="250" id="txtEmail" onblur="validate(this.value, this.id)" value="<?php echo $_SESSION['values']['txtEmail'] ?>" />
			
			
			</td>
          </tr>
		  <tr>
		  	<td colspan="1"></td><td><span id="txtEmailFailed" class="<? echo $_SESSION['errors']['txtEmail'] ?>">Invalid email address.</span></td>
		  </tr>
          <tr>
            <td width="46%"><label for="txtEmailCheck">Confirm Email</label></td>
            <td width="54%"><input type="text" name="txtEmailCheck" maxlength="250" id="txtEmailCheck" onblur="validate(this.value, this.id)" value="<?php echo $_SESSION['values']['txtEmailCheck'] ?>" />
			
			
			</td>
          </tr>
		   </tr>
		  <tr>
		  	<td colspan="1"></td><td><span id="txtEmailCheckFailed" class="<? echo $_SESSION['errors']['txtEmailCheck'] ?>">Email addresses dont match.</span></td>
		  </tr>
        </table>
      </div>
	
      <div id="form_user">
        <table width="100%" border="0" cellpadding="0" cellspacing="0" class="form_txt">
           <tr>
            <td width="46%"><label for="txtUsername">Name</label></td>
            <td width="54%"><input type="text" name="txtUsername" maxlength="30" id="txtUsername" onblur="validate(this.value, this.id)" value="<?php echo $_SESSION['values']['txtUsername'] ?>" />
			
			
			</td>
          </tr>
		   <tr>
		  	<td colspan="1"></td><td><span id="txtUsernameFailed" class="<? echo $_SESSION['errors']['txtUsername'] ?>">This Username is in use, or you havent entered the correct username.</span></td>
		  </tr>
          <tr>
            <td width="46%"><label for="txtPassword">Password</label></td>
            <td width="54%"><input type="text" name="txtPassword" maxlength="8" id="txtPassword" onblur="validate(this.value, this.id)" value="<?php echo $_SESSION['values']['txtPassword'] ?>" />
			
			
			</td>
          </tr>
		   <tr>
		  	<td colspan="1"></td><td><span id="txtPasswordFailed" class="<? echo $_SESSION['errors']['txtPassword'] ?>">Invalid email address.</span></td>
		  </tr>
             <tr>
            <td width="46%"><label for="txtPasswordCheck">Confirm Password</label></td>
            <td width="54%"><input type="text" name="txtPasswordCheck" maxlength="8" id="txtPasswordCheck" onblur="validate(this.value, this.id)" value="<?php echo $_SESSION['values']['txtPasswordCheck'] ?>" />
			
			
			</td>
          </tr>
		    <tr>
		  	<td colspan="1"></td><td><span id="txtPasswordCheckFailed" class="<? echo $_SESSION['errors']['txtPasswordCheck'] ?>">Passwords entered dont match.</span></td>
		  </tr>
      </table></div>
      <span class="reg_title3">Your Details</span>
      <span class="reg_title4">Your Username</span>
      <input name="Submit" type="submit" class="submit" value="Submit" />
      <input name="Submit2" type="reset" class="reset" value="Reset" />
	
</div>
  </form>
  
  
</div>
</body>
</html>




validate.php

Code: Select all

<?

//start PHP session
session_start();

//load error handling script and validation class
require_once('./../scripts/error_handler.php');
require_once('./../scripts/validate.class.php');

$validator = new Validate();

//read validationType (PHP or AJAX)
$validationType = '';
if (isset($_GET['validationType']))
	{

		$validationType = $_GET['validationType'];
	}

if ($validationType == 'php')
{
	header("Location:" . $validator->ValidatePHP());
}
else
{
	$response = 
	'<?xml version ="1.0" encoding="UTF-8" standalone="yes"?>' .
	'<response>' .
		'<result>' .
			$validator->ValidateAJAX($_POST['inputValue'], $_POST['fieldID']) .
		'</result>' .
		'<fieldid>' .
			$_POST['fieldID'] .
		'</fieldid>' .
	'</response>';
	//generate the response
	if(ob_get_length()) ob_clean();
	header('Content-Type: text/xml');
	echo $response;
}



?>
validate.class.php

Code: Select all

<?php
require_once('config.php');

//Class supports Ajax and PHP for validation

class Validate

{
	private $mMysqli;
	
	//constructor opens database connection
	
	function __construct() {
	
	$this->mMysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
	
	}
	
	//destructor closes database connection
	
	function __destruct() {
	
	$this->mMysqli->close();
	
	}
	
	public function ValidateAJAX($inputValue, $fieldID)
	{
	
		switch($fieldID)
		{
			case 'txtName':
			return $this->validateName($inputValue);
			break;
			case 'txtEmail';
			return $this->validateEmail($inputValue);
			break;
			case 'txtUsername';
			return $this->validateUsername($inputValue);
			break;
			case 'txtPassword':
			return $this->validatePassword($inputValue);
			break;
		
		}	
	}
	
	
	public function ValidatePHP()
	{
		//error flag, becomes 1 when errors are found.
		
		$errorsExist = 0;
		
		//clear the errors session flag
		if (isset($_SESSION['errors']))
		unset($_SESSION['errors']);
		
		//by default all fields are considered valid
		$_SESSION['errors']['txtName'] = 'hidden';
		$_SESSION['errors']['txtEmail'] = 'hidden';
		$_SESSION['errors']['txtEmailChecker'] = 'hidden';
		$_SESSION['errors']['txtUsername'] = 'hidden';		
		$_SESSION['errors']['txtPassword'] = 'hidden';
		$_SESSION['errors']['txtPasswordChecker'] = 'hidden';
		
		
				
		if (!$this->validateName($_POST['txtName']))
		{
			$_SESSION['errors']['txtName'] = 'error';
			$errorsExist = 1;
		}
		
		if (!$this->validateEmail($_POST['txtEmail']))
		{
			$_SESSION['errors']['txtEmail'] = 'error';
			$errorsExist = 1;
		}
		
		
		if (!$this->validateUsername($_POST['txtUsername']))
		{
			$_SESSION['errors']['txtUsername'] = 'error';
			$errorsExist = 1;
		}
		
		if (!$this->validatePassword($_POST['txtPassword']))
		{
			$_SESSION['errors']['txtPassword'] = 'error';
			$errorsExist = 1;
		}
		
		
		
		
		//if no errors are found, point to a succesful validation page
		if ($errorsExist == 0)
		{
			return 'allock.php';
		}
		else
		{
			foreach ($_POST as $key => $value)
			{
				$_SESSION['values'][$key] = $_POST[$key];
			}
			return 'register.php';
		}
	}


	private function validateUserName($value) 
	{
	
		$value = $this->mMysqli->real_escape_string(trim($value));
		if ($value == null)
		return 0;
		
		$query = $this->mMysqli->query('SELECT * FROM users '.
										'WHERE username= "' .$value.'"');
		if($this->mMysqli->affected_rows > 0)
			return '0';
			else
			return '1';
	}
	
	
	private function validateName($value)
	{
	
		$value = trim($value);
		
		if($value)
			return 1;
			else
			return 0;
	}
	
	
	private function validatePassword($value)
	{
	
		$value = trim($value);
		
		if($value)
			return 1;
			else
			return 0;
	}
	
	
	private function validateEmail($value)
	{
	
		return(!eregi('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[_a-z0-9-]+(\.[_a-z0-9-]+)*(\.[a-z]{2,3})$', $value)) ? 0 : 1;
	}
}


?>
[/syntax]

Posted: Fri Jun 15, 2007 8:30 am
by feyd
It's a common enough error that we've had a tutorial about it for years. Please seek it out.

:)

Posted: Fri Jun 15, 2007 1:57 pm
by RobertGonzalez
First rule is to make sure there is no output anywhere before any response headers are sent.