首页 > 解决方案 > 调用 PHP 中未定义的函数和数组键,即使它已明确定义?

问题描述

大家好,目前我正在自学 PHP,但遇到了一个非常令人困惑的问题。运行在单独文件中包含此代码的另一个文件时出现以下错误。

警告:第 26 行 C:\xampp\htdocs\MirrorTrade\classes\signup.php 中未定义的数组键“first_name”警告:C:\xampp\htdocs\MirrorTrade\classes\signup.php 中未定义的数组键“last_name”第 27 行警告:第 28 行 C:\xampp\htdocs\MirrorTrade\classes\signup.php 中未定义数组键“email”警告:C:\xampp\htdocs\MirrorTrade\classes\signup 中未定义数组键“密码”。第 29 行的 php 致命错误:未捕获的错误:调用 C:\xampp\htdocs\MirrorTrade\classes\signup.php:32 中的未定义函数 create_userid() 堆栈跟踪:#0 C:\xampp\htdocs\MirrorTrade\classes\ signup.php(17): Signup->create_user(Array) #1 C:\xampp\htdocs\MirrorTrade\signup.php(7): Signup->evaluate(Array) #2 {main} 在 C:\xampp 中抛出\htdocs\MirrorTrade\classes\signup.php 在第 32 行

这是我的代码有问题

<?php

class Signup
{
private $error = "";
public function evaluate($data)
    {
        foreach ($data as $key => $value) 
            {
            if(empty($value))
            {
                $this->error = $this->error . $key . " is empty!<br>";
            }
        }
        if($this->error == "")
        {
            $this->create_user($data);
        }
        else
        {
            return $this->error;
        }
    }
public function create_user($data)
    {
        $firstname = $data['first_name'];
        $lastname = $data['last_name'];
        $email = $data['email'];
        $password = $data['password'];

        $url_address = strtolower($firstname) . "." . strtolower($lastname);
        $userid = create_userid();

        $query = "insert into 
        users
        (userid,first_name,last_name,email,password,url_address)
        values
        ('$userid','$first_name','$last_name','$email','$password','$url_address')";
        return $query;
    }
    
private function create_userid()
    {
        $length = rand(4,19);
        $number = "";
        for ($i=0; $i < $length; $i++) 
        { 
            $new_rand = rand(0,9);
            $number = $number . $new_rand;
        }
        return $number;
    }
}

标签: phphtmlsql

解决方案


当你在同一个类中引用另一个方法时,你需要在它前面加上$this. 所以这段代码:

$userid = create_userid();

应该:

$userid = $this->create_userid();

另请注意,您的代码容易受到SQL 注入攻击。不要使用字符串连接构建查询,而是始终使用带有绑定参数的准备好的语句。有关一些很好的示例,请参阅此页面此帖子

并且永远不要存储纯文本密码。而是使用password_hash()password_verify()


推荐阅读