我在新的主机上遇到了很多问题,但我越看越清楚,它们似乎都与验证登录、注册和提交时在我的数据库中进行检查有关。这里有一个例子。
我使用jQuery to validate forms。当用户尝试登录时,我用它来确定用户名是否确实存在(别担心,我也会检查服务器端)。在我的开发服务器上,这是完美无缺的。如果您不熟悉jQuery验证,基本上它会以某种JSON的形式向服务器返回true或false,但我对此并不完全了解。
代码:
//Database Information vars (removed)
mysql_connect ($dbhost, $dbuser, $dbpass)or die("Could not connect: ".mysql_error());
mysql_select_db($dbname) or die(mysql_error());
$username = mysql_real_escape_string($login_username); // In validation, I can grab inputs like this.
$query = "SELECT username FROM registerusers WHERE username='$username';";
$res = mysql_query($query);
if (mysql_num_rows($res) > 0) {
$output = true;
} else {
$output = false;
}
echo json_encode($output);
这样做的问题是,它总是引用第一个子句并返回true,即使用户名不存在。不管出于什么原因,我认为mysql_num_rows($res)
总是返回1。
这段代码(除了新的数据库变量之外,我已经检查了一百次,以保证代码的准确性)仍然可以在我的开发服务器上正常工作。我只能假设这与新服务器有关,这就是为什么我问Stack Overflow,因为我不知道。
发布于 2012-01-22 19:57:04
问题是register_globals已启用。这带来了一个高度安全的问题,这就是它被禁用和弃用的原因。
将$login_username
更改为$_GET['login_username']
可以解决此问题。
使用$_GET和$_POST超级全局数组不是安全问题,但是您应该始终清理您的输入(就像使用mysql_real_escape_string()一样)。
发布于 2012-01-22 19:57:45
您是否尝试过将MySQL连接设置为一个变量,然后调用该连接变量作为mysql_query中的第二个参数?这有时会让我在一些服务器上遇到问题,特别是当它们默认关闭某些调试方法、错误和警告时:
//Database Information vars (removed)
$connect = mysql_connect ($dbhost, $dbuser, $dbpass) or die("Could not connect: ".mysql_error());
mysql_select_db($dbname) or die(mysql_error());
$username = mysql_real_escape_string($login_username); // In validation, I can grab inputs like this.
$query = "SELECT `username` FROM `registerusers` WHERE `username` = '".$username."';";
$res = mysql_query($query, $connect);
if (mysql_num_rows($res) > 0) {
$output = true;
} else {
$output = false;
}
echo json_encode($output);
我还将$query更改为带有变量的连接字符串,因为我工作过的一些服务器有时在将变量放在字符串内而不使用"..“分隔它们方面很挑剔。
https://stackoverflow.com/questions/8963931
复制相似问题