2

Does anyone see how headers could be sent in this script? I am using this script to validate a form. As a result it is causing headers to be sent so when I try to direct a user after implementing this script it causes the normal "Warning: Cannot modify header information - headers already sent" message. Here is the script:

<?php
class ValidatorObj
{
    var $variable_name;
    var $validator_string;
 var $error_string;
} 

/**
* Base class for custom validation objects
**/
 class CustomValidator 
 {
    function DoValidate(&$formars,&$error_hash)
{
    return true;
}
}

/** Default error messages*/
define("E_VAL_REQUIRED_VALUE","Please enter the value for %s");
define("E_VAL_MAXLEN_EXCEEDED","Maximum length exceeded for %s.");
define("E_VAL_MINLEN_CHECK_FAILED","Please enter input with length more than %d for %s");
define("E_VAL_ALNUM_CHECK_FAILED","Please provide an alpha-numeric input for %s");
define("E_VAL_ALNUM_S_CHECK_FAILED","Please provide an alpha-numeric input for %s");
define("E_VAL_NUM_CHECK_FAILED","Please provide numeric input for %s");
define("E_VAL_ALPHA_CHECK_FAILED","Please provide alphabetic input for %s");
define("E_VAL_ALPHA_S_CHECK_FAILED","Please provide alphabetic input for %s");
define("E_VAL_EMAIL_CHECK_FAILED","Please provide a valida email address");
define("E_VAL_LESSTHAN_CHECK_FAILED","Enter a value less than %f for %s");
define("E_VAL_GREATERTHAN_CHECK_FAILED","Enter a value greater than %f for %s");
define("E_VAL_REGEXP_CHECK_FAILED","Please provide a valid input for %s");
define("E_VAL_DONTSEL_CHECK_FAILED","Wrong option selected for %s");
define("E_VAL_SELMIN_CHECK_FAILED","Please select minimum %d options for %s");
define("E_VAL_SELONE_CHECK_FAILED","Please select an option for %s");
define("E_VAL_EQELMNT_CHECK_FAILED","Value of %s should be same as that of %s");
define("E_VAL_NEELMNT_CHECK_FAILED","Value of %s should not be same as that of %s");

