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


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

我正在做一个日志表单,其中包含链接在一起的不同PHP脚本。我已经在这里发布了其中一个脚本并纠正了其中的一些错误。我已经尝试了几个小时来完成这些工作,但它没有发生。我收到错误

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

好的,所以我查看了"登录工具.php",我已经对其进行了一些更正。该函数似乎已正确定义。我正在从 PHP 新手书中复制此代码 - 在简单的步骤中。我还查看了其他脚本登录操作.php,但也看不到任何错误。

我将首先向您展示"登录操作.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 ) ;  }
}
?> 

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

您缺少右大括号:

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

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

应该是:

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

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

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

另外,您可能需要考虑缩进代码。这样,缺少的花括号会更加明显。

load结束和validate开始之间缺少}

// (...)
header( "Location: $url" ) ;
return;
} // <--
function validate( $dbc , $email = '' , $pwd = '')
{
// (...)