0

私はMySQLとPHPに非常に慣れていません。通常、私は言語について少し助けが必要です。そうすれば、そこから始めることができます。ですから、私の最初の「複雑な」問題について助けていただければ幸いです。以下に、ネットワークに関するデータを保持し、5分ごとにデータが入力されるデータベースがあります。MACアドレスは、ハードウェア(make)に接続されているため、キーとして使用できる唯一の静的な値です。その他はすべて変更される可能性があります。これは私のデータベースの切り捨てられたサンプルです。時々、時間ごとに多かれ少なかれ行があります。

私はデータを表示するためにPHPフロントエンドに取り組んでいます。追加したい機能の1つは、リストされた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フロントエンドに最新の日時の行を表示させたいです。上記の例を使用する場合、ユーザーがWebページを参照するときに、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の組み合わせが太字になっている、このようなもので生成されたWebページになります。

| 2012-08-22 | 00:05:00 | 192.168.30.1 | 11:11:11:11:11:11 | NULL | NULL | Supermicroコンピューター| 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 | サーバーテクノロジー| NULL | NULL | NULL | NULL | NULL |
| 2012-08-22 | 00:05:00 | 192.168.30.10 | BB:BB:BB:BB:BB:BB | NULL | NULL | 汎用サーバー| NULL | NULL | NULL | NULL | NULL |

そして、変更された行を判別する場合、MySQLを使用するのが最善か、最新の2つの更新の行を取得し、PHPを使用して何が変更されたかを把握するのが最善かどうかわかりません。私の実際のデータベースには、1回あたり100を超えるエントリがあることに注意してください。

論理的には、これが私がやろうとしていることについてもう少し詳しく説明します。基本的に、上記の例を使用して、比較のために2つの配列を作成します。比較のために2つのフィールドを連結する方法を理解しましたが、まだ調査中ですが、そこからどこに進むべきか本当にわかりません。シェルスクリプトを使用してこれらの結果を簡単に取得し、データベースに直接入力できるため、これは非常に苛立たしいことです。私はPHPとMySQLで可能な限り多くのことをしようとしていますが、シェルスクリプトにこれを理解させるという考えは、より食欲をそそるようになっています。しかし、基本的にこれは私が上の表でやろうとしていることですが、操作に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
do
CONCAT Array1.ip、Array1.mac =Compare1およびCONCATArray2.ip、Array2.mac = Compare2
if Compare1!= Compare2
次に
、行を次のようにエコーします大胆な

4

1 に答える 1

0

別々datetimeフィールドを使用しても、それほど役に立ちません。datetime日ごとにレポートを作成する必要がある場合を除き、単一のものを用意する必要があります。その場合dateは、適切なインデックスの作成に関連します。注意として、内部 SQL 型にちなんで列に名前を付けないようにしてください。混乱を解消するためだけにそうなる可能date性がon_dateあります。プラスとして、クエリで使用するときにこれらをエスケープする必要はありません。timeat_time

と呼ばれるインデックス付きdatetimeフィールドを使用すると、変更が発生したかどうかを把握しようとするときに、おそらくここで必要なものを知ることがcreated_Atできます。ORDER BY created_at DESC

演算子を使用してBETWEEN日時値の範囲を選択し、特定の間隔での変更を確認することもできます。

何を求めているのかが完全に明確ではないため、より具体的にするか、これを再構成して、クエリがより自明になるようにする必要があります。

于 2012-08-23T02:11:47.477 に答える