0

我对 MySQL 和 PHP 很陌生。通常我需要一些语言方面的帮助,然后我才能从那里开始。所以我真的很感谢我的第一个“复杂”问题的帮助。我有下面的数据库,其中包含有关网络的数据,并且每五分钟填充一次。MAC 地址是唯一真正静态的值,因为它附加到硬件(make),因此可以用作密钥。其他一切都可能发生变化。这是我的数据库的截断示例。有时每次有或多或少的行。

我一直在使用 PHP 前端来显示数据,我想添加的一个功能是比较列出的 IP,以及从最近一次到上次的 MAC-IP 对。如果与前一次相比,当前时间存在或不存在 IP,则获取这些行。此外,如果 MAC 切换到不同的 IP 或 IP 切换到不同的 MAC,也获取这些行。

基本上,这些是我用来获取数据以在 PHP 中显示的一些查询,但它们对于显示表中的内容非常基本。谢谢你,我很感激你的帮助。任何答案都会帮助我学到很多东西,在此之后我应该能够自己弄清楚更多。谢谢!

/* Get all results for Today's Date */
$result = mysql_query("SELECT * FROM hosts WHERE date = '$DateToday' ORDER BY date DESC,time DESC") or die('Error with mysql_query');

$CurrentLogTime = $row['time']; // Variable set to time field of first row.

/* Get all results for Today's Date and most recent log time. */
$result2 = mysql_query("SELECT * FROM hosts WHERE date = '$DateToday' and time = '$CurrentLogTime'") or die('Error with result2');

/* Get all results for Today's Date and previous log time. */
$result3 = mysql_query("SELECT * FROM hosts WHERE date = '$DateToday' and time = TIMEDIFF ('$CurrentLogTime', '00:05')") or die('Error with result3');

+------------+----------+----------------------+-------------------+------+------+----------------------+-------+------+--------+-------+------+
| date       | time     | ip                   | mac               | name | dns  | make                 | owner | note | status | specs | os   |
+------------+----------+----------------------+-------------------+------+------+----------------------+-------+------+--------+------+-------+
| 2012-08-22 | 00:00:00 | 192.168.30.1         | 00:00:00:00:00:00 | NULL | NULL | Supermicro Computer  | NULL  | NULL | NULL   | NULL  | NULL |
| 2012-08-22 | 00:00:00 | 192.168.30.10        | BB:BB:BB:BB:BB:BB | NULL | NULL | Generic Server       | NULL  | NULL | NULL   | NULL  | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.1         | 11:11:11:11:11:11 | NULL | NULL | Supermicro Computer  | NULL  | NULL | NULL   | NULL  | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.2         | 00:50:56:A4:52:5E | NULL | NULL | VMware               | NULL  | NULL | NULL   | NULL  | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.3         | 00:0A:9C:52:88:8C | NULL | NULL | Server Technology    | NULL  | NULL | NULL   | NULL  | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.10        | BB:BB:BB:BB:BB:BB | NULL | NULL | Generic Server       | NULL  | NULL | NULL   | NULL  | NULL |

作为一个例子来澄清我想要做什么。我总是希望我的 HTML/PHP 前端显示最新日期和时间的行。如果我们使用上面的示例,我希望我的用户在浏览网页时看到 00:05 的所有行。这很容易。现在假设在 00:00,我将 MAC 00:00:00:00:00:00 与 192.168.30.1 配对。但是在 00:05,MAC 11:11:11:11:11:11 占用了 192.168.30.1。我想在我的 HTML 中突出显示该行。另外,假设在 00:00,当时唯一的 IP 是 192.168.30.1 和 192.168.30.10。但是在 00:05,不仅有 192.168.30.1 和 .10,而且还有 192.168.30.2 和 192.168.30.3。我想突出显示在 00:05 出现的新 IP 行。最后,我们看到 192.168.30.10 的 IP-MAC 对在两次之间是相同的。当我生成最终用户表时,我仍然想回应这一​​点,但我不想以任何方式突出显示它。所以最终的结果应该是一个类似这样的网页生成的网页,其中与上次不同的 IP-MAC 组合以粗体显示。

| 2012-08-22 | 00:05:00 | 192.168.30.1 | 11:11:11:11:11:11 | 空 | 空 | 超微电脑 | 空 | 空 | 空 | 空 | 空 |
| 2012-08-22 | 00:05:00 | 192.168.30.2 | 00:50:56:A4:52:5E | 空 | 空 | 虚拟机 | 空 | 空 | 空 | 空 | 空 |
| 2012-08-22 | 00:05:00 | 192.168.30.3 | 00:0A:9C:52:88:8C | 空 | 空 | 服务器技术 | 空 | 空 | 空 | 空 | 空 |
| 2012-08-22 | 00:05:00 | 192.168.30.10 | BB:BB:BB:BB:BB:BB | 空 | 空 | 通用服务器 | 空 | 空 | 空 | 空 | 空 |

而当谈到确定已更改的行时,我不知道是最好使用 MySQL 还是只获取最近两次更新的行并使用 PHP 来找出发生了什么变化?请记住,我的实际数据库每次将有超过 100 个条目。

从逻辑上讲,这里有一些关于我想要做的事情的更多细节。基本上,使用上面的示例,我想创建两个数组进行比较。我已经想出了如何将这两个字段连接起来进行比较,但是虽然我仍在研究,但我真的不知道从那里去哪里。这对我来说非常令人沮丧,因为我可以通过 shell 脚本轻松获得这些结果并将它们直接输入数据库。我试图在 PHP 和 MySQL 中做尽可能多的事情,但是让我的 shell 脚本解决这个问题的想法变得越来越有食欲。但基本上这就是我想要对上表做的事情,但我什至不知道最好使用 MySQL 还是 PHP 进行操作。>.<

Array1
mac               | ip
00:00:00:00:00:00 | 192.168.30.1
BB:BB:BB:BB:BB:BB | 192.168.30.10

Array2
mac               | ip
11:11:11:11:11:11 | 192.168.30.1
00:50:56:A4:52:5E | 192.168.30.2
00:0A:9C:52:88:8C | 192.168.30.3
BB:BB:BB:BB:BB:BB | 192.168.30.10

WHERE Array1.ip == Array2.ip 或 Array1.mac == Array2.mac
执行
CONCAT Array1.ip,Array1.mac = Compare1 和 CONCAT Array2.ip,Array2.mac = Compare2
if Compare1 != Compare2
然后
将该行回显为大胆的

4

1 回答 1

0

使用单独的datetime字段不会对您有太大帮助。如果有的话,你应该有一个单一的datetime,除非你需要按天做报告,在这种情况下,这date与创建适当的索引有关。请注意,尽量避免在内部 SQL 类型之后命名列。date可能on_date而且time可能at_time只是为了消除混乱。另外,在查询中使用这些内容时不必转义。

使用datetime名为的索引字段created_At允许您ORDER BY created_at DESC在尝试确定是否发生更改时可能是您想要的。

您还可以使用BETWEEN运算符选择日期时间值的范围,以检查特定时间间隔内的更改。

您的要求并不完全清楚,因此您可能必须更具体,或者尝试重新构建它,以便查询变得更加不言自明。

于 2012-08-23T02:11:47.477 回答