Можете ли вы сравнить переменную с NULL с точным оператором?

<?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 даже с точным оператором.

Почему бы не попробовать? 3v4l.org/hYpSB

Loek 04.07.2018 16:24

Я бы по умолчанию делал не поле статуса NULL, а inactive.

Bart Friederichs 04.07.2018 16:24
if ($status = "active") У вас там будут проблемы; использование одного = для сравнения всегда приравнивается к true
Tim Lewis 04.07.2018 16:24

@TimLew, что еще хуже, он также назначает "active" на $status.

Bart Friederichs 04.07.2018 16:25

@BartFriederichs Действительно, и он пропустил бы вторую проверку if (которая, возможно, должна быть else if)

Tim Lewis 04.07.2018 16:26

Точный ответ на заголовок вашего вопроса можно найти в документация (третья таблица). NULL - это === только для другого значения NULL (как в любом случае оператор === работает для всех типов данных). Просто убедитесь, что значение в вашей базе данных - это настоящий NULL, а не пустая строка.

axiac 04.07.2018 16:27

@TimLewis "использование одиночного = в сравнении всегда приравнивается к истине" - это не правильно. Значение выражения, в котором используется оператор присваивания, является присвоенным значением. Оператор if ($status = false) {...} else {...} всегда принимает ветвь else.

axiac 04.07.2018 16:31

Кстати: ваш код уязвим для атак с использованием SQL-инъекций. Вы должны использовать параметризованные запросы и подготовленные операторы, чтобы предотвратить взлом вашей базы данных злоумышленниками с помощью злонамеренных входных значений. bobby-tables.com дает объяснение рисков, а также несколько примеров того, как безопасно писать ваши запросы с помощью PHP / mysqli. Никогда вставляет необработанные данные прямо в ваш SQL вот так.

ADyson 04.07.2018 16:31

@axiac Ах да, хороший улов. Предположим, я должен был приспособиться к "при таком использовании приравнивается к true" (или что-то в этом роде). Виноват.

Tim Lewis 04.07.2018 16:32

@ADyson - Я думал, вам нужно только дезинфицировать ввод пользователя. Неважно, токен $ можно легко изменить. Спасибо!

user10032371 04.07.2018 16:33

А если серьезно, зачем дважды проверять на ноль или пустоту? Просто делать if ($status == "active") { ... is active ... } else { ... not active ... } - это то, что вы собираетесь делать.

IncredibleHat 04.07.2018 16:33

@ user10032371 $_REQUEST[token] (я полагаю, вы действительно имели в виду $_REQUEST['token']?) является пользовательский ввод. Это исходит от клиента. Злоумышленник может посетить ваш URL и указать любое значение в этом поле. Возможно, вы намереваетесь предоставить предварительно заполненное значение (я думаю, через какое-то электронное письмо для активации или что-то в этом роде), но это не мешает никому изменить его на что-то другое.

ADyson 04.07.2018 16:34

Кстати, поменяйте это на $_REQUEST['token']; (обратите внимание на цитаты).

IncredibleHat 04.07.2018 16:34

Я не думал о людях, изменяющих URL ... все еще новичок в этом :)

user10032371 04.07.2018 16:35

@ user10032371 сейчас хорошее время, чтобы учиться! Итог ... не доверяйте что-нибудь, который вы получаете через параметры GET, POST или REQUEST. А с SQL всегда используйте параметризованные запросы как нечто само собой разумеющееся, даже если вы думаете, что доверяете вводимым данным. Во-первых, он просто устраняет любые сомнения относительно возможных атак с помощью инъекций, а во-вторых, вы избавляете себя от потенциальной синтаксической боли, возникающей из-за попытки объединить строки вместе, чтобы сформировать другую (действительную SQL) строку - я особенно думаю о работе с текстом в кавычках и т. д.

ADyson 04.07.2018 16:35

Вам также следует избегать ленивых захватов SELECT * FROM.... Я знаю, что вы извлекаете row[4] ... но как вы на самом деле узнаете, что правое поле находится под номером 4 из захвата с подстановочными знаками? Его легче читать, если вам нравится SELECT status FROM... и вы используете fetch_assoc, чтобы заставить $row['status'] использовать.

IncredibleHat 04.07.2018 16:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
16
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать пустой для этого типа вещей. Он проверяет наличие 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
}

Другие вопросы по теме