0

在我的错误日志中,我收到了很多 PHP 消息:PHP Notice: Undefined variable: genderName in for all the variables under $UserData['']. 它们是未定义的,因为我试图使用这个数组来定义它们。我想知道定义变量的最佳方法是什么,这样我就不会再在日志中遇到问题了。

            if (!$location) $location = "-";

                    $UserData = array();
                    $UserData['id'] = $UserInfo['user_id'];
                    $UserData['username'] = $UserInfo['username'];
                    $UserData['gender'] = $genderName;
                    $UserData['age'] = $age;
                    $UserData['photo'] = $photo;
                    $UserData['location'] = $location;
                    $UserData['description'] = $description;
                    $UserData['isAdminORModerator'] = $typeUser;
                    $UserData['profile'] = SITE."/".$UserInfo['username'];
                    $UserData['level'] = $level;
    }

    return  $UserData;

这是所有问过的人的完整代码。

function commonData($uid)
{
    if ($uid)
    {
            $sql = "
                    SELECT a.user_id, a.email, a.username, a.displayname, a.level_id, a.photo_id
                    FROM engine4_users AS a
                    WHERE a.user_id = ".$uid;
    }

    $UserInfo = @mysql_fetch_assoc(mysql_query($sql));

    if ($UserInfo['user_id'])
    {

            if ($UserInfo['photo_id'] && $UserInfo['photo_id']!="NULL")
            {
                    $PPhoto = @mysql_fetch_assoc(mysql_query("SELECT a.* FROM engine4_storage_files AS a WHERE a.file_id = ".$UserInfo['photo_id']));
                    $photo = SOFTLAYER.$PPhoto['storage_path'];
            }

            else $photo = NO_PHOTO;
    $queryMoreProfile = mysql_query("SELECT * FROM engine4_user_fields_values AS a WHERE a.item_id = ".$UserInfo['user_id']);

    while ($moreProfile = @mysql_fetch_assoc($queryMoreProfile))
    {
            //birthday
            if ($moreProfile['field_id']==6)
            {
                    $age = getAge($moreProfile['value']);

            }
            //about
            if ($moreProfile['field_id']==13)
            {
                    $description = $moreProfile['value'];
            }

            //position
            if ($moreProfile['field_id']==17)
            {
                    $gender = $moreProfile['value'];
                    $gendersql = @mysql_fetch_assoc(mysql_query("SELECT a.* FROM engine4_user_fields_options AS a WHERE a.option_id = ".$gender));
                    $genderName = $gendersql['label'];
            }

            //location
            if ($moreProfile['field_id']==24)
            {
                    $locationNumber = $moreProfile['value'];
                    $locationsql = @mysql_fetch_assoc(mysql_query("SELECT a.* FROM engine4_user_fields_options AS a WHERE a.option_id = ".$locationNumber));
                    $location = $locationsql['label'];
            }
            //level
            if ($UserInfo['level_id']==1 or $UserInfo['level_id']==2)
            {
                    $typeUser = '<isAdmin>true</isAdmin>';
                    $level = 'admin';
            }
            else if ($UserInfo['level_id']==3)
            {
                    $level = 'moderator';
                    $typeUser = '<isModerator>true</isModerator>';
            }
            else if ($UserInfo['level_id']==9 or $UserInfo['level_id']==10 or $UserInfo['level_id']==11 or $UserInfo['level_id']==12 or $UserInfo['level_id']==13 or $UserInfo['level_id']==14)
            {
                    $level = 'premium';
                    $typeUser = '';
            }
            else if ($UserInfo['level_id']==8)
            {
                    $level = 'VIP';
                    $typeUser = '';
            }
            else
            {
                    $typeUser = '';
                    $level = 'guest';
            }

            if (!$location) $location = "-";

                    $UserData = array();
                    $UserData['id'] = $UserInfo['user_id'];
                    $UserData['username'] = $UserInfo['username'];
                    $UserData['gender'] = $genderName;
                    $UserData['age'] = $age;
                    $UserData['photo'] = $photo;
                    $UserData['location'] = $location;
                    $UserData['description'] = $description;
                    $UserData['isAdminORModerator'] = $typeUser;
                    $UserData['profile'] = SITE."/".$UserInfo['username'];
                    $UserData['level'] = $level;
    }

    return  $UserData;

} }

4

3 回答 3

2

你的问题是

$genderName

从未被赋值过。

利用

if(isset($genderName))
{
    ...

以确保它存在。

您还可以使用三元运算符

$genderName = isset($genderName) ? $genderName : false;

你所要做的

$genderName = "something";

因为否则你做不到

$something = $genderName;

你确定你不想这样做吗?

$genderName = $UserData['genderName'];

变量插入操作从右到左变量。

于 2013-04-19T22:30:40.813 回答
0

您的代码中存在一种模式,它不仅会引起注意。

这个特别的通知来自这样​​一个事实,即$genderName仅当您正在使用的数据集包含 17 的 moreProfile-field-id 时才定义变量。只有这样才能执行从数据库中获取性别名称的查询,并且变量才会生效. 如果不是,则变量保持未定义,您会收到通知。

实际上,您尝试返回用户的完整记录。如果用户没有保存他的“genderName”,你会返回哪个值?空字符串?无效的?

关于这种模式:您的代码倾向于对失败不是很健壮:

if ($uid)
{
        $sql = "
                SELECT a.user_id, a.email, a.username, a.displayname, a.level_id, a.photo_id
                FROM engine4_users AS a
                WHERE a.user_id = ".$uid;
}

$UserInfo = @mysql_fetch_assoc(mysql_query($sql));

$uid是函数的参数。我希望它存在,否则 PHP 会抱怨。但是有很多值$uid不是“真”,比如 0、“”、array()。如果$uid被视为“假”怎么办?然后$sql没有得到定义。但它被用于查询。并且任何错误都会被抑制,因此您无法知道您的查询失败了。

顺便说一句:您的 SQL 无法抵御 SQL 注入攻击。

所以模式是:如果事情进展顺利,你就做事,但不注意其他事情做什么。即使里面没有代码,每个if人都有一个始终存在的部分。else您必须处理这else部分 - 即使您只是在此处定义相同的变量并分配默认值,如下所示:

        //position
        if ($moreProfile['field_id']==17)
        {
                $gender = $moreProfile['value'];
                $gendersql = @mysql_fetch_assoc(mysql_query("SELECT a.* FROM engine4_user_fields_options AS a WHERE a.option_id = ".$gender));
                $genderName = $gendersql['label'];
        }
        else
        {
                $genderName = "I don't know";
        }
于 2013-04-19T23:25:08.257 回答
0

看起来您的代码段来自基于return关键字的函数。我的猜测是您已分配给变量$genderName等。从函数外部。

如果是这种情况,请注意函数不会将全局变量继承到它们的范围内。您必须使用 . 显式请求访问全局变量global。如果不这样做,则$genderName指的是您可能尚未分配的函数范围变量。

例如,在函数的顶部添加以下内容:

global $genderName, $age, ...;

您需要对打算在函数中使用的每个全局变量执行此操作。请注意,此访问是读写的;您可以通过这种方式覆盖存储在全局变量中的值,所以要小心。

于 2013-04-19T22:31:05.593 回答