Как перебирать объекты в JavaScript и PHP - PullRequest
0 голосов
/ 20 декабря 2018

Мне нужно решить проблему с кодом на JS и PHP.По какой-то причине, всякий раз, когда этот код выполняется, он помещает первую запись во все строки таблицы вместо того, чтобы перебирать каждую запись и помещать их все в строки.Я был бы признателен, если бы кто-то помог мне понять, как решить эту проблему.Можно ли это исправить только с помощью цикла for?Заранее спасибо.

<?php include('../../functions.php');

    $query = "
    SELECT
    *
    FROM
    plobby
    LEFT JOIN users ON users.UID = plobby.UID
    WHERE
    `LID` = '". preg_replace("/[^A-Za-z0-9 ]/", '', $_POST['id']) ."';
    ";

    $sql = "SELECT COUNT(`LID`) AS `x` FROM `snipe`.`plobby` WHERE LID = '".$_POST['id']."';";
        
    $result = $db->query($query);
    $rst = $db->query($sql);

    $cnt = 0;

    if($rst->num_rows > 0)
        while($row = $rst->fetch_assoc())
            $cnt = $row["x"];

    if ($result->num_rows > 0) 
        for($i = 1;$i<= $cnt;$i++)
            echo json_encode($result->fetch_assoc());
    else 
        echo json_encode([]);
?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Вот объект, на который ссылается вышеуказанный цикл:

<script type="text/javascript">
	var state = {};
	for($i = 1;$i <= <?php echo getLobbytPlayers($_GET['id']);?>;$i++ ){
		
		var reloadTable = function (data) {
			if ($.data(state) == $.data(data)) {
				return;
			}
		
			$('#js-lobby-table').empty();
		
			$.each(data, function (rowNumber, rowData) {
			
				var row = $('<tr>');
			
				console.log(data);
			
				// Player
				row.append($('<td>', {
					'html': data.eName
				}));
			
				// Status
				row.append($('<td>', {
					'html': data.gameID == "000" ? 'waiting' : 'ingame'
				}));
			
				// Win %
				row.append($('<td>', {
					'html': 'TODO'
				}));
			
				// Games
				row.append($('<td>', {
					'html': 'TODO'
				}));
			
				// K/D
				row.append($('<td>', {
					'html': 'TODO'
				}));
				
				$('#js-lobby-table').append(row);
			});
			
			// Set the current table state.
			state = data;
		};
	}
	
	setInterval(function () {
		$.ajax({
			type: 'POST',
			url: '/lobby/api/table.php',
			data: {
				id: '<?= $_GET['id'] ?>'
			},
			success: reloadTable,
			dataType: 'json'
		});
	}, 10);
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

1 Ответ

0 голосов
/ 20 декабря 2018

Вы не должны звонить json_encode() несколько раз.Ответ должен содержать один объект JSON, а не несколько объектов.Вам нужно поместить все результаты в массив и в конце вызвать json_encode() для этого массива.

Также нет необходимости сначала получать счет.Просто звоните fetch_assoc(), пока не получите все результаты.

<?php include('../../functions.php');

    $query = "
    SELECT
    *
    FROM
    plobby
    LEFT JOIN users ON users.UID = plobby.UID
    WHERE
    `LID` = '". preg_replace("/[^A-Za-z0-9 ]/", '', $_POST['id']) ."';
    ";

    $result = $db->query($query);

    $rows = [];

    while ($row = $result->fetch_assoc()) {
        $rows[] = $row;
    }
    echo json_encode($rows);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...