我有一个名为(conntrack)的数据库,包含未知数量的表。我有一个静态表“tabidx”,其中有一列“date”。
下表是静态的,其名称是tabidx,它提供对其他表的引用:
tabidx (table):
+------------+
| date |
+------------+
| 2015-04-25 |
| 2015-04-26 |
| 2015-04-27 |
| 2015-04-28 |
| 2015-04-29 |
+------------+
以下是'tabidx''date'中引用表的示例:
2015-04-25 (table):
+---------------------------------------------+
| time | username | srcip | scport |
+---------------------------------------------+
| 19:20:00 | L001000 | 10.10.10.1 | 1304 |
| 19:20:00 | L001001 | 10.10.10.2 | 1640 |
| 19:20:01 | L001002 | 10.10.10.3 | 2001 |
+---------------------------------------------+
2015-04-26 (table):
+---------------------------------------------+
| time | username | srcip | scport |
+---------------------------------------------+
| 19:21:00 | L001000 | 10.10.10.1 | 1304 |
| 19:21:00 | L001001 | 10.10.10.2 | 1640 |
| 19:21:01 | L001002 | 10.10.10.3 | 2001 |
+---------------------------------------------+
我想向管理器列出tabidx中存在的可用表,并计算我们在tabidx中引用的所有表中有多少用户。所以,如果经理要求:
$_GET['fromdate'] = '2015-05-25'
$_GET['todate'] = date(); //till today date 2015-04-30
$_GET['username'];
$_GET['srcport'];
$_GET['srcip'];
我希望输出根据上面的请求匹配mysql行。 例如:
OUTPUT: [available tables WHERE username=L00100]
+-------------------------------------------+
| Date and Time | username | srcip | scport |
+-------------------------------------------+
| 2015-04-25 | L001000 | % | % |
| 2015-04-26 | L001000 | % | % |
| 2015-04-27 | L001000 | % | % |
+-------------------------------------------+
如何列出或选择tabidx中找到的所有表格。?我不知道如何在mysql中使用预处理语句。
我知道第一步应该列出可用的表格。 如果有人想要请求具有特定用户的可用表(例如“L002000”),那么我们就不应该列出这些表,因为我们的动态表没有这个用户名。
$db = new dB();
$_GET['fromdate'] = ( isset($_GET['fromdate']) && isValideDate($_GET['fromdate']) ) ? $_GET['fromdate'] : $todayDate;
$_GET['todate'] = ( isset($_GET['todate']) && isValideDate($_GET['todate']) ) ? $_GET['todate'] : $todayDate;
$sql_fromdate = " date >= '{$_GET['fromdate']}' AND";
$sql_todate = " date >= '{$_GET['todate']}'";
$result = $db -> query("SELECT date FROM tabidx WHERE $sql_fromdate $sql_todate");
$_GET['username'] = ( isset($_GET['username']) && $_GET['username'] !='' ) ? ....$_GET['username'] : '';
if($result)
{
// Loop through the available tables that are included in table 'tabidx'
while( $b_row = $result -> fetch_assoc() )
{
$table_name = $db_row['date'];
// Query the table and count the number of rows according to the requested $_GET Method
$result2 = $b -> query("SELECT count(*) FROM $table_name WHERE username LIKE '{$_GET['username']}%'");
$num_row = $result2 -> fetch_row();
// Check if the number of rows are greater than zero
// then show the row of $result to the user
if($num_row[0] > 0)
{
echo '<tr>';
echo '<td>$table_name</td>';
echo "<td>{$_GET['username']}</td>";
echo '<td></td>';
echo '<td></td>';
echo '</tr>';
}
}
}
我已经成功地制定了一个临时解决方案,但我知道这个解决方案非常糟糕,因为我们可能会在一年内达到360个桌面。
我们可以使用一个mysql查询完成整个工作吗?
答案 0 :(得分:0)
也许这可能会有所帮助。我们可以通过以下查询从schema table获取一些信息:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '*'
SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'db_name'
[AND table_name LIKE 'wild']
SHOW TABLES
FROM db_name
[LIKE 'wild']
可能有一些表可能与您无关,我没有尝试过,但是通过记忆,这可能是一个起点。
希望这有帮助。