Проблема с функцией AJAX GET внутри PHP FUNCTION - PullRequest
1 голос
/ 20 февраля 2020

Я получил некоторое время l oop, и внутри этого l oop я получил другое время, пока l oop, что я хочу запускать только после button.click

Мой javascript код внутри профиля . php:

$('.commentbtn').click(function()
{
    $.ajax({
        url: 'includes/functions.inc.php',
        type: 'GET',
        data: {
            'offset': 0,
            'limit': 3
        },
        success: function(data)
        {}
    });

Мой php код внутри functions.in c. php:

function getProfilePostModals($conn)
{
    $uid = $_SESSION['userId'];

    $sql = "SELECT * FROM posts WHERE uid=$uid AND type=1";
    $query = mysqli_query($conn, $sql);

    while ($postrow = $query->fetch_assoc()) 
    {
        $pid = $postrow['pid'];

        //// some code for the posts /////
        echo "<input id='opencomments".$pid."' class='commentbtn' type='button' value='Comment'>";

        if (isset($_GET['offset']) && isset($_GET['limit'])) {
            $commentssql = "SELECT * FROM postcomments WHERE pid=$pid";
            $commentsquery = mysqli_query($conn, $commentssql);

            while ($commentrow = $commentsquery->fetch_assoc())
            {
                //// some code for the comments that i want to run after "offset" and "limit" isset
            }
        }
    }
}

Все работало нормально, прежде чем я начал добавлять if(isset). Но теперь комментарии больше не подходят. То, что я хочу сделать, это загрузить функцию прокрутки для комментариев, я знаю, что это еще не полный код для этого, я просто пытаюсь посмотреть, смогу ли я заставить isset работать в первую очередь. Заранее спасибо, я все еще учусь.

ОБНОВЛЕНИЕ: В functions.in c. php есть более 1 функции внутри него и внутри моего профиля. php У меня есть этот код, чтобы получить все:

<?php include 'includes/functions.inc.php'; ?>
<?php getProfilePostModals($conn);?>

Я не знаю, помогает ли эта информация или нет.

** НОВОЕ ОБНОВЛЕНИЕ: **

getcomments.in c. php:

<?php if (isset($_GET['offset'])) {
    require 'dbh.inc.php';
    $pid = $_GET['pid'];

$commentssql = "SELECT * FROM postcomments WHERE pid=$pid";
$commentsquery = mysqli_query($conn, $commentssql);
while ($row = $commentsquery->fetch_assoc()) {
    $commentuid = $row['uid'];
    $pcid = $row['pcid'];
    $commentpid = $row['pid'];
    $commentdate = $row['date'];
    $comment = $row['postcomment'];

    $usersql = "SELECT * FROM users WHERE id=$commentuid";
    $userquery = mysqli_query($conn, $usersql);
    $userrow = $userquery->fetch_assoc();
    $commentimage = $userrow['imageUsers'];
    $ctusername = $userrow['uidUsers'];

    echo "<div id='deletecomment".$pcid."' class='deletecommentverify'>
    <form action='includes/deletecomment.inc.php' method='POST' runat='server' name='deletepost_form'>
        <h3>Are you sure you want to delete this comment?</h3>
        <input type='hidden' name='pcid' value='".$pcid."'>
        <button class='deletecommentbtn' type='submit' name='deletecomment_submit'>Yes</button>
        <input id='closedeletecomment".$pcid."' class='closedeletecomment' type='button' value='No'>
    </form>
</div>
    <div class='commentbox' id='commentbox".$pcid."'>
            <img class='usercommentimage' src='images/".$commentimage."'>
            <input type='hidden' name='commentuid' value='".$commentuid."'>
            <p><a href='profile.php'>".$ctusername." </a> ".$comment."</p>";
            if ($commentuid == $_SESSION['userId']) {
                echo "
            <span class='deletecommenticon' id='opendeletecomment".$pcid."'></span>";
            }
            echo "
            <div class='comment_info'>
                <span class='comment_count'>".$commentdate."</span>
            </div>

        </div>
        ";
}
}

И я сделал тест. php просто чтобы попробовать его с этим кодом:

<?php
error_reporting(E_ALL); ini_set('display_errors', 1);
session_start();
include 'includes/dbh.inc.php';
include 'includes/functions.inc.php';
include 'includes/like.inc.php';
include 'includes/getcomments.inc.php';
date_default_timezone_set('Europe/Copenhagen');
if (!isset($_SESSION['userId'])) {
    header("Location: login.php");
}
?>

<!DOCTYPE html>
<html>

<head>
    <title>Beautytrends</title>
    <link href="https://fonts.googleapis.com/css?family=Mali|Raleway&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/fontawesome.min.css">
    <link href="css/style.css" type="text/css" rel="stylesheet">
    <link rel="icon" href="images/notext-logo.png">
</head>

<body>


  <input id='181' class='commentbtn' data-id='181' type='button' value='Comment'>
    <div id="profile-content">



    </div>



<script src="js/jquery-3.4.1.min.js"></script>


<script>



$(document).ready(function(){



                $('.commentbtn').click(function(){
                    var pid = $(this).attr("id")
                    $.ajax({
                        url: 'test.php',
                        type: 'GET',

                        data: {
                            'offset': 0,
                            'limit': 3,
                            'pid' = pid

                        },
                        success: function(data){
                            $('#profile-content').append(data);}


                        }

                    });
                });

            });

</script>

</body>
</html>

Но это все еще не работает. Я попытался добавить в файл «includes / getcomments.in c. php? Offset = 0 & limit = 3 & pid = 181» в браузере, а затем все всплыло, так что ajax не отправляет данные GET в getcomments.

Ответы [ 2 ]

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

Первое, что вы хотите сделать, это загрузить jquery в главном разделе, а не в середине страницы:

<head>
    <title>Beautytrends</title>
    <link href="https://fonts.googleapis.com/css?family=Mali|Raleway&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/fontawesome.min.css">
    <link href="css/style.css" type="text/css" rel="stylesheet">
    <link rel="icon" href="images/notext-logo.png">
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>

Затем вы можете заменить кнопку

<input id='181' class='commentbtn' data-id='181' type='button' value='Comment'>

с

<div class="button-holder">
  <!-- We set the initial value 1 because we want only 1 results at a time -->
  <input type="hidden" id="result_no" value="1">
  <input type="button" class="button btn-md btn-success load-button" id="loadmore" value="Load More Results">
</div>

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

Ваш javascript можно заменить следующим кодом:

<script type="text/javascript">
$(document).ready(function(){
 $("#loadmore").click(function(){
  loadmore();
 });
});

function loadmore()
{
 var val = document.getElementById("result_no").value;
 $.ajax({
 type: 'post',
 url: 'load_more.php',
 data: {
  getresult:val
 },
 success: function (response) {
  var content = document.getElementById("profile-content");
  content.innerHTML = content.innerHTML+response;

  // We increase the value by 1 because we limit the results by 1
  document.getElementById("result_no").value = Number(val)+1;
 }
 });
}
</script>

Смещение заменено result_no, поэтому ваш другой код будет меняться лишь незначительно. Убедитесь, что это собственный php файл с именем load_more. php (если вы хотите изменить имя файла, измените его и в javascript):

<?php if (isset($_GET['result_no'])) {
    require 'dbh.inc.php';
    $pid = $_POST['result_no'];

$commentssql = "SELECT * FROM postcomments WHERE pid=$pid";
$commentsquery = mysqli_query($conn, $commentssql);
while ($row = $commentsquery->fetch_assoc()) {
    $commentuid = $row['uid'];
    $pcid = $row['pcid'];
    $commentpid = $row['pid'];
    $commentdate = $row['date'];
    $comment = $row['postcomment'];

    $usersql = "SELECT * FROM users WHERE id=$commentuid";
    $userquery = mysqli_query($conn, $usersql);
    $userrow = $userquery->fetch_assoc();
    $commentimage = $userrow['imageUsers'];
    $ctusername = $userrow['uidUsers'];

    echo "<div id='deletecomment".$pcid."' class='deletecommentverify'>
    <form action='includes/deletecomment.inc.php' method='POST' runat='server' name='deletepost_form'>
        <h3>Are you sure you want to delete this comment?</h3>
        <input type='hidden' name='pcid' value='".$pcid."'>
        <button class='deletecommentbtn' type='submit' name='deletecomment_submit'>Yes</button>
        <input id='closedeletecomment".$pcid."' class='closedeletecomment' type='button' value='No'>
    </form>
</div>
    <div class='commentbox' id='commentbox".$pcid."'>
            <img class='usercommentimage' src='images/".$commentimage."'>
            <input type='hidden' name='commentuid' value='".$commentuid."'>
            <p><a href='profile.php'>".$ctusername." </a> ".$comment."</p>";
            if ($commentuid == $_SESSION['userId']) {
                echo "
            <span class='deletecommenticon' id='opendeletecomment".$pcid."'></span>";
            }
            echo "
            <div class='comment_info'>
                <span class='comment_count'>".$commentdate."</span>
            </div>

        </div>
        ";
}
}

У меня есть никогда не использовал MySQL, поэтому я не могу это проверить. Однако это работает с другим запросом, использующим Postgres, поэтому он должен работать нормально, если ваш запрос действителен.

Любые проблемы, просто дайте мне знать. Это также не решает ваши проблемы с инъекцией, но вы можете решить их позже.

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

Вот мои комментарии и предложения, чтобы помочь решить ваши проблемы.

Я не понимаю, что вы пытаетесь сделать здесь, но $(this) относится к кнопке само по себе, что не похоже на то, что вам нужно. Я не вижу, что вы на самом деле тоже используете переменную.

$('.commentbtn').click(function()
{
    $post = $(this);

Вам нужно что-то сделать с полученным ответом. Пока все не заработает, я бы порекомендовал следующее. Затем вы можете просто проверить консоль браузера на предмет вывода, отправленного с сервера.

success: function(data)
        {console.log(data);}

Вы ссылаетесь на неправильное имя переменной, $row должно быть $postrow. Это приведет к ошибке, поскольку индекс ['pid'] не существует.

while ($postrow = $query->fetch_assoc()) 
    {
        $pid = $row['pid'];

Для этого бита вам нужно что-то сделать, если переменные не установлены, например, отправьте ответ, иначе вы никогда не узнаете, что пошло не так. Кроме того, как указано в комментариях, НИКОГДА не обращайтесь к предоставленным пользователем данным напрямую, без предварительной проверки / дезинфекции, и используйте подготовленные операторы для своих запросов.

if (isset($_GET['offset']) && isset($_GET['limit'])) {
    $commentssql = "SELECT * FROM postcomments WHERE pid=$pid";
    $commentsquery = mysqli_query($conn, $commentssql);

    while ($commentrow = $commentsquery->fetch_assoc())
    {
        //// some code for the comments that i want to run after "offset" and "limit" isset
    }
} else {
    echo "Expected $_GET values not received";
}

Наконец, у вас нет возможности зная, что ваши запросы терпят неудачу, потому что у вас нет обработки ошибок. Это то, что вам нужно реализовать в своем коде.

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