我是编程和遇到一些困难的新手。我已经看到使用MySQL
创建登录页面的几个代码,但不是MySQLi
。我试图通过替换值来自己做,但它显示了这个错误:
Notice: Trying to get property of non-object in C:\wamp\www\CTE\login.php on line 18
我真的不知道如何解决它。
<?php
session_start();
require "conexiondb.php";
$username =($_POST['username']);
$password = ($_POST['password']);
$enc_password = md5($password);
if($username&&$password)
{
//$query=$numrows=$con->query("SELECT * FROM producto");
$query=$con->query("administrador WHERE nombre='$username'");
{
$numrows = $query->num_rows;
}
if($numrows !=0) {
while ($row=$query->fetch_assoc($numrows))
{
$dbusername = $row ['username'];
$dbpassword = $row ['password'];
}
if ($username == $dbusername && $password==$dbpasswrod)
{
echo "Login Successful. < href='members.php'>Enter member area></a>";
$_SESSION['username']=$dbusername;
}
else
echo"incorrect pass";
}
else
echo die ("that username doesnt exist");
}
else
die ("enter username");
答案 0 :(得分:1)
Notice: Trying to get property of non-object
表示您在代码中拥有您认为已设置为对象的内容。但实际上,该对象并不存在。
in C:\wamp\www\CTE\login.php on line 18
告诉您确切找到不存在的对象的位置:该文件的第18行。在这种情况下,根据您发布的内容,第18行是:
while ($row=$query->fetch_assoc($numrows))
虽然它应该可以正常工作,因为PHP会忽略不必要的参数,fetch_assoc
是一个void方法,所以它应该是
while ($row=$query->fetch_assoc())
无论如何,这里的问题是$query
实际上不是一个对象。这意味着,当您调用$con->query
时,它不会返回mysqli_result
个对象,而是返回false。为什么?因为当MYSQL语法出错时,它会以静默方式失败并返回false。你不应该指望“假”本身或num_rows来检查。以下是您需要做的事情:
$query=$con->query("administrador WHERE nombre='$username'");
if($con->errno) {
//die($con->error);
throw new Exception($con->error, $con->errno);
}
//continue with what you were doing
$numrows = $query->num_rows;
为什么我建议抛出异常而不是像所有手动示例那样使用die(),或者像我已经注释掉的那样?你应该只使用die()作为临时的快速浏览一下。抛出异常会像die()那样停止代码,但是你可以write an exception handler对错误做些什么。您可以记录错误,通过电子邮件发送给自己,向用户显示错误消息或以上所有内容。
关于MYSQL语法有什么问题,请查看MYSQL错误消息的内容,并考虑您从其他人那里得到的评论。
编辑:
我刚才意识到你没有打电话给$query->free()
和$con->close()
。别忘了做这些电话。你应该在整个事情中使用try-catch statement来做到这一点,即使在例外的情况下,它们也会发生。
try {
//all of your code
} catch (Exception $e) {
// you can handle your exceptions here or with an exception handler
// some examples:
mail('myself@email.com', 'Website Error', $e->getMessage());
error_log($e->getMessage());
//note: don't echo the MYSQL error message to users other than yourself
echo 'An error has occurred';
} finally {
if(isset($query) && is_resource($query)) {
$query->free();
}
if(isset($con) && is_resource($con)) {
$con->close();
}
}
答案 1 :(得分:-1)
while ($row=$query->fetch_assoc($numrows))
为什么要传递$numrows
参数?它应该是:
while ($row=$query->fetch(PDO::FETCH_ASSOC))
另一方面,你为什么要围绕这个陈述大括号。他们看起来真的没必要。
{
$numrows = $query->num_rows;
}
另外,请注意Sean对于不完整的查询是正确的。