Невозможно правильно отфильтровать результаты базы данных - PullRequest
0 голосов
/ 05 января 2019

Итак, я создаю систему, которая управляет пользователями, и я внедрил «мусорную корзину» в качестве проверки работоспособности перед окончательным удалением записи.

Я сделал это, добавив в таблицу bool (tinyint) с именем deleted.

Это метод, который я сделал для извлечения записей:

static public function select_all($deleted = null) {
    $query = "SELECT * FROM ".static::$db_table;
    if ($deleted) {
        $query .= " WHERE deleted = ".$deleted;
    }
    return static::sql_query($query);
}

$db_table определено в классе, а sql_query($query) - это метод, который фактически выполняет запрос, в них нет ничего плохого, поскольку я использую их в каждом классе и в каждом запросе.

Вот как я называю метод:

Не удалено:

$users = User::select_all(false);
  • Ожидаемый результат: Все записи, для которых deleted установлено в 0
  • Фактический вывод: Каждая запись

Удалено:

$users = User::select_all(true);
  • Ожидаемый результат: Все записи, для которых deleted установлено в 1
  • Фактический вывод: Все записи, для которых deleted установлено в 1

Вот как я отображаю результаты:

<?php foreach ($users as $user) { ?>
    <?php if ($user->id != $_SESSION['user_id']) { ?>
        <tr>
            <td><?= h($user->name()); ?></td>
            <td><?= h($user->email); ?></td>
            <td><?= h($user->username); ?></td>
            <td><?= h($user->status()); ?></td>
            <td>
                <a href="<?= url('users/details.php?id='.h(u($user->id))); ?>">Details</a>
            </td>
        </tr>
    <?php } ?>
<?php } ?>

h() является ярлыком для htmlspecialchars(), а () является ярлыком для urlencode().

Таким образом, он может найти всех удаленных пользователей, но не всех не удаленных пользователей. Кто-нибудь может мне помочь, пожалуйста? Я предоставлю любую необходимую дополнительную информацию.

1 Ответ

0 голосов
/ 05 января 2019

Ваш оператор if не позволяет вам добавить условие в SQL. Попробуйте вместо if / else:

static public function select_all($deleted = null) {
    $query = "SELECT * FROM ".static::$db_table;
    if (null !== $deleted) {
        if ($deleted) {
            $query .= " WHERE deleted = 1";
        } else {
            $query .= " WHERE deleted = 0";
        }
    }
    return static::sql_query($query);
}

Обновление Если вы хотите, чтобы он работал с таблицами без удаленного флага, вы можете добавить проверку для null. Смотрите обновленный код ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...