我正在尝试创建一个用户类,该类将具有可用于我的网站的注册和登录等功能。但是,当我尝试检查用户名是否存在时,出现以下错误:
注意:尝试在第 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/并要求审核。