注意:尝试在php中获取非对象的属性

时间:2014-10-19 10:48:31

标签: php mysql pdo mysqli

我在userpie登录和注册脚本中遇到问题。所以脚本在linux薄荷上使用灯泡效果很好!但当我进入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,它说......

  

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

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

    <?php
            } }
    ?> 

我需要解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

似乎由于您的逻辑,$loggedInUser未正确初始化。 &#34;非对象&#34;在这种情况下意味着它是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,
    .....

如果出现问题,这将终止您的脚本。由于缺少其余代码,几乎无法确定问题所在的位置。

到第二个Q:这似乎不是正确的代码,因为没有带索引的数组引用'status'

答案 1 :(得分:0)

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

由于该方法的目标是检查用户是否登录,因此根据用户是否登录,它应该返回TRUE为FALSE。 如果用户未登录,则不会设置$ loggedInUser,在这种情况下您应该返回false。

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

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

    ...
}

答案 2 :(得分:0)

  

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

解决方案:

在使用前检查全局变量initizlization:

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";
}

<强> FYI

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

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

在连接之前清理$db_table_prefix

  

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

Tis notice告诉我使用了未定义的索引为status的数组元素。不幸的是,您的第二个代码示例无法确定那里到底发生了什么。

解决方案:

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

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