OOP 试图通过预准备语句获取非对象的属性


OOP Trying to get propery of non-object via prepared statements

我正在尝试创建一个用户类,该类将具有可用于我的网站的注册和登录等功能。但是,当我尝试检查用户名是否存在时,出现以下错误:

注意:尝试在第 22 行获取 C:''inetpub''wwwroot''include''user.class.php 中非对象的属性

我做了大量的谷歌搜索,有很多信息,但没有一个告诉我为什么它会给我这个错误以及如何解决它?我刚刚开始使用OOP PHP,并准备了语句,所以我的代码可能有点摇摆不定。

这是我在 dbc 类中使用的选择函数:

public function select($columns = array(), $table, $variables = '', $order = '') {
        // Are the required variables empty or equals null?
        if(empty($columns) || empty($table)) {
            return false;
        }
        // Set $order and $variables to false
        if($order == '' || $order == null) {
            $order = false;
        }else if($variables == '' || $variables == null) {
            $variables = false;
        }
        // Check if $columns is an array
        if(!is_array($columns)) {
            return false;
        }
        // Set $fields as an array
        $fields = array();
        // Individualise the array
        foreach($columns as $field) {
            $fields[] = $field;
        }
        // Sepeate all individuals with commas
        $fields = implode(', ', $fields);
        // Finalise the MySQLi query
        if($variables == false && $order == false) {
            $query = "SELECT $fields FROM $table";
        }else if($variables != false && $order == false) {
            $query = "SELECT $fields FROM $table WHERE $variables";
        }else if($variables == false && $order != false) {
            $query = "SELECT $fields FROM $table ORDER BY $order";
        }else if($variables != false && $order != false) {
            $query = "SELECT $fields FROM $table WHERE $variables ORDER BY $order";
        }
        // Prepare the query for executing
        $stmt = $this->connection->prepare($query);
        // Execute the query
        $stmt->execute();
        // Get the results of the query
        $result = $stmt->get_result();
        // Set the results to a variable
        while($row = ( is_object($result)) ? $result->fetch_assoc() : $result->fetch_object() ) {
            $results[] = $row;
        }
        // Return the results as array 0
        return $results[0];
    }

这是用户类中的寄存器函数:

ublic function register($username, $password, $confirmpassword, $email, $firstname, $lastname) {
        if(empty($username) || empty($password) || empty($confirmpassword) || empty($email) || empty($firstname) || empty($lastname)) {
            return false;
        }
        if($password === $confirmpassword) {
            $dbc = new dbc();
            $hash = '_HG.g2Sxa.';
            $encryptpassword = md5(md5($hash . $password));
            $usernameQuery = $dbc->select(array('*'), 'users', 'username="' . $username .'"');
            $usernameCount = $usernameQuery->num_rows;
            if($usernameCount != 0) {
                echo 'Username already exists!';
            }
            $userdata = array(
                'username' => $username,
                'password' => $encryptpassword,
                'email' => $email,
                'firstname' => $firstname,
                'lastname' => $lastname,
                'status' => '1',
                'ip' => '127.0.0.1'
            );
            $dbc->insert('users', $userdata);
        }else {
            return false;
        }
    }

我以前没有遇到过这个问题,因为我只有在尝试计算找到多少行时才遇到这个问题。但如果我不数数,那么它绝对会很棒。

如果有人知道我如何解决这个问题,我将不胜感激。另外,如果我的代码有任何问题,请提及它,以便我可以创建改进。

谢谢基隆

错误在这里:

$usernameQuery = $dbc->select(array('*'), 'users', 'username="' . $username .'"');
$usernameCount = $usernameQuery->num_rows; // error is here

它说Trying to get property of non-object,所以$usernameCount不是一个对象。

可能的原因:

  • 您的select函数返回false(它在多个地方返回(
  • 数据库查询不返回任何数据,在这种情况下,应该有其他通知,例如Undefined variable: results

接下来,您执行$usernameQuery->num_rows .我完全没有看到$usernameQuery可以拥有num_rows财产的情况。在最佳情况下,您的select返回第一个数据行,无论如何都不会有num_rows

而且我实际上看不出这种select实现的意义,它从数据库中读取所有数据并丢弃除第一条记录之外的所有内容。如果您需要一条记录 - 请在 SQL 中使用 limit 1

此外,还应使用 bind_param 将参数绑定到 SQL。目前你只是传递没有参数的字符串,所以实际上没有使用prepare

实际上,此代码还有更多问题。您可以尝试将其发布在 https://codereview.stackexchange.com/并要求审核。