jQuery AJAX не будет отправлять переменные данные в скрипт PHP - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать механизм сортировки / заказа для сообщений на моем веб-сайте, сортируя их по самым новым или самым популярным. У меня есть элемент HTML <select> на моей главной странице. php, который срабатывает через jQuery onChange, чтобы сохранить выбранное значение параметров в переменной. Затем он запускает запрос GET к фиду файлов. php со значением выбранной опции. Теперь это ничего не показывает. Ошибка: Notice: Undefined index: order в файле фида. php.

<select id="order">
  <option value="published">Newest</option>
  <option value="votes">Hottest</option>
</select>

jQuery, который проверяет изменение и затем сохраняет выбранное значение #order childs в переменной selected.

$('#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-l oop (не включенным в этот вопрос.) While-l oop работает как надо в противном случае. Я хотел бы изменить порядок таблицы 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 не сохраняется перед использованием в ленте. php?

РЕДАКТИРОВАТЬ:

Это весь код для фида. 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();
?>

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Для списка выбора я бы добавил Select order параметр

<select id="order">
  <option value="none">Select order</option>
  <option value="published">Newest</option>
  <option value="votes">Hottest</option>
</select>

Затем я бы проверил, отличается ли выбранный параметр от значения по умолчанию

$('#order').change(function() { 
    var selected = $(this).children("option:selected").val();
    if(selected != "none") {
      $.ajax({
        type: "get",
        url: "../../php/includes/posts/feed.php",
        data: { 
          order: selected
        },
        success: function(response) {
          //Do Something
        },
        error: function(xhr) {
          //Do Something to handle error
        }
      });
    }
});

Убедитесь, что URL feed.php правильный.

Запустите ваш скрипт feed.php и убедитесь, что он возвращает результат.

0 голосов
/ 25 февраля 2020

Предисловие: я серверный кодер, а не JS / jQuery, поэтому этот ответ для этого.

Вы получаете неопределенное уведомление об индексе, потому что вам нужно поместить $order = $_GET['order']; внутри условное заявление. Кроме того, удаляя кавычки вокруг имени столбца в вашем ORDER BY. Либо удалите их, либо используйте галочки.

if(isset($order)) {

$order = $_GET['order'];

$sql = "SELECT * FROM posts ORDER BY $order DESC LIMIT 0, 5";
$results = $conn->query($sql);

} else {
  echo "It is not set.";
 }

С галочками:

$sql = "SELECT * FROM posts ORDER BY `$order` DESC LIMIT 0, 5";

Вы открыты для SQL инъекции с этим, поэтому, пожалуйста, используйте подготовленное утверждение.

Включите отчеты об ошибках для PHP, указав в верхней части файлов PHP следующее:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

и mysqli_error($conn) для запросов.

На добавленной заметке : DELETE * FROM posts неверный синтаксис для удаления строки в MySQL. * (звездочка) не должна быть частью DELETE; он используется только для оператора SELECT.

Кроме того, мой коллега сказал мне, что вы должны использовать POST, а не GET в своей функции AJAX.

0 голосов
/ 25 февраля 2020

Вам не нужно получать значение опции, вместо этого получать значение выбора

$('#order').change(function() { 
    var selected = $(this).val(); // change to select val, not children
    $.ajax({
        type: 'GET',
        data: {order: selected},
        url: '../../php/includes/posts/feed.php'
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...