【问题标题】:Looping MySQL Results With Additional Queries使用附加查询循环 MySQL 结果
【发布时间】:2015-07-26 07:04:23
【问题描述】:

我希望有人能够帮助我为我正在编写的 PHP 页面构思一个解决方案。

实际上,我在名为“Servers”的 MySQL 数据库中有一个主表。其中有四个领域; 部门serverAserverBserverC。对于上下文,部门条目是部门的名称,serverA、serverB 和 serverC 对应于每个部门的三台服务器的主机名。

我要做的是获取部门名称、serverA、serverB 和 serverC,并使用这些数据填充多个 SQL 查询。为了清洁和关系,我将数据分成多个表。这就是我所拥有的;

<?php
$conn = mysqli_connect("server", "root", "root") or die('Error connecting to MySQLserver.');
mysqli_select_db($conn, "Database") or die("Failed to connect to database");
$sql = "SELECT * FROM Servers";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
    $deptartment = $row['department']
    $serverA = $row['serverA'];
    $serverB = $row['serverB'];
    $serverC = $row['serverC'];
}
} else {
echo "Unable to connect to server.  Please check your settings.";
}
?>

然后我想做的是做一种foreach,其中foreach记录serverA,发生以下情况;

<?php
$conn = mysqli_connect("server", "root", "root") or die('Error connecting to MySQLserver.');
mysqli_select_db($conn, "Database") or die("Failed to connect to database");
$sql = "SELECT * FROM Data WHERE `serverName` = '$serverA' ORDER BY `timestamp` DESC LIMIT 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
    $serverName = $row['serverName'];
    $serverType = $row['serverType'];
    $serverAge = $row['serverAge'];
}
} else {
echo "Unable to connection to server.  Please check your settings.";
}
?>

然后我可以使用相同的理论循环遍历 serverB 的结果,并让 serverB 的每条记录完成另一个查询以获取其他数据。

我似乎在为如何循环遍历每个结果并使用它填充其他查询的正确语法而苦苦挣扎。

任何可能的指导?

谢谢!

Sample Data:
department: Math
serverA: math-server-windows.school.edu
serverB: math-server-mac.school.edu
serverC: math-server-linux.school.edu

department: Psychology
serverA: psychology-server-windows.school.edu
serverB: psychology-server-mac.school.edu
serverC: psychology-server-linux.school.edu

department:  Arts
serverA: artsserver.school.edu
serverB: artsold.school.edu
serverC: artsbackup.school.edu

【问题讨论】:

  • 您最好包含您的实际表定义和一些示例数据。
  • 什么决定了给定的服务器是a、b还是c
  • 对不起,不够清晰!我已经用“服务器”表中的示例更新了我的帖子。上面有一个三行的例子。谢谢!!
  • 警告:使用mysqli 时,您应该使用参数化查询和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值来完成此操作,因为您将创建严重的SQL injection bugs从不$_POST数据直接放入查询中。
  • 您可以使用JOIN 查询-SELECT * FROM Servers JOIN Data ON Data.serverName = Servers.serverA ORDER BY `timestamp`,而不是在循环中执行循环

标签: php mysql loops mysqli


【解决方案1】:

您可以使用 JOIN 来简化此操作。

Data 有一个字段servername,对应于服务器表中的serverAserverBserverC。所以你可以像这样运行查询:

SELECT Data.*,
  A.serverA AS serverA, 
  B.serverB AS serverB, 
  C.serverC AS serverC 
FROM Data
JOIN servers as A on Data.servername = A.serverA
JOIN servers as B on Data.servername = B.serverB
JOIN servers as C on Data.servername = C.serverC
ORDER BY <whatever>

所以现在每一行都有每个部门的服务器信息,所以像这样循环遍历结果:

while( $row = $result->fetch_assoc() ){
  echo "\nDept: ".$row['department'];
  echo "\nA: ".$row['serverA'];
  echo "\nB: ".$row['serverB'];
  echo "\nC: ".$row['serverB'];
}

【讨论】:

  • 这很好用!感谢您的建议。在将我的数据编码为 JSON 数据时,我有一些语法问题需要解决,但我正确地从各种表中提取,并且最初的问题已经得到解答。谢谢!
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 2012-09-09
  • 2017-12-04
  • 2012-08-10
  • 2021-02-15
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多