2016-01-04 1 views
0

Я пытаюсь создать проверку электронной почты. Отправка электронной почты со ссылкой на пользователя работает. Теперь я хочу установить active = 1, когда пользователь нажимает на ссылку, которую он получил. Я проверил переменные $ email и ключ $, они получают правильную информацию из URL-адреса. Когда для активного установлено значение 1, я хочу, чтобы echo ahref в login.php. Я думаю, что в моем SQL-запросе есть что-то неправильно, может кто-нибудь помочь?Проверка электронной почты из ссылки php

<?php 

if (isset($_GET['email'])) { 
$email = $_GET['email']; 
} 
if (isset($_GET['hash'])){ 
$key = $_GET['hash']; 
} 

$query = $mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."' "); 

$result = $query->fetch_row(); 

if($result == 1){ 

    echo "Your account is now active. You may now <a href="login.php">Log in</a>"; 

} 
else { 
echo "Your account could not be activated. Please recheck the link or contact the system administrator. test"; 
} 


} 
?> 
+2

Добавить сообщение об ошибках в верхней части файла (ов) сразу после открытия PHP тега , например, '

+0

Проверьте в базе данных, действительно ли поле активно изменяется. – Phiter

+0

Просто примечание: в вашем SQL-запросе определенно что-то * очень * неправильно, так как вы не скрываете содержимое '$ email' и' $ key' явно, а также не используете подготовленные инструкции, чтобы автоматически это сделать для вас, - таким образом провоцируя инъекции SQL. –

ответ

4

Держитесь здесь. fetch_row()http://php.net/manual/en/mysqli-result.fetch-row.php для SELECT, а не UPDATE.

Что вы хотите использовать это mysqli_affected_rows()

на UPDATE, чтобы проверить, если обновление прошло успешно.

Если вы хотите сделать SELECT здесь (что имеет больше смысла), тогда вам нужно использовать mysqli_num_rows(), и если оба существуют, то выполните UPDATE.

Вы должны также проверить на наличие ошибок в отношении вашего запроса:


Если строка/пользователь существует:

Проконсультируйтесь с моим ответом https://stackoverflow.com/a/22253579/1415724, чтобы узнать, существует ли пользователь, на котором вы можете основываться на нем.


Плюс, предложение. Используйте !empty() вместо isset(). Обычно лучше всего проверять ценности.

Что также лучше работает, это проверить, являются ли какие-либо пустые, а не 2 условными операторами.

Если один из них оставлен пустым, ваш код продолжит выполнение и, в свою очередь, ваш запрос не будет выполнен.

Если вы хотите сохранить свой нынешний метод, вы должны exit; после каждого GET, но я бы не рекомендовал его.

Больше как:

if (!empty($_GET['email']) && !empty($_GET['hash'])) { 
    $email = $_GET['email']; 
    $key = $_GET['hash']; 
} 

else{ exit; } 

Ваш Настоящий Кодекс открыт для SQL injection. Использовать mysqli_* with prepared statements, или PDO с prepared statements.

+0

Я попробую! – user3356007

+0

@ пользователь3356007 ok. Кроме того, я сделал несколько дополнительных изменений для моего ответа, если вы хотите перезагрузить его, если вы, возможно, не видели их. –

+0

Я не работал @ Fred-ii- – user3356007

2

Проблема в том, что в следующей строке,

$result = $query->fetch_row(); 

Вы пытаетесь сделать UPDATE операцию, но вы на самом деле извлечения результата строку, используя ->fetch_row() заявление, которое, кстати, не существует, потому что UPDATE Операция не возвращает какой-либо результирующий набор.

Используйте ->affected_rows свойство, чтобы получить число изменяемых строк из UPDATE операции, например:

$mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."'"); 

if($mysqli->affected_rows == 1){ 
    echo "Your account is now active. You may now <a href=\"login.php\">Log in</a>"; 
}else{ 
    echo "Your account could not be activated. Please recheck the link or contact the system administrator."; 
} 

Вот ссылка:

Отредактировано:

Ваш код на странице проверки должны быть такими:

if(isset($_GET['email']) && isset($_GET['hash'])){ 
    $email = htmlentities($_GET['email']); 
    $key = htmlentities($_GET['hash']); 

    $mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."'"); 

    if($mysqli->affected_rows){ 
     echo "Your account is now active. You may now <a href=\"login.php\">Log in</a>"; 
    }else{ 
     echo "Your account could not be activated. Please recheck the link or contact the system administrator."; 
    } 
}else{ 
    echo "wrong parameters."; 
} 

отредактировал Re-:

После обширной отладки с помощью OP вопрос решается сейчас, и это последний рабочий код,

if (isset($_GET['email']) && isset($_GET['hash'])) { 
    $email = $_GET['email']; 
    $key = $_GET['hash']; 

    $mysqli->query("UPDATE `users` SET active=1 WHERE `email` = '". $email ."' AND `mailcheck` ='". $key ."' "); 


    if($mysqli->affected_rows) { 

     echo "Your account is now active"; 

    }else { 
     echo "Failed"; 
    } 
} 
+0

попробовал ваше решение, но он не работал @Rajdeep paul – user3356007

+0

@ user3356007 Я не вижу причин, почему он не должен работать. Убедитесь, что вы правильно используете '$ email' и' $ key'. Также убедитесь, что столбец 'active' еще не установлен в' 1'. –

+0

@ user3356007 Я обновил свой ответ. См. Раздел **, отредактированный ** в моем ответе. –

Смежные вопросы