class FormValidator 
{
    var $validator_array;
    var $error_hash;
    var $custom_validators;

function FormValidator()
{
    $this->validator_array = array();
    $this->error_hash = array();
    $this->custom_validators=array();
}

function AddCustomValidator(&$customv)
{
    array_push($this->custom_validators,$customv);
}

function addValidation($variable,$validator,$error)
{
    $validator_obj = new ValidatorObj();
    $validator_obj->variable_name = $variable;
    $validator_obj->validator_string = $validator;
    $validator_obj->error_string = $error;
    array_push($this->validator_array,$validator_obj);
}
function GetErrors()
{
    return $this->error_hash;
}

function ValidateForm()
{
    $bret = true;

    $error_string="";
    $error_to_display = "";


    if(strcmp($_SERVER['REQUEST_METHOD'],'POST')==0)
    {
        $form_variables = $_POST;
    }
    else
    {
        $form_variables = $_GET;
    }

    $vcount = count($this->validator_array);


    foreach($this->validator_array as $val_obj)
    {
        if(!$this->ValidateObject($val_obj,$form_variables,$error_string))
        {
            $bret = false;
            $this->error_hash[$val_obj->variable_name] = $error_string;
        }
    }

    if(true == $bret && count($this->custom_validators) > 0)
    {
        foreach( $this->custom_validators as $custom_val)
        {
            if(false == $custom_val->DoValidate($form_variables,$this->error_hash))
            {
                $bret = false;
            }
        }
    }
    return $bret;
}


function ValidateObject($validatorobj,$formvariables,&$error_string)
{
    $bret = true;

    $splitted = explode("=",$validatorobj->validator_string);
    $command = $splitted[0];
    $command_value = '';

    if(isset($splitted[1]) && strlen($splitted[1])>0)
    {
        $command_value = $splitted[1];
    }

    $default_error_message="";

    $input_value ="";

    if(isset($formvariables[$validatorobj->variable_name]))
    {
     $input_value = $formvariables[$validatorobj->variable_name];
    }

    $bret = $this->ValidateCommand($command,$command_value,$input_value,
                                $default_error_message,
                                $validatorobj->variable_name,
                                $formvariables);


    if(false == $bret)
    {
        if(isset($validatorobj->error_string) &&
            strlen($validatorobj->error_string)>0)
        {
            $error_string = $validatorobj->error_string;
        }
        else
        {
            $error_string = $default_error_message;
        }

    }//if
    return $bret;
}

function validate_req($input_value, &$default_error_message,$variable_name)
{
  $bret = true;
    if(!isset($input_value) ||
        strlen($input_value) <=0)
    {
        $bret=false;
        $default_error_message = sprintf(E_VAL_REQUIRED_VALUE,$variable_name);
    }   
  return $bret; 
}

function validate_maxlen($input_value,$max_len,$variable_name,&$default_error_message)
{
    $bret = true;
    if(isset($input_value) )
    {
        $input_length = strlen($input_value);
        if($input_length > $max_len)
        {
            $bret=false;
            $default_error_message = sprintf(E_VAL_MAXLEN_EXCEEDED,$variable_name);
        }
    }
    return $bret;
}

function validate_minlen($input_value,$min_len,$variable_name,&$default_error_message)
{
    $bret = true;
    if(isset($input_value) )
    {
        $input_length = strlen($input_value);
        if($input_length < $min_len)
        {
            $bret=false;
            $default_error_message = sprintf(E_VAL_MINLEN_CHECK_FAILED,$min_len,$variable_name);
        }
    }
    return $bret;
}

function test_datatype($input_value,$reg_exp)
{
    if(ereg($reg_exp,$input_value))
    {
        return false;
    }
    return true;
}

function validate_email($email) 
{
    return eregi("^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$", $email);
}

function validate_for_numeric_input($input_value,&$validation_success)
{

    $more_validations=true;
    $validation_success = true;
    if(strlen($input_value)>0)
    {

        if(false == is_numeric($input_value))
        {
            $validation_success = false;
            $more_validations=false;
        }
    }
    else
    {
        $more_validations=false;
    }
    return $more_validations;
}

function validate_lessthan($command_value,$input_value,
            $variable_name,&$default_error_message)
{
    $bret = true;
    if(false == $this->validate_for_numeric_input($input_value,
                                $bret))
    {
        return $bret;
    }
    if($bret)
    {
        $lessthan = doubleval($command_value);
        $float_inputval = doubleval($input_value);
        if($float_inputval >= $lessthan)
        {
            $default_error_message = sprintf(E_VAL_LESSTHAN_CHECK_FAILED,
                                    $lessthan,
                                    $variable_name);
            $bret = false;
        }//if
    }
    return $bret ;
}

function validate_greaterthan($command_value,$input_value,$variable_name,&$default_error_message)
{
    $bret = true;
    if(false == $this->validate_for_numeric_input($input_value,$bret))
    {
        return $bret;
    }
    if($bret)
    {
        $greaterthan = doubleval($command_value);
        $float_inputval = doubleval($input_value);
        if($float_inputval <= $greaterthan)
        {
            $default_error_message = sprintf(E_VAL_GREATERTHAN_CHECK_FAILED,
                                    $greaterthan,
                                    $variable_name);
            $bret = false;
        }//if
    }
    return $bret ;
}

function validate_select($input_value,$command_value,&$default_error_message,$variable_name)
{
    $bret=false;
    if(is_array($input_value))
    {
        foreach($input_value as $value)
        {
            if($value == $command_value)
            {
                $bret=true;
                break;
            }
        }
    }
    else
    {
        if($command_value == $input_value)
        {
            $bret=true;
        }
    }
    if(false == $bret)
    {
        $default_error_message = sprintf(E_VAL_SHOULD_SEL_CHECK_FAILED,
                                        $command_value,$variable_name);
    }
    return $bret;
}

function validate_dontselect($input_value,$command_value,&$default_error_message,$variable_name)
{
   $bret=true;
    if(is_array($input_value))
    {
        foreach($input_value as $value)
        {
            if($value == $command_value)
            {
                $bret=false;
                $default_error_message = sprintf(E_VAL_DONTSEL_CHECK_FAILED,$variable_name);
                break;
            }
        }
    }
    else
    {
        if($command_value == $input_value)
        {
            $bret=false;
            $default_error_message = sprintf(E_VAL_DONTSEL_CHECK_FAILED,$variable_name);
        }
    }
  return $bret;
}



function ValidateCommand($command,$command_value,$input_value,&$default_error_message,$variable_name,$formvariables)
{
    $bret=true;
    switch($command)
    {
        case 'req':
                    {
                        $bret = $this->validate_req($input_value, $default_error_message,$variable_name);
                        break;
                    }

        case 'maxlen':
                    {
                        $max_len = intval($command_value);
                        $bret = $this->validate_maxlen($input_value,$max_len,$variable_name,
                                            $default_error_message);
                        break;
                    }

        case 'minlen':
                    {
                        $min_len = intval($command_value);
                        $bret = $this->validate_minlen($input_value,$min_len,$variable_name,
                                        $default_error_message);
                        break;
                    }

        case 'alnum':
                    {
                        $bret= $this->test_datatype($input_value,"[^A-Za-z0-9]");
                        if(false == $bret)
                        {
                            $default_error_message = sprintf(E_VAL_ALNUM_CHECK_FAILED,$variable_name);
                        }
                        break;
                    }

        case 'alnum_s':
                    {
                        $bret= $this->test_datatype($input_value,"[^A-Za-z0-9 ]");
                        if(false == $bret)
                        {
                            $default_error_message = sprintf(E_VAL_ALNUM_S_CHECK_FAILED,$variable_name);
                        }
                        break;
                    }

        case 'num':
        case 'numeric':
                    {
                        $bret= $this->test_datatype($input_value,"[^0-9]");
                        if(false == $bret)
                        {
                            $default_error_message = sprintf(E_VAL_NUM_CHECK_FAILED,$variable_name);
                        }
                        break;                          
                    }

        case 'alpha':
                    {
                        $bret= $this->test_datatype($input_value,"[^A-Za-z]");
                        if(false == $bret)
                        {
                            $default_error_message = sprintf(E_VAL_ALPHA_CHECK_FAILED,$variable_name);
                        }
                        break;
                    }
        case 'alpha_s':
                    {
                        $bret= $this->test_datatype($input_value,"[^A-Za-z ]");
                        if(false == $bret)
                        {
                            $default_error_message = sprintf(E_VAL_ALPHA_S_CHECK_FAILED,$variable_name);
                        }
                        break;
                    }
        case 'email':
                    {
                        if(isset($input_value) && strlen($input_value)>0)
                        {
                            $bret= $this->validate_email($input_value);
                            if(false == $bret)
                            {
                                $default_error_message = E_VAL_EMAIL_CHECK_FAILED;
                            }
                        }
                        break;
                    }
        case "lt": 
        case "lessthan": 
                    {
                        $bret = $this->validate_lessthan($command_value,
                                                $input_value,
                                                $variable_name,
                                                $default_error_message);
                        break;
                    }
        case "gt": 
        case "greaterthan": 
                    {
                        $bret = $this->validate_greaterthan($command_value,
                                                $input_value,
                                                $variable_name,
                                                $default_error_message);
                        break;
                    }

        case "regexp":
                    {
                        if(isset($input_value) && strlen($input_value)>0)
                        {
                            if(!preg_match("$command_value",$input_value))
                            {
                                $bret=false;
                                $default_error_message = sprintf(E_VAL_REGEXP_CHECK_FAILED,$variable_name);
                            }
                        }
                        break;
                    }
      case "dontselect": 
      case "dontselectchk":
      case "dontselectradio":
                    {
                        $bret = $this->validate_dontselect($input_value,
                                                           $command_value,
                                                           $default_error_message,
                                                            $variable_name);
                         break;
                    }//case

      case "shouldselchk":
      case "selectradio":
                  {
                        $bret = $this->validate_select($input_value,
                               $command_value,
                               $default_error_message,
                                $variable_name);
                        break;
                  }//case
      case "selmin":
                    {
                        $min_count = intval($command_value);

                        if(isset($input_value))
                        {
                            if($min_count > 1)
                            {
                                $bret = (count($input_value) >= $min_count )?true:false;
                            }
                            else
                            {
                              $bret = true;
                            }
                        }
                        else
                        {
                            $bret= false;
                            $default_error_message = sprintf(E_VAL_SELMIN_CHECK_FAILED,$min_count,$variable_name);
                        }

                        break;
                    }//case
     case "selone":
                    {
                        if(false == isset($input_value)||
                            strlen($input_value)<=0)
                        {
                            $bret= false;
                            $default_error_message = sprintf(E_VAL_SELONE_CHECK_FAILED,$variable_name);
                        }
                        break;
                    }
     case "eqelmnt":
                    {

                        if(isset($formvariables[$command_value]) &&
                           strcmp($input_value,$formvariables[$command_value])==0 )
                        {
                            $bret=true;
                        }
                        else
                        {
                            $bret= false;
                            $default_error_message = sprintf(E_VAL_EQELMNT_CHECK_FAILED,$variable_name,$command_value);
                        }
                    break;
                    }
      case "neelmnt":
                    {
                        if(isset($formvariables[$command_value]) &&
                           strcmp($input_value,$formvariables[$command_value]) !=0 )
                        {
                            $bret=true;
                        }
                        else
                        {
                            $bret= false;
                            $default_error_message = sprintf(E_VAL_NEELMNT_CHECK_FAILED,$variable_name,$command_value);
                        }
                        break;
                    }
    }//switch
    return $bret;
}//validdate command
}?> 
Jason
  • 221
  • 3
  • 11
  • The error message will tell you where the output started. You can otherwise use [headers_sent](http://php.net/headers_sent) to do the same. – netcoder Feb 06 '11 at 02:10
  • It is saying the output started on the very last line where you see the }?> – Jason Feb 06 '11 at 02:13

