Как я могу одобрить ожидающие записи?

0

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

У всех видеозаписей есть логическая часть данных, называемая "одобренная", которая установлена либо в true ("1"), либо в false ("0").

У меня возникают проблемы с фактическим процессом утверждения. Независимо от того, что я делаю, я никогда не смогу установить статус "одобренный" видео.

Вот код, который я написал...

answer.php (Основная страница видео)

<a class="btn btn-success btn-lg btn-block" href="<?php echo url_for('/approve.php?id=' . h(u($answer['id']))); ?>"><i class="mr-2 fas fa-check fa-2x"></i>Approve</a>

approve.php

    if(!isset($_GET['id'])) {
      redirect_to(url_for('/pending.php'));
    }
    $id = $_GET['id'];


    if(is_post_request()) {

      $answer = [];
      $answer['id'] = $id;
      $answer['approved'] = $_POST['approved'];

      $result = approve_answer($id);
      $_SESSION['message'] = '<div class="text-success">The answer was successfully approved and ready for public viewing.</div>';  
      redirect_to(url_for('/pending.php'));

    } else {
      $answer = find_answer_by_id($id);
      $user = find_user_by_id($answer['user_id']);
    }

    ?>
    <?php $page_title = 'Confirm Approval'; ?>
    <?php include(SHARED_PATH . '/public_header.php'); ?>


    <div class="container my-2">
        <div class="my-2">
        <a class="back-link my-2" href="<?php echo url_for('/answer.php?id=' . h(u($answer['id']))); ?>"><i class="mr-2 fas fa-arrow-circle-left fa-2x"></i> Back to Answer</a>
        </div>

      <div class="answer approve">
        <h1>Confirm Approval</h1>
        <p>Are you sure you want to approve this answer?</p>
          <p class="item"><strong><?php echo h($answer['title']); ?></strong> by <emphasis><?php echo h($user['username']); ?></emphasis></p>
          <p><italics><?php echo h($answer['content']); ?></italics>

        <form action="<?php echo url_for('/approve.php?id=' . h(u($answer['id']))); ?>" method="post">
          <div id="operations">
            <input type="hidden" name="approved" value="1" />
            <input class="btn btn-success btn-lg btn-block" type="submit" name="approved" id="approved" value="Confirm" />
          </div>
        </form>
      </div>

    </div><!-- container -->

функция approve_answer (query_functions.php)

function approve_answer($answer) {
    global $db;

    $errors = validate_answer($answer);
    if(!empty($errors)) {
      return $errors;
    }


    $sql = "UPDATE answers SET ";
    $sql .= "approved='" . db_escape($db, '1') . "', ";
    $sql .= "WHERE id='" . db_escape($db, $answer['id']) . "' ";
    $sql .= "LIMIT 1";

    $result = mysqli_query($db, $sql);
    // For UPDATE statements, $result is true/false
    if($result) {
      return true;
    } else {
      // UPDATE failed
      echo mysqli_error($db);
      db_disconnect($db);
      exit;
    }

  }

Итак, где я ошибся?

Изменение: мне наконец удалось решить проблему самостоятельно. Как? В утверждении.php я забыл добавить важный код, чтобы он работал.

if(is_post_request()) {

  $answer = [];
  $answer['id'] = $id;
  $answer['approved'] = $_POST['approved'] ?? '';

  $result = approve_answer($answer);
  if($result === true) {
      $_SESSION['message'] = 'The answer was successfully approved and ready for public viewing.';  
      redirect_to(url_for('/pending.php'));
    } else {
        $errors = $result;
      var_dump($errors);
      }

    } else {

      $answer = find_answer_by_id($id);
      $user = find_user_by_id($answer['user_id']);
    }

?>

