0

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

域将是这样的:

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

它甚至根本不起作用,我用那个键与用户一起查看了数据库,它匹配但它一直作为一个错误出现,这让我非常恼火。数据库是对的,表和列是对的,数据库没有问题,是脚本不工作。

帮帮我,伙计们。

谢谢 :)

4

3 回答 3

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

你不应该使用:

if(mysql_affected_rows($result) > 0)

你应该使用 mysql_num_rows()

于 2010-06-09T23:59:48.507 回答
-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) { ... }
于 2010-06-10T00:02:53.773 回答