我有一个检查脚本,它检查服务器/交换机/路由器是否还活着。
记录全部存储在一个db
中CREATE TABLE IF NOT EXISTS `mod_monitoring` (
`id` int(11) NOT NULL,
`parentid` int(11) NOT NULL,
...
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
所以一个路由器可以在它下面有一个交换机(通过父ID连接),并且可以在它下面有一个服务器,现在如果服务器出现故障,它很好,因为没有任何东西可以在它下面,并且不会发送双重电子邮件但是,让我们说一个路由器出来,它下面有一个路由器和一些服务器。
因为我们检查了所有内容,我们会向管理员发送每个项目的电子邮件,告诉他们每个人都已经死了,但我只需发送一封关于路由器关闭的电子邮件。希望这是有道理的,我需要以某种方式只制作一个没有孩子的ID数组..
我可以创建一个已关闭的所有节点的数组,但是如何检查它是否是树中的第一个?并删除其下的所有内容
有人可以帮忙吗?多年来一直在考虑这个问题!
答案 0 :(得分:0)
如果我理解了你想要的东西,那就是从父级到父级的迭代(需要一个未指定数量的JOIN
),你需要使用Stored Procedure。事实上,要实现这一目标,您需要在SQL查询中无法实现的Kleene closure。
答案 1 :(得分:0)
最后,我最终制作了所有死亡ID的数组$ key => $ ID
然后使用以下
if(is_array($dead)) {
foreach($dead as $key => $id) {
$conn = $db->query("SELECT * FROM mod_monitoring WHERE id = {$id}");
$data = $db->fetch_array($conn);
if($data['parentid'] == 0) {
$final[] = $id;
unset($dead[$key]);
}
}
}
if(is_array($dead)) {
foreach($dead as $key => $id) {
$conn = $db->query("SELECT * FROM mod_monitoring WHERE id = {$id}");
$data = $db->fetch_array($conn);
if(in_array($data['parentid'], $final)) {
unset($dead[$key]);
}
if(in_array($id, $dead)) {
unset($dead[$key]);
}
}
}