Самое главное, благодаря некоторым советам Smit Raval, я повторил ошибку, которую я получал, и оказалось, что, оставив функцию validate_answer в моей другой функции, одобряющ, я не смог обработать утверждение, потому что я оставил два других поля (которые 't должен был быть на странице, разумеется) были "оставлены пустыми".

Вот код функции для вашего разъяснения.

  function validate_answer($answer) {
    $errors = [];

      // title
    if(is_blank($answer['title'])) {
      $errors[] = "Title cannot be blank.";
    } elseif(!has_length($answer['title'], ['min' => 2, 'max' => 50])) {
      $errors[] = "Title must be between 2 and 50 characters.";
    }

    // summary
    if(is_blank($answer['content'])) {
      $errors[] = "Content cannot be blank.";
    } elseif(!has_length($answer['content'], ['min' => 2, 'max' => 255])) {
      $errors[] = "Content must be between 2 and 255 characters.";
    }

    return $errors;
  }

Поэтому я очистил основную функцию следующим образом...

function approve_answer($answer) {
    global $db;

    $sql = "UPDATE answers SET ";
    $sql .= "approved='" . db_escape($db, $answer['approved']) . "' ";
    $sql .= "WHERE id='" . db_escape($db, $answer['id']) . "' ";
    $sql .= "LIMIT 1";

    $result = mysqli_query($db, $sql);
    // For UPDATE statements, $result is true/false
    if($result) {
      return true;
    } else {
      // UPDATE failed
      echo mysqli_error($db);
      db_disconnect($db);
      exit;
    }

  }

И как я установил статус одобрения? Как это.

    <form action="<?php echo url_for('/approve.php?id=' . h(u($id))); ?>" method="post">
        <div id="operations">
        <input type="hidden" name="approved" value="1"/>
        <input class="btn btn-success btn-lg btn-block" type="submit" value="Approve" />
      </div>
    </form>
  </div>
  • 2
    Я не верю, что вы можете указать LIMIT в запросе на обновление таким образом, если ID является первичным ключом, вам не нужно ограничивать его. Вы пытались выполнить запрос непосредственно в вашей базе данных, чтобы увидеть какие-либо ошибки?
  • 0
    Нет, на самом деле нет.
Показать ещё 4 комментария
Теги:
database
admin
approval

2 ответа

1

Замените ниже код на запрос.

$sql = "UPDATE answers SET ";
$sql .= "approved='" . db_escape('1') . "', ";
$sql .= "WHERE id='" . db_escape($answer['id']) . "' ";
$sql .= "LIMIT 1";
  • 0
    Пожалуйста, объясните, что это решает.
  • 0
    Это обновление подтверждено верно
Показать ещё 5 комментариев
1
   if(!isset($_GET['id'])) {
      redirect_to(url_for('/pending.php'));
    }

    if(is_post_request()) {

      $result = approve_answer($_POST['id']);
      $_SESSION['message'] = '<div class="text-success">The answer was successfully approved and ready for public viewing.</div>';  
      redirect_to(url_for('/pending.php'));

    } else {
      $answer = find_answer_by_id($_GET['id']);
      $user = find_user_by_id($answer['user_id']);
    }

    ?>
    <?php $page_title = 'Confirm Approval'; ?>
    <?php include(SHARED_PATH . '/public_header.php'); ?>


    <div class="container my-2">
        <div class="my-2">
        <a class="back-link my-2" href="<?php echo url_for('/answer.php?id=' . h(u($answer['id']))); ?>"><i class="mr-2 fas fa-arrow-circle-left fa-2x"></i> Back to Answer</a>
        </div>

      <div class="answer approve">
        <h1>Confirm Approval</h1>
        <p>Are you sure you want to approve this answer?</p>
          <p class="item"><strong><?php echo h($answer['title']); ?></strong> by <emphasis><?php echo h($user['username']); ?></emphasis></p>
          <p><italics><?php echo h($answer['content']); ?></italics>

        <form action="<?php echo url_for('/approve.php?id=' . h(u($answer['id']))); ?>" method="post">
          <div id="operations">
            <input type="hidden" name="id" value="<?php echo $_GET['id']; ?>" />
            <input class="btn btn-success btn-lg btn-block" type="submit" name="approved" id="approved" value="Confirm" />
          </div>
        </form>
      </div>

    </div><!-- container -->

запрос

    $sql = "UPDATE answers SET ";
    $sql .= "approved=1";
    $sql .= "WHERE id='" . db_escape($db, $answer) . "' ";

Вы можете попробовать этот код. Я все еще не уверен, где вы устанавливаете значение для $answer['user_id']? Но это должно решить вашу проблему.

  • 0
    Извините, это тоже не сработало. И, кстати, $ answer ['user_id'] представляет автора видео с идентификационным номером.
  • 1
    Понимаю. Ну, вам нужно повторить ваш запрос и проверить, что окончательный запрос правильный или нет? @BlackNoise

Ещё вопросы

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