Я работаю над веб-сайтом видеохостинга, на котором загруженные пользователями видео (называемые «ответами», поскольку они будут сделаны в ответ на запросы о помощи в создании хобби) помещаются в список ожидания, который веб-администратор может изучить и принять решение. одобрять для публичного просмотра или нет.
Все видеозаписи содержат логический фрагмент данных, называемый «утверждено», для которого установлено значение «истина» («1») или «ложь» («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;
}
}
Так где я ошибся?
Нет, на самом деле нет.
Я бы порекомендовал протестировать ваш запрос и проверить, что он доходит до функции, которая выполняет запрос die($sql), я подозреваю, что LIMIT 1, вероятно, нарушает эту функцию.
Вы может указываете LIMIT в предложении UPDATE. dev.mysql.com/doc/refman/5.7/en/update.html
Я исправился, но все же рекомендую проверить запрос. Я также заметил, что перед WHERE стоит запятая.
Внесите некоторую отладку, чтобы убедиться, что вы получаете значения на протяжении всего процесса. Как уже отмечалось, может быть несколько мест, где этот код дает сбой.






Замените приведенный ниже код на запрос.
$sql = "UPDATE answers SET ";
$sql .= "approved='" . db_escape('1') . "', ";
$sql .= "WHERE id='" . db_escape($answer['id']) . "' ";
$sql .= "LIMIT 1";
Какие? db_escape, скорее всего, является настраиваемой функцией, которая здесь не указана. Почему вы удалили переменную обработчика базы данных ($db) из списка аргументов? Как вы тестировали этот код? Это может сработать, но вам нужно объяснить, что это за изменения и почему OP должен их вносить.
Здесь я видел, как использовалась функция db_escape. Что они делают, я не знаю, на самом деле hotexamples.com/examples/-/-/db_escape/…
Это всего лишь примеры в открытом исходном коде, не обязательно какова функция OP.
Спасибо за ваши ответы. Мне еще предстоит применить ваше решение, так как я не понимаю, почему вы также удалили $ db. Видите ли, хотя это не указано в коде, которым я поделился с вами, $ db - это специальное сокращение для db_connect ();
Камлеш, я только что попробовал ваше решение и с сожалением должен сказать, что оно не решило мою проблему.
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']? Но это должно решить вашу проблему.
Извините, это тоже не сработало. И, кстати, $ answer ['user_id'] представляет собой идентификационный номер автора видео.
Я понимаю. Что ж, вам нужно повторить свой запрос и проверить, верен ли окончательный запрос? @BlackNoise
Я не верю, что вы можете указать LIMIT в таком запросе на обновление, если ID является первичным ключом, вам не нужно ограничение. Вы пытались выполнить запрос непосредственно в своей базе данных, чтобы увидеть какие-либо ошибки?