Troy Cost
Troy Cost

Reputation: 67

Undefined function error in PHP but can't see why?

I am doing a log in form which has different PHP scripts that link together. I have already posted one of those scripts here and corrected some errors in it. I have tried for hours to make these work but it isn't happening. I get the error

Fatal error: Call to undefined function validate() in C:\Program Files\Abyss Web Server\htdocs\login_action.php on line 21

OK, so I looked at "Login Tools.php" and I had already made some corrections to it. The function appears to be defined correctly. I am copying this code from a PHP newbie book - In Easy Steps. I also looked at the other script Login Action.php, but can't see any errors with that either.

I will show you "Login action.php" first. I know some of you won't like the methods the book uses but I am just copying from the book so I am not choosing the way the script is typed.

<?php

if ( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' )
{
 require ( '../connect_db.php' ) ;

 require ( 'login_tools.php' ) ;

 list ( $check , $data ) =
   validate ( $dbc , $_POST[ 'email' ] , $_POST[ 'pass' ] ) ;

 if ( $check )
  {
   session_start() ;

   $_SESSION[ 'user_id' ] = $data[ 'user_id' ] ;
   $_SESSION[ 'first_name' ] = $data[ 'first_name' ] ;
   $_SESSION[ 'last_name' ] = $data[ 'last_name' ] ;

   load ( 'home.php' ) ;

   }
   else { $errors = $data ; }

   mysqli_close( $dbc ) ;

} 

?> 

So the above script uses the function that is defined in the script below. I have been through both of these and even corrected errors, but can't find why the function is coming up as undefined??

<?php

function load( $page = 'login.php' )

{

$url = 'http://' . $_SERVER[ 'HTTP_HOST' ] .
               dirname( $_SERVER[ 'PHP_SELF' ] ) ;

$url = rtrim( $url , '^\\' ) ;

$url .= '/' . $page ;

header( "Location: $url" ) ;
return;


function validate( $dbc , $email = '' , $pwd = '')

{

$errors = array() ;

if ( empty( $email ) )
{ $errors[] = 'Enter your email address.' ; }

else 

{ $e = mysqli_real_escape_string( $dbc, trim( $email ) ) ; }

if ( empty( $pwd ) )
{ $errors[] = 'Enter your password.' ; }

else 

{ $p = mysqli_real_escape_string( $dbc, trim( $pwd ) ) ; }

if ( empty( $errors ))
{
 $q = "SELECT user_id, first_name, last_name, 
   FROM users
   WHERE email = '$e'
   AND pass = SHA1( '$p' ) " ;

$r = mysqli_query ( $dbc , $q ) ;

if ( mysqli_num_rows( $r ) == 1 )
 {
  $row = mysqli_fetch_array ( $r , MYSQLI_ASSOC ) ;
  return array( true , $row ) ;
 }

 else
 { $errors[] = 'Email address and password not found.' ; } 

}

return array( false , $errors ) ;  }

}

?> 

I hope I am not making some simple error here, but I only post stuff here when I have used code checkers and checked the code again and again manually from the book I am using. Anyone know what I am doing wrong?

Upvotes: 0

Views: 200

Answers (2)

Tomdarkness
Tomdarkness

Reputation: 3820

You are missing a closing curly brace:

header( "Location: $url" ) ;
return;


function validate( $dbc , $email = '' , $pwd = '')

{

Should be:

header( "Location: $url" ) ;
return;

}


function validate( $dbc , $email = '' , $pwd = '')

{

Without it your validate function's scope is limited to the load function, which is obviously not what you want.

As an additional point, you might want to consider indenting your code. This way the missing curly brace would have been more obvious.

Upvotes: 1

Salem
Salem

Reputation: 12986

There's a missing } between the end of load and the begin of validate

// (...)
header( "Location: $url" ) ;
return;

} // <--

function validate( $dbc , $email = '' , $pwd = '')

{
// (...)

Upvotes: 0

Related Questions