帐户激活PHP
我创建了自己的这个账号注册激活脚本,我都检查一遍并再次发现错误,我没有看到一个具体的错误...帐户激活PHP
您会是这样:
http://domain.com/include/register.php?key=true&p=AfRWDCOWF0BO6KSb6UmNMf7d333gaBOB
它来自电子邮件,当用户点击它,他们重定向到该脚本:
if($_GET['key'] == true)
{
$key = $_GET['p'];
$sql = "SELECT * FROM users
WHERE user_key = '" . $key . "'";
$result = mysql_query($sql) or die(mysql_error());
if(mysql_affected_rows($result) > 0)
{
$sql = "UPDATE users
SET user_key = '', user_active = '1'
WHERE user_key = '" . $key . "'";
$result = mysql_query(sql) or die(mysql_error());
if($result)
{
$_SESSION['PROCESS'] = $lang['Account_activated'];
header("Location: ../index.php");
}
else
{
$_SESSION['ERROR'] = $lang['Key_error'];
header("Location: ../index.php");
}
}
else
{
$_SESSION['ERROR'] = $lang['Invalid_key'];
header("Location: ../index.php");
}
}
它甚至没有工作,我查看数据库中的用户与该密钥,它匹配,但它继续作为一个错误,这是非常讨厌我。数据库是正确的,表和列是正确的,没有错误的数据库,这是脚本不起作用。
帮帮我,伙计。
谢谢:)
- 变化
$_GET['key'] == true
到$_GET['key'] == "true"
- 你这样做
if
之前,一个成功的mysql_connect(...)
或mysql_pconnect(...)
? - 更改
mysql_affected_rows($result);
至mysql_num_rows($result);
。受影响,您可以使用DELETE
或UPDATE
SQL语句。 - 在第二个如果被打开之前,在第二个之前添加
mysql_result(...)
,mysql_free_result($result);
以释放分配给先前结果的内存。 -
if($result)
更改为if(mysql_affected_rows($result));
。你可以在这里做到这一点。 - 在
header(...);
函数调用的后面添加一个return 0;
或exit(0);
取决于您的完整代码逻辑。 - 您正在使用
$key
变量SQL语句,让你的代码上SQL注入攻击拿到找零$key = $_GET['p'];
到$key = mysql_real_escape_string($_GET['p']);
- 更安全,我认为你在
header()
功能定位失败。在header()
的url地址应该是全部像:http://www.example.com/somewhere/index.php - 并检查你的
$_GET['p']
变量是否存在!如果不存在,并且存在$_GET['key']
,则可以找到所有激活的用户。然后我认为如果你有user_activated标记,那么将user_key设置为“'是不合适的。
你不应该使用:
if(mysql_affected_rows($result) > 0)
您应该使用mysql_num_rows()
您的问题是:
$result = mysql_query($sql) or die(mysql_error());
“或” 让您的发言boolean
所以$结果得到一个True
而不是由mysql_query返回的值()
echo 'Hello' or die('bye'); // outputs nothing, because result is True not 'Hello'
3 or die() == True; // true
3 or die() != 3; // true
或相同||并且它是逻辑语句的操作符。
这将工作:
$result = mysql_query($sql);
if(!$result) die(mysql_error());
同样的错误是在几个小时前提出:link
的包装箱,或者可以使用:
defined('FOO') or
define('FOO', 'BAR');
mysql_connect(...) or die(...);
mysql_select_db(....) or die(...);
mysql_query('UPDATE ...') or die(...);
if(FOO or BAR) { ... }
但是,如果在第一个值或表达式为真,下一个不那么如果请求mysql_query导致可变执行不是假该模具()从来没有执行。这很好。这个语法无处不在,无处不在。 – Svisstack 2010-06-10 00:07:25
至少不要那么无知,甚至不喜欢测试你甚至不喜欢的东西。 – Ski 2010-06-10 00:18:26
我一直以这种方式使用“或”,它从来没有问题。 – alternative 2010-06-10 00:24:48
mysql_real_escape_string是你的朋友。您应该转义您的参数化属性(例如来自URL的属性)。在这种情况下,您的$ key变量。 http://ar.php.net/manual/en/function.mysql-real-escape-string.php – Lombo 2010-06-09 23:58:24
我已经知道了,我有一种被称为safeClean(功能)已包含的功能,以消毒数据,但我删除它以确保它不是影响,因此它没有,也没有使用过的代码。 MySQL转义很好。 – MacMac 2010-06-10 00:12:18