【发布时间】:2016-01-06 01:46:27
【问题描述】:
我的数据库记录了访问我网站的用户的 IP 地址和会话 ID。我想显示一个 HTML 表格,其中包含前十个出现的 IP 地址以及与每个 IP 地址关联的不同会话的数量。
所以我从这个查询开始:
$sql="SELECT ip, country, city, COUNT(*) as count FROM Hits GROUP BY ip ORDER BY count DESC LIMIT 10";
然后,对于生成的 10 行中的每一行,我使用一个 while 循环来查询同一个数据库,以提取与每个地址关联的不同会话 ID 的数量,因此:
$sql="SELECT DISTINCT Session FROM Hits WHERE ip='$ipaddress'"
我的挑战是在执行 while 循环时构建一个数组(与 MySQLi 查询结果具有相同的结构),随后我可以在该数组上使用 foreach 循环来输出 HTML 表。这是我的完整代码:
$con = mysqli_connect("localhost","user","password","dbase");
$sql="SELECT ip, country, city, COUNT(*) as count FROM Hits GROUP BY ip ORDER BY count DESC LIMIT 10";
$result = mysqli_query($con,$sql);
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
$ipaddress = $row["ip"];
$sql="SELECT DISTINCT Session FROM Hits WHERE ip='$ipaddress'";
$res = mysqli_query($con,$sql);
$distinctsessions = mysqli_num_rows($res);
$data[] =$ipaddress.",".$distinctsessions;
};
$colNames = array_keys(reset($data));
foreach($data as $row) {
echo "<tr>";
foreach($colNames as $colName) {
echo "<td>".$row[$colName]."</td>";
}
echo "</tr>";
}
echo "</table>";
mysqli_free_result($result);
mysqli_free_result($res);
mysqli_close($con);
我意识到我的错误在于:
$data[] =$ipaddress.",".$distinctsessions;
这可能不是正确的结构,但我不知道是什么。感谢您的建议。
【问题讨论】:
-
你的问题到底是什么?
-
您的数据不包含 colName 键名
-
w3schools.com/php/php_arrays.asp - 这可能对你有帮助
-
使用 $data[] = ['ip' => $ip, 'dist' => $dist];并删除表中的第二个 foreach 并使用简单的 $row['ip'] - $row['dist']
-
@daremachine 谢谢。我已经尝试过您建议的
['ip' => $ip, 'dist' => $dist]格式,但无济于事。我没有删除第二个 foreach 因为我不明白这有什么帮助。您说我的 $data 数组不包含 $colName 键,但我认为$colNames = array_keys(reset($data));创建了一个包含键的数组(现在设置为ip和dist),然后foreach($colNames as $colName) { echo "<td>".$row[$colName]."</td>"; }将对其进行操作。我是新手,如果我错了,请原谅我,请帮助我理解。