3 Answers3

7

after .the }?>

if you select all (Ctrl+A) you will see the white space proceeding the ?>

Alexander Yancharuk
  • 13,817
  • 5
  • 55
  • 55
RobertPitt
  • 56,863
  • 21
  • 114
  • 161
  • You, sir, just saved the other half of my hair I hadn't yet pulled out. That fixed it, thank you so much. – Jason Feb 06 '11 at 02:18
  • 2
    @Jason: It is usually recommended to omit the ending `?>` tag specifically to avoid such problems. – netcoder Feb 06 '11 at 02:26
2

There is likely whitespace after the closing ?> tag. It's become quite common practice to leave off the ending ?> tag to prevent this exactly issue. But that can only be done in files that contain only code in classes, no procedural code.

xzyfer
  • 13,937
  • 5
  • 35
  • 46
2

To add on to RobertPitt, if your file is solely PHP only, add the <?php at the start, and remove the ?> to prevent careless whitespaces at the back.

mauris
  • 42,982
  • 15
  • 99
  • 131
  • Thank you, that is good to know. In this case there is html involved but I will keep that in mind for the future. – Jason Feb 06 '11 at 02:26
  • Separate your HTML code from PHP code. best to use a template manager. That'll keep your code neat and tidy. – mauris Feb 06 '11 at 02:27