PHP активация аккаунта

0

Я создал активацию регистрации учетной записи script моей, я проверил ее снова и снова, чтобы найти ошибки, я не вижу конкретной ошибки...

Домен будет выглядеть следующим образом:

http://domain.com/include/register.php?key=true&p=AfRWDCOWF0BO6KSb6UmNMf7d333gaBOB

Что происходит из электронной почты, когда пользователь нажимает на нее, они перенаправляются на этот script:

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

Это даже не работает, я смотрел в базе данных с пользователем с этим ключом, он соответствует, но он продолжает появляться как ошибка, которая меня очень раздражает. База данных правильная, таблица и столбец прав, ничего плохого в базе данных, это script, который не работает.

Помогите мне, ребята.

Спасибо:)

  • 0
    mysql_real_escape_string ваш друг. Вы должны избегать ваших параметризованных атрибутов (например, атрибутов, которые приходят из URL). В этом случае ваша переменная $ key. ar.php.net/manual/en/function.mysql-real-escape-string.php
  • 0
    Я уже знаю, что у меня есть функция, которая называется safeClean (), которая включает функции для очистки данных, но я удалила ее, чтобы убедиться, что это не было, что влияло, поэтому она не использовала и не использовала предыдущий код. Выход из MySQL в порядке.
Теги:

3 ответа

3
Лучший ответ
  • Измените $_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 Injection получить change $key = $_GET['p']; to $key = mysql_real_escape_string($_GET['p']);
  • Я думаю, что ваше местоположение в header() не работает. В header() адрес URL должен быть заполнен следующим образом: http://www.example.com/somewhere/index.php
  • И проверьте свою переменную $_GET['p']! Если этого не существует и существует $_GET['key'], вы найдете всех активированных пользователей. Тогда я думаю, что установка user_key в '' является обязательной, если у вас есть маркер user_activated.
  • 0
    Уже пробовал с и без кавычек. Соединение с MySQL в порядке.
  • 0
    Я знаю, но это может не сработать в будущих версиях php engine.
Показать ещё 7 комментариев
0

вы не должны использовать:

if(mysql_affected_rows($result) > 0)

Вы должны использовать mysql_num_rows()

-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());    

Та же ошибка была сделана несколько часов назад: ссылка


Случаи, в которых может использоваться 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) { ... }
  • 0
    Но если первое значение в выражении OR равно true, next не выполняется, тогда, если в результате mysql_query переменная не является ложной, этот die () не выполняется никогда. Это хорошо. Этот синтаксис используется везде и всюду хорошо.
  • 0
    По крайней мере, не будь таким невежественным и проверяй даже то, что тебе не нравится.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню