【问题标题】:How to Iterate through Object in JavaScript and PHP如何在 JavaScript 和 PHP 中迭代对象
【发布时间】:2018-12-20 18:40:56
【问题描述】:

我必须解决一个涉及 JS 和 PHP 代码的问题。出于某种原因,每当执行此代码时,它会将第一个条目放入表的所有行中,而不是遍历每个条目并将所有条目放入行中。如果有人帮助我了解如何解决此问题,我将不胜感激。这可以通过“for in”循环来解决吗?提前致谢。

<?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([]);
?>
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

这是上述循环所指的对象:

<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>
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

【问题讨论】:

  • 为什么COUNT(*) 查询需要一个while 循环?它总是只返回 1 行。
  • 在 javascript 代码中,您使用 $.each jquery 函数来迭代您的数据对象,但您没有使用您在每次迭代中声明的 rowData 项。所以你需要改变你所有的'html':data.{property}为'html':rowData.{property},即。 rowData.name 等。假设您的数据对象具有来自 $result 查询的所有值。

标签: javascript php object for-loop


【解决方案1】:

您不应多次致电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);
?>

【讨论】:

  • 感谢您的快速回复。不过,唯一让我感到困惑的是“$rows[]”部分。写那个和只写“$rows”有什么区别?
猜你喜欢
  • 2012-01-13
  • 2017-03-17
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多