帐户激活PHP

时间:2010-06-09 23:51:10

标签: php mysql account-management

我创建了自己的这个帐户注册激活脚本,我已经一次又一次地查看它以查找错误,我没有看到特定的错误......

域名将是这样的:

  

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");
    }
}

它甚至根本不起作用,我用带有该键的用户查看数据库,它匹配,但它一直出现错误,这非常令我烦恼。数据库是正确的,表和列是正确的,数据库没有错,这是脚本无效。

帮助我,伙计们。

谢谢:)

3 个答案:

答案 0 :(得分:3)

  1. $_GET['key'] == true更改为$_GET['key'] == "true"
  2. 您在此之前if成功mysql_connect(...)mysql_pconnect(...)
  3. mysql_affected_rows($result);更改为mysql_num_rows($result);。受影响的您可以使用DELETEUPDATE SQL语句
  4. 在您开启第二个之前,在第二个mysql_result(...)mysql_free_result($result);之前添加,以释放分配给之前结果的内存。
  5. if($result)更改为if(mysql_affected_rows($result));。你可以在这里做到。
  6. header(...);函数调用后添加return 0;exit(0);取决于您的完整代码逻辑。
  7. 您正在 SQL语句中使用$key变量,以使您的代码在 SQL注入攻击上更加安全{get} $key = $_GET['p'];到{{ 1}}
  8. 我认为您在$key = mysql_real_escape_string($_GET['p']);功能中的位置失败。在header()网址中,地址应如下所示:http://www.example.com/somewhere/index.php
  9. 检查您的header()变量是否存在!!如果这不存在且存在$_GET['p'],则会找到所有已激活的用户。然后我认为如果你有user_activated标记,那么将user_key设置为''是必须的。

答案 1 :(得分:0)

你不应该使用:

if(mysql_affected_rows($result) > 0)

你应该使用mysql_num_rows()

答案 2 :(得分:-1)

你的问题是:

$result = mysql_query($sql) or die(mysql_error());

“或”使你的语句boolean所以$ result得到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

OR || 相同,是逻辑声明的操作符

这将有效:

$result = mysql_query($sql);
if(!$result) die(mysql_error());    

几个小时前犯了同样的错误:link


可以使用OR的案例:

defined('FOO') or
    define('FOO', 'BAR');

mysql_connect(...) or die(...);

mysql_select_db( .... ) or die(...);

mysql_query('UPDATE ...') or die(...);

if(FOO or BAR) { ... }