2010-06-09 132 views
0

我创建了自己的这个账号注册激活脚本,我都检查一遍并再次发现错误,我没有看到一个具体的错误...帐户激活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"); 
    } 
} 

它甚至没有工作,我查看数据库中的用户与该密钥,它匹配,但它继续作为一个错误,这是非常讨厌我。数据库是正确的,表和列是正确的,没有错误的数据库,这是脚本不起作用。

帮帮我,伙计。

谢谢:)

+0

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

+0

我已经知道了,我有一种被称为safeClean(功能)已包含的功能,以消毒数据,但我删除它以确保它不是影响,因此它没有,也没有使用过的代码。 MySQL转义很好。 – MacMac 2010-06-10 00:12:18

回答

3
  1. 变化$_GET['key'] == true$_GET['key'] == "true"
  2. 你这样做if之前,一个成功的mysql_connect(...)mysql_pconnect(...)
  3. 更改mysql_affected_rows($result);mysql_num_rows($result);。受影响,您可以使用DELETEUPDATESQL语句
  4. 在第二个如果被打开之前,在第二个之前添加mysql_result(...),mysql_free_result($result);以释放分配给先前结果的内存。
  5. if($result)更改为if(mysql_affected_rows($result));。你可以在这里做到这一点。
  6. header(...);函数调用的后面添加一个return 0;exit(0);取决于您的完整代码逻辑。
  7. 您正在使用$key变量SQL语句,让你的代码上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设置为“'是不合适的。
+0

已经试过,没有报价。 MySQL连接很好。 – MacMac 2010-06-09 23:56:02

+0

我知道,但这可能不适用于未来版本的PHP引擎。 – Svisstack 2010-06-09 23:56:50

+0

$ _GET [“钥匙”] == true的实际评估,如果$ _GET [“关键”]有任何value..so你可以打电话给你的脚本键=假,它仍然会通过validation..Although这并未”不能解决问题,它只是一个警告;) – 2010-06-10 00:00:45

0

你不应该使用:

if(mysql_affected_rows($result) > 0) 

您应该使用mysql_num_rows()

-1

您的问题是:

$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) { ... } 
+0

但是,如果在第一个值或表达式为真,下一个不那么如果请求mysql_query导致可变执行不是假该模具()从来没有执行。这很好。这个语法无处不在,无处不在。 – Svisstack 2010-06-10 00:07:25

+0

至少不要那么无知,甚至不喜欢测试你甚至不喜欢的东西。 – Ski 2010-06-10 00:18:26

+1

我一直以这种方式使用“或”,它从来没有问题。 – alternative 2010-06-10 00:24:48