<?php
// connect to db
require_once 'mysql.php';
$connection = new mysqli($hn, $un, $pw, $db);
if ($connection->connect_error) die("Whoops.");
// check token
$token = $_REQUEST[token];
$query = "SELECT * FROM newusers WHERE token='$token'";
$result = $connection->query($query);
if (!$result)
{
echo "Nothing to activate.";
die("<meta http-equiv='refresh' content='3; url=index.php'>");
}
else ($result->num_rows)
{
$row = $result->fetch_array(MYSQLI_NUM);
$result->close();
$status = $row[4];
// check status
if ($status == "active")
{
// already active
}
else if ($status === "" || $status === NULL)
{
$query = "UPDATE newusers SET status='active' WHERE token='$token'";
$connection->query($query);
echo "Activated.";
die("<meta http-equiv='refresh' content='5; url=account.php'>");
}
}
echo "Why are you here?";
die("<meta http-equiv='refresh' content='3; url=index.php'>");
$connection->close();
?>
Сработает ли что-то подобное для активации учетных записей? По умолчанию столбец статуса установлен в NULL ... Я просто не уверен, можно ли сравнить переменную с NULL даже с точным оператором.
Я бы по умолчанию делал не поле статуса NULL, а inactive.
if ($status = "active") У вас там будут проблемы; использование одного = для сравнения всегда приравнивается к true@TimLew, что еще хуже, он также назначает "active" на $status.
@BartFriederichs Действительно, и он пропустил бы вторую проверку if (которая, возможно, должна быть else if)
Точный ответ на заголовок вашего вопроса можно найти в документация (третья таблица). NULL - это === только для другого значения NULL (как в любом случае оператор === работает для всех типов данных). Просто убедитесь, что значение в вашей базе данных - это настоящий NULL, а не пустая строка.
@TimLewis "использование одиночного = в сравнении всегда приравнивается к истине" - это не правильно. Значение выражения, в котором используется оператор присваивания, является присвоенным значением. Оператор if ($status = false) {...} else {...} всегда принимает ветвь else.
Кстати: ваш код уязвим для атак с использованием SQL-инъекций. Вы должны использовать параметризованные запросы и подготовленные операторы, чтобы предотвратить взлом вашей базы данных злоумышленниками с помощью злонамеренных входных значений. bobby-tables.com дает объяснение рисков, а также несколько примеров того, как безопасно писать ваши запросы с помощью PHP / mysqli. Никогда вставляет необработанные данные прямо в ваш SQL вот так.
@axiac Ах да, хороший улов. Предположим, я должен был приспособиться к "при таком использовании приравнивается к true" (или что-то в этом роде). Виноват.
@ADyson - Я думал, вам нужно только дезинфицировать ввод пользователя. Неважно, токен $ можно легко изменить. Спасибо!
А если серьезно, зачем дважды проверять на ноль или пустоту? Просто делать if ($status == "active") { ... is active ... } else { ... not active ... } - это то, что вы собираетесь делать.
@ user10032371 $_REQUEST[token] (я полагаю, вы действительно имели в виду $_REQUEST['token']?) является пользовательский ввод. Это исходит от клиента. Злоумышленник может посетить ваш URL и указать любое значение в этом поле. Возможно, вы намереваетесь предоставить предварительно заполненное значение (я думаю, через какое-то электронное письмо для активации или что-то в этом роде), но это не мешает никому изменить его на что-то другое.
Кстати, поменяйте это на $_REQUEST['token']; (обратите внимание на цитаты).
Я не думал о людях, изменяющих URL ... все еще новичок в этом :)
@ user10032371 сейчас хорошее время, чтобы учиться! Итог ... не доверяйте что-нибудь, который вы получаете через параметры GET, POST или REQUEST. А с SQL всегда используйте параметризованные запросы как нечто само собой разумеющееся, даже если вы думаете, что доверяете вводимым данным. Во-первых, он просто устраняет любые сомнения относительно возможных атак с помощью инъекций, а во-вторых, вы избавляете себя от потенциальной синтаксической боли, возникающей из-за попытки объединить строки вместе, чтобы сформировать другую (действительную SQL) строку - я особенно думаю о работе с текстом в кавычках и т. д.
Вам также следует избегать ленивых захватов SELECT * FROM.... Я знаю, что вы извлекаете row[4] ... но как вы на самом деле узнаете, что правое поле находится под номером 4 из захвата с подстановочными знаками? Его легче читать, если вам нравится SELECT status FROM... и вы используете fetch_assoc, чтобы заставить $row['status'] использовать.






Вы можете использовать пустой для этого типа вещей. Он проверяет наличие null, false, 0, '' и даже пустых массивов.
// change
else if ($status === "" || $status === NULL)
// to
else if (empty($status))
Чтобы ответить на ваш вопрос:
Если mysql имеет истинный NULL для этого поля, при выполнении $status = $row[4]; фактически будет назначен истинный NULL для php для явного сравнения. Таким образом, $status === NULL действительно будет работать (но только если поле mysql имеет истинное нулевое значение).
Однако, исходя из вашего кода, все, что вам нужно, это:
if ($row[4] == "active") {
// its active
} else {
// its not, so activate/do more
}
Почему бы не попробовать? 3v4l.org/hYpSB