我创建了一个mysql查询来检查用户是否被禁止,如果他是系统,则给他返回false。但是它不会得到这些信息。
public static function checkban($username)
{
if(LOGINCHECKBAN == false)
{
$vusername = engine::securyt($username);
$getIdBYname = "SELECT id FROM players WHERE username='".$vusername."' LIMIT 1";
$getNOW = mysql_query($getIdBYname);
$IDbyNAME = mysql_free_result($getIdBYname);
$queryforban = mysql_query("SELECT * FROM bans WHERE data = '".$IDbyNAME."' LIMIT 1");
$query = mysql_num_rows($queryforban);
if($query == 0) {
return true;
} else {
return false;
}
}
}
注意:engine :: securyt($ username)是在尝试登录时获取用户名的表单类型。
我的代码有什么问题? 编辑:我相信“mysql_free_result”可能是问题,但我不确定我需要替换它。
答案 0 :(得分:1)
mysql_free_result()释放一个mysql结果集。它实际上并不从结果中检索数据。
您需要以下内容:
$getIdBYname = "SELECT id FROM players WHERE username='".$vusername."' LIMIT 1";
$result = mysql_query($getIdBYname);
$row = mysql_fetch_assoc($result);
if($row) { //a user was found
//$row['id'] is the found user
$result = mysql_query("SELECT COUNT(*) cnt FROM bans WHERE data = '". $row['id'] ."' LIMIT 1");
$row = mysql_fetch_assoc($result);
return ($row && $row['cnt'] == 0);
} else {
// no user; return something appropriate
}
但是,如果您只需确定是否禁止某个特定用户名(并且实际上并未获得其用户ID),则可以使用一个查询直接在数据库中执行此操作:
SELECT COUNT(*)
FROM players p
INNER JOIN bans b ON b.data = p.id
WHERE p.username = $username;
警告:请注意,强烈建议不要使用mysql_ *函数来处理新代码(因为PHP 7中已删除了mysql_ *),并且在查询字符串中直接包含变量是一个非常重要的安全漏洞。您应该考虑使用mysqli或PDO准备好的语句/参数化查询。