登录脚本无效

时间:2014-01-14 18:28:04

标签: php mysql login

我是编程和遇到一些困难的新手。我已经看到使用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");

2 个答案:

答案 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对于不完整的查询是正确的。