【问题标题】:Notice: Trying to get property of non-object in php [duplicate]注意:试图在php中获取非对象的属性[重复]
【发布时间】:2014-10-19 10:48:30
【问题描述】:

我在 userpie 登录和注册脚本中遇到问题。所以脚本在 linux mint 上使用 Lamp 效果很好!但是当我在 Windows 上运行时,出现了超过 15 个问题,其中一个是

注意:尝试在第 164 行获取 C:\armadicehost\htdocs\models\funcs.user.php 中非对象的属性

注意:尝试在第 165 行获取 C:\armadicehost\htdocs\models\funcs.user.php 中非对象的属性

这是第 165 行和第 164 行的代码:

function isUserLoggedIn()
{
    global $loggedInUser,$db,$db_table_prefix;
    
    $sql = "SELECT user_id,
              password
            FROM ".$db_table_prefix."users
            WHERE user_id = '".$db->sql_escape($loggedInUser->user_id)."'
                AND password = '".$db->sql_escape($loggedInUser->hash_pw)."' 
            AND
            active = 1
            LIMIT 1";
            }
    
    if($loggedInUser == NULL)

对于 login.php 它说...

注意:未定义索引:C:\armadicehost\htdocs\login.php 中第 401 行的状态

    <?php
    if(!empty($_POST))
    {
    ?>
    <?php
    if(count($errors) > 0)
    {
    ?>

    <?php
            } }
    ?> 
    

我需要解决这个问题,请问有什么想法吗?

【问题讨论】:

标签: php mysql pdo mysqli


【解决方案1】:

由于您的逻辑,$loggedInUser 似乎没有正确初始化。在这种情况下,“非对象”意味着它要么是null,要么不是对象(即它是一个字符串或一个数字......)。

尝试改变:

function isUserLoggedIn()
{
    global $loggedInUser,$db,$db_table_prefix;

    if ( !isset($loggedInUser) || !isset($db) || !isset($db_table_prefix) )
    {
         throw new Exception "Objects and/or globals not initialized.";
    }

    $sql = "SELECT user_id,
    .....

如果出现问题,这将终止您的脚本。由于缺少其余代码,因此几乎不可能确定问题出在哪里。

对于您的第二个问题:这似乎不是正确的代码,因为没有索引为 'status' 的数组引用

【讨论】:

  • 就像你自己说的,$loggedIn 用户可能已经被设置,但可能不是对象。在那种情况下 !isset() 不会做。所以在这种情况下我会选择 !is_object()。
  • 这是我使用的完整脚本,它有问题 userpie.com
  • @mykokohat 请不要因为 your 代码中的错误而责备我们...
  • 我不是在责怪任何人,我只是在问:D 试图找出它发生的原因以及我该如何解决它!它不是我的代码,我不是程序员:D 只是想学习并仍在阅读 php 的基础知识:/ 对不起,如果你觉得我在责怪你或其他任何人,但我不是:D 那是好事
  • 只是我的 2 美分:我不会使用 userpie.com 的东西。它的记录很糟糕,并且没有关于如何使用它的有意义的介绍。自己做,你会学到东西。
【解决方案2】:

就像 Axel 在他的回答中提到的那样,$loggedInUser 绝对是问题所在。 不过我不同意 Axel 的解决方案。

因为该方法的目标是检查用户是否登录,它应该根据用户是否登录可能返回 TRUE 或 FALSE。 如果用户没有登录,$loggedInUser 将不会被设置,在这种情况下你应该返回 false。

function isUserLoggedIn()
{
    global $loggedInUser,$db,$db_table_prefix;

    if (!is_object($loggedInUser)) {
        return false;
    }

    ...
}

【讨论】:

  • 这是我使用的完整脚本,它有问题userpie.com
  • 那不是if ( $loggedInUser === false ) ...吗?但是根据记录不佳的所谓的 framweork 我认为它是一个带有构造函数的类,除非它没有被实例化,否则它很难被取消设置。由于我们看不到代码的其余部分(全局在其他地方使用...),所以无论如何都是猜测。
【解决方案3】:

注意:试图在...中获取非对象的属性

解决办法:

使用前检查全局变量初始化:

function isUserLoggedIn()
{
    global $loggedInUser,$db,$db_table_prefix;

    if (!isset(
        $db,
        $db_table_prefix,
        $loggedInUser->user_id,
        $loggedInUser->hash_pw
    )) {
        // Handle non-initizlized variables case
    }

    $sql = "SELECT user_id,
              password
            FROM ".$db_table_prefix."users
            WHERE user_id = '".$db->sql_escape($loggedInUser->user_id)."'
                AND password = '".$db->sql_escape($loggedInUser->hash_pw)."' 
            AND
            active = 1
            LIMIT 1";
}

仅供参考

以这种方式使用 sql-queries 连接可能很危险:

$sql = "SELECT user_id,
              password
            FROM ".$db_table_prefix."users  <--- POSSIBLE SQL-INJECTION
....

在连接之前清理$db_table_prefix


注意:未定义的索引:状态...

这个通知告诉我们使用了未定义的数组元素,索引为status。不幸的是,您的第二个代码示例不知道那里到底发生了什么。

解决办法:

使用前检查数组元素初始化:

if (!isset($array['status']) {
    // Handle non-initialized array element case
}

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多