基于PHP开发登录注册系统时注册页报未定义random_num()函数错误
核心报错提示:
Fatal error: Uncaught Error: Call to undefined function random_num() in signup.php on line 17
报错根本成因
你遇到的这个“未定义函数”提示,并非random_num函数没写,而是functions.php文件本身存在PHP致命语法/函数调用错误,导致整个文件根本没被PHP完整解析加载——只要被include的文件出现致命错误,PHP会直接中断全流程,文件里定义的所有函数都不会完成注册,此时在其他页面调用这些函数,就会提示“函数未定义”,错误提示的行号往往会误导人去查调用页的问题,而不是被加载的公共文件。
逐行定位的所有问题点与对应修复
1. 直接导致functions.php加载失败的核心错误
函数名拼写错误:在
random_num函数内部,你把内置随机数函数rand()错写成了ran(),对应代码行:$len = ran(4,$length);PHP本身没有
ran()这个内置函数,执行到这行时会直接抛致命错误,中断整个functions.php的解析流程,导致后面的代码根本没机会执行,random_num函数也没法完成定义。
修复方法:把这行改成正确的函数调用:$len = rand(4, $length);数据库操作函数混用错误:在
check_login函数里,你把mysqli系列的查询函数错写成了已经被PHP彻底移除的mysql系列函数,对应代码行:$result = mysql_query($con, $query);这类
mysql_*函数从PHP7版本开始就不存在了,调用就会触发致命错误,同样会中断functions.php的加载流程。
修复方法:改成mysqli标准写法:$result = mysqli_query($con, $query);
2. 即使修好functions.php,注册页仍会触发的功能错误
这些问题会在你解决“未定义函数”报错后陆续暴露,提前一次性修好可以减少反复调试:
SQL语句格式错误:你拼接注册插入逻辑的SQL时,没有给字符串类型的字段值加单引号,对应代码:
$query = "insert into users (user_id,user_name,password) values ($user_id,$user_name,$password)";直接拼出来的SQL没有引号包裹字符串,数据库执行时会直接报语法错误,同时这种直接拼接用户输入的写法还存在SQL注入风险。
修复时要给每个字符串值加单引号,并用mysqli_real_escape_string()处理特殊字符,比如:$escaped_username = mysqli_real_escape_string($con, $username); $escaped_password = mysqli_real_escape_string($con, $password); $query = "insert into users (user_id,user_name,password) values ('$user_id','$escaped_username','$escaped_password')";数据库查询函数漏传连接参数:你调用查询方法时,没把
connection.php里生成的数据库连接句柄$con作为参数传进去,对应代码:mysqli_query($query);所有mysqli扩展的查询方法,必须第一个参数传有效连接对象,漏传会直接报错。
修复方法:改成mysqli_query($con, $query);header跳转语法错误:你写页面跳转时,没把跳转地址作为字符串加引号,对应代码:
header(Location:login.php);PHP会把这里的
Location当成常量解析,触发语法错误导致跳转失效。
修复方法:改成header("Location: login.php");密码明文存储风险:你现在的逻辑是把用户输入的原密码直接存入数据库,这是非常危险的操作,学习阶段也要养成安全编码习惯,用PHP自带的
password_hash()对密码做哈希处理后再存库。
3. 数据库连接文件的遗漏问题
你在connection.php里定义数据库名常量时,值是空字符串:
define("DB_DATABASE", "");
就算前面所有代码都修对,数据库连接也会因为找不到目标库而失败。你需要把引号里的空值,替换成自己在本地环境实际创建的数据库名称。
内容的提问来源于stack exchange,提问作者technical Zillancer

