0

我有一个基于列名和字段值一起工作的数据库表列表。

我可以通过简单的主 ID 列字段值匹配来提取大约 3/4 的表。

使用我目前能够提取的表,我希望能够根据表中可能的列匹配来检索其余数据。

我已经开始了一个想法。但我不太确定如何完成这个过程。

这个网站使用的是 WordPress,但理想情况下,这仍然可以用直接的 PHP 很好地完成,而不使用 WordPress 数据库类。

检索有关学校的所有信息: $school = $this->get_school('129020');

功能: ( $this->get_school($id);)

private function get_school($id){
    global $wpdb;
    /* Retrieve the IPEDS database tables. */
    $columns = $this->map_database('iped');
    /* Retrieve the initial results by the UNITID. */
    $data = array();
    foreach($columns['UNITID']['shared_tables'] as $table){
        $data[$table] = $wpdb->get_results(
            "
            SELECT *
            FROM `{$table}`
            WHERE `UNITID` = '{$id}';
            ", 
            ARRAY_A
        );
    }
    return $data;
}

功能: ( $this->map_database($database_table))

private function map_database($database_table = 'all'){
    global $wpdb;
    /* Get all of the database tables. */
    $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
    $table_columns = array();
    foreach($tables as $table){
        if($database_table != 'all'){
            /* Filter tables by partial string matching the table name. */
            if(stripos($table[0], $database_table) === false){
                continue;
            }
        }
        /* Get all of the columns available in each database table. */
        $columns = $wpdb->get_results(
            "
            SELECT *
            FROM   information_schema.columns
            WHERE  table_name = '{$table[0]}'
            ORDER  BY ordinal_position  
            ",
            ARRAY_A
        );
        for($i = 0; $i < count($columns); $i++){
            $column = $columns[$i];
            /* Don't overwrite any data. Could result in missing or overlapping of data? */
            if(isset($table_columns[$table[0]]) && in_array($column['COLUMN_NAME'], $table_columns[$table[0]])){
                continue;
            }
            $table_columns[$table[0]][] = $column['COLUMN_NAME'];
        }
    }
    return $this->map_database_tables($tables, $table_columns);
}

功能: ( $this->map_database_tables($database_tables, $database_consolidated);)

/* 
$database_tables - Array consisting of strictly database tables. 
$database_consolidated - Nested array consisting of: table_name => table_columns
*/      
private function map_database_tables($database_tables, $database_consolidated){
    if(empty($database_tables) || empty($database_consolidated)){
        return;
    }
    $common_columns = array();

    foreach($database_consolidated as $table_name => $table_columns){
        for($i = 0; $i < count($table_columns); $i++){
            $table_column = $table_columns[$i];
            /* Find similar table columns in other database tables. */
            $search = $this->search_database_tables($database_consolidated, $table_column);
            if(!empty($search)){
                foreach($search as $column => $table){
                    $common_columns[$table_column]['shared_tables'] = $table;
                }
            }
        }
    }
    return $common_columns;
}

功能: ( $this->search_database_tables($tables, $column_name);)

/* Returns column name and database tables sharing the column name. */
private function search_database_tables($tables, $column_name){
    $common_tables = array();
    foreach($tables as $table_name => $table_columns){
        if(in_array($column_name, $table_columns)){
            $common_tables[$column_name][] = $table_name;
        }
    }
    return $common_tables;
}

生成以下格式的数组:

$database_map = array(
    'table_name' => array(
        'row_number' => array(
            'field_key' => 'field_value'
        )
    )
);

我不解的是下一步该做什么?我该去哪里?

我的所有数据都触手可及,但我只是不知道下一步该做什么。

这就是我的想法,但绝对需要一些指导或输入......

我想检查其他表列的值。因此,例如,如果我正在查找辅助 ID 号,该辅助 ID 号仅存在于尚未由主 ID 号提取的其他表之一中。

表 1 可能有一个名为“Secondary”的列和一个字段值为“123”。

我想循环浏览所有其他数据库表,看看是否存在“辅助”列。如果是,则根据该列名称的两个表字段值的匹配列名称和字段值从该表中提取所有字段。

我确信我的代码非常糟糕,可能会被大大简化。我一直在寻找一些现有的框架,它们可能已经实现了我想要的目标。我没有这样的运气找到任何东西。

我愿意就我的代码下一步去哪里寻求建议。我也对我可以使用的任何现有框架持开放态度。

4

0 回答 0