在我的错误日志中,我收到了很多PHP消息:PHP注意:未定义的变量:针对$ UserData ['']下所有变量的genderName。它们是未定义的,因为我试图使用此数组定义它们。我想知道定义变量的最佳方法是什么,以便我不再在日志中遇到问题。
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;
} }
答案 0 :(得分:2)
你的问题是那个
$genderName
从未被赋予过值。
使用
if(isset($genderName))
{
...
确保它存在。
您也可以使用三元运算符
$genderName = isset($genderName) ? $genderName : false;
你必须做
$genderName = "something";
因为否则你无法做到
$something = $genderName;
你确定你没有尝试这样做吗?
$genderName = $UserData['genderName'];
变量插入操作从右变为左变量。
答案 1 :(得分:0)
看起来就像你的代码片段来自一个函数,基于return
关键字。我的猜测是你已经分配了变量$genderName
等。来自功能之外。
如果是这种情况,请注意函数不将全局变量继承到其范围中。您必须使用global
显式请求访问全局变量。如果不这样做,则$genderName
引用您可能未分配的功能范围变量。
例如,在函数的顶部添加以下内容:
global $genderName, $age, ...;
您需要为要在函数中使用的每个全局变量执行此操作。请注意,此访问是可读写的;你可以用这种方式覆盖存储在全局变量中的值,所以要小心。
答案 2 :(得分:0)
您的代码中有一种模式不仅会导致通知。
这个特别的注意事项来自这样一个事实:只有当您使用的数据集包含moreProfile-field-id为17时,才会定义变量$genderName
。然后才能从数据库中获取性别名称的查询执行,变量变得生动。如果没有,变量保持未定义,您就会收到通知。
实际上,您尝试返回用户的完整记录。如果用户未保存“genderName”,您会返回哪个值?空字符串? NULL?
关于这种模式:您的代码倾向于不能很好地防止失败:
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";
}