PHP中未定义的函数错误但看不出原因?

时间:2013-10-20 18:04:47

标签: php

我正在进行登录表单,其中包含链接在一起的不同PHP脚本。我已在此处发布了其中一个脚本并更正了其中的一些错误。我已经尝试了几个小时来完成这些工作,但事情并没有发生。我收到了错误

  

致命错误:在第21行的C:\ Program Files \ Abyss Web Server \ htdocs \ login_action.php中调用未定义的函数validate()

好的,所以我查看了“Login Tools.php”,我已经对它进行了一些更正。该功能似乎正确定义。我正在从PHP新手书中复制此代码 - 在Easy Steps中。我还查看了另一个脚本Login Action.php,但看不出任何错误。

我将首先向您显示“登录action.php”。我知道有些人不喜欢这本书使用的方法,但我只是从书中复制,所以我没有选择脚本的输入方式。

<?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 ) ;

} 

?> 

所以上面的脚本使用下面脚本中定义的函数。我已经通过这两个甚至纠正了错误,但无法找到为什么函数会出现未定义?

<?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 ) ;  }

}

?> 

我希望我在这里没有做出一些简单的错误,但是当我使用代码检查器并且从我正在使用的书中手动一次又一次地检查代码时,我只在这里发布内容。谁知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

你缺少一个结束大括号:

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


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

{

应该是:

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

}


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

{

如果没有它,validate函数的范围仅限于load函数,这显然不是您想要的。

作为补充,您可能需要考虑缩进代码。这样,缺少大括号会更加明显。

答案 1 :(得分:0)

}的结尾与load的开头之间缺少validate

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

} // <--

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

{
// (...)