【发布时间】:2020-02-25 16:58:13
【问题描述】:
我正在尝试为我网站上的帖子创建排序/排序机制,按最新或最热门排序。我的 frontpage.php 上有一个 HTML <select> 元素,它通过 jQuery onChange 触发以将选定的选项值保存到变量中。然后它使用所选选项的值对文件 feed.php 运行 GET 请求。这现在没有显示任何东西。错误:Notice: Undefined index: order 在 feed.php 文件中。
<select id="order">
<option value="published">Newest</option>
<option value="votes">Hottest</option>
</select>
检查更改然后将选择的#order childs 值保存在变量selected 中的jQuery。
$('#order').change(function() {
var selected = $(this).children("option:selected").val();
$.ajax({
type: 'GET',
data: {order: selected},
url: '../../php/includes/posts/feed.php'
});
});
然后我有 PHP 脚本 (feed.php),它输出带有 while 循环的帖子(不包括在这个问题中。)while 循环按其他方式工作。我想异步更改 SQL 表的顺序。
$order = $_GET['order'];
if(isset($order)) {
$sql = "SELECT * FROM posts ORDER BY '$order' DESC LIMIT 0, 5";
$results = $conn->query($sql);
// The php script continues but it works as it should without the code above of course.
这可能是因为 $order 在使用 feed.php 之前没有保存?
编辑:
这是 feed.php 的完整代码我现在已经更改了 bth feed.php 的代码和我的 jQuery 脚本以包含给定的更改
if(isset($order)) {
$order = $_GET['order'];
$sql = "SELECT * FROM posts ORDER BY `$order` DESC LIMIT 0, 5";
$results = $conn->query($sql);
if ($results->num_rows > 0) {
while($row = $results->fetch_assoc()) {
$postID = $row['postID'];
$author = $row['author'];
//$img = $row['fileName'];
$published = strtotime($row['published']);
echo '
<div class="post">
<div class="post__head">
<div>
<h6>'.$row['title'].'</h6>
<p> <i class="far fa-user"></i> '.$author.'</p>
<p> <i class="far fa-clock"></i> '.date("j.n.Y - H:i:s", $published).'</p>
</div>
<div class="post__votes">
<p>'.$row['votes'].' Votes</p>
<i data-id="'.$postID.'" class="fas fa-arrow-up -upvote"></i>
<i data-id="'.$postID.'" class="fas fa-arrow-down -downvote"></i>
</div>
</div>
<div class="post__body">
<div class="post__img">
</div>
<p>'.$row['message'].'</p>
<div class="post__comments">
<p>Comments</p>';
$sqlComments = "SELECT * FROM comments WHERE comments.postID = $postID"; // Loop through all comments for a given post
$resultsComments = $conn->query($sqlComments);
if($resultsComments->num_rows > 0){
while($row = $resultsComments->fetch_assoc()) {
echo $row['comment'] . '<br>';
}
} else {
echo 'No comments yet...';
}
echo'
</div>
</div>
<div class="post__footer">';
if(isset($_SESSION["loggedin"])) {
$role = $_SESSION['role'];
if($role == 'admin' || $role == 'editor' || $author == $_SESSION['username']) { # Edit posts only if logged in and as a either admin, editor or as the user who created the post
echo '
<button type="button" class="post__editBtn" data-id="'.$postID.'">Edit <i class="fas fa-pencil-alt"></i></button>
<button type="button" class="post__commentBtn" data-id="'.$postID.'">Comments <i class="fas fa-comments"></i></button>';
}
if($role == 'admin' || $author == $_SESSION['username']) { # Delete posts only if logged in as a admin or the author of the post
echo'
<form method="post">
<input type="hidden" value="'.$postID.'" name="post__deleteHidden">
<button name="post__deleteBtn">Delete <i class="far fa-trash-alt"></i></button>
</form>';
}
}
echo'</div>
</div>';
}
echo '
<div class="overlay-edit">
<p>Editing </p>
<form method="post" action="../../php/includes/posts/editPost.php" class="post__edit">
<input type="text" name="postTitle" placeholder="Edit title">
<textarea name="postMsg" maxlength="255" placeholder="Edit message"></textarea>
<button type="submit">Edit Post</button>
<button type="button" class="post__edit-close">Close</button>
<input type="hidden" name="post__editHidden" value="">
</form>
</div>';
echo'
<div class="overlay-comment">
<form method="post" action="../../../php/includes/posts/createComment.php" class="post__comment">
<textarea name="comment" maxlength="255" placeholder="Comment"></textarea>
<button type="submit">Submit comment</button>
<button type="button" class="post__comment-close">Close</button>
<input type="hidden" name="post__commentHidden" value="">
</form>
</div>';
if(isset($_POST['post__deleteBtn'])) { # Delete a post
$conn->query("DELETE * FROM posts WHERE postID = ".$_POST['post__deleteHidden']."");
}
} else {
echo '<p>No posts to show...</p>';
}
}
$conn->close();
?>
【问题讨论】:
-
你有没有调试过这个来检查JS中是否缺少值,所以没有在请求中发送,或者只有PHP?
-
我可以通过 console.log(select) 查看选项的值。在此之前我取得了成功:提醒 $.ajax 有效的函数。
-
使用
data: "order="+selected,并且不要忘记在服务器端准备/绑定/执行以避免SQL注入 -
@MaximSagaydachny Hi 试过但没有成功。
-
'$order'