PHP PDO MySQL 高效解析 SQL 查询结果

PHP PDO MySQL parsing SQL query results efficiently

我正在使用 PHP PDO 来解析我从 MySQL 数据库查询中收到的结果。我现在 运行 遇到 运行 分配内存不足的问题。关于如何提高我的代码效率的任何建议或其他比解析 PDO 更有效的处理查询结果的方法?谢谢。

这是我的代码(它将 return 数据库是否具有参照完整性):

function generateDSN($host, $dbname)
{
    return 'mysql:host='. $host . ';dbname=' . $dbname; 
}


$dbName = $argv[2];
//Used for query construction

$dsn = generateDSN($argv[1], $argv[2]); 
//create DSN

$link = new PDO($dsn, "username", "password"); 
//Connect to the database
//PDO($dsn, username, password)

if ($link->connect_error) 
{
    die("Connection failed: " . $link->connect_error);
}
else
{
    echo "Connected successfully\n";    
}
//validate database connection


$query = "SELECT TABLE_CONSTRAINTS.TABLE_NAME, KEY_COLUMN_USAGE.COLUMN_NAME, KEY_COLUMN_USAGE.REFERENCED_TABLE_NAME, KEY_COLUMN_USAGE.REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS RIGHT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ON INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME = INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME <> 'PRIMARY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_SCHEMA = '".$dbName."';"; 
//Create query to return list of tables with foreign keys 
/* Query return format: 
+--------------+------------------------+-----------------------+------------------------+
| TABLE_NAME   | COLUMN_NAME            | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+--------------+------------------------+-----------------------+------------------------+
*/

$result = $link->query($query);
//Get query results 

$x = 0; 
$tableA = [];
$tableB = [];
//Create arrays to hold data from FK queries

while($tables = $result->fetch(PDO::FETCH_ASSOC))
{
    $test[] = $tables; 
    $assoc = $test[$x]; 
    //assign assoc[] the value of $query (will iterate through query table row by row)

    $tableName = $assoc['TABLE_NAME']; 
    $columnName = $assoc['COLUMN_NAME']; 
    $refTableName = $assoc['REFERENCED_TABLE_NAME'];
    $refColumnName = $assoc['REFERENCED_COLUMN_NAME']; 
    //get data values for each column

    $fkQueryA = "SELECT DISTINCT " . $columnName . " FROM " . $dbName . "." . $tableName . " ORDER BY ".$columnName." ;"; 
    $fkQueryB = "SELECT DISTINCT " . $refColumnName . " FROM " . $dbName . "." . $refTableName . " ORDER BY ".$refColumnName." ;"; 
    //A -- Table with column that is the foreign key
    //B -- Table with column that the foreign key references

    $resultA = $link->query($fkQueryA);
    $resultB = $link->query($fkQueryB);
    //Get query results 

    while($var = $resultA->fetchColumn())
    {   
        $tableA[] = $var;
    }
    //Push query results to table


    while($vari = $resultB->fetchColumn())
    {
        $tableB[] = $vari; 
    }
    //Push query results to table

    $x++;
    //increment counter to move through $tables 
}

$resultCompAB = array_diff($tableA, $tableB); 
//return array with all values of A that are not in B


if(empty($resultCompAB))
{
    echo "Database ".$dbName." has referential integrity."; 
} 
else
{
    echo "Orphan Values in database ".$dbName.": \n"; 
    array_diff($tableB, $resultCompAB); 
}
//print the results

而不是 array_diff 和存储 GIGANT php 数组,您应该通过查询获取它。

此查询将为您提供不在 B 中的 A 值:

$tableName = $assoc['TABLE_NAME']; 
$columnName = $assoc['COLUMN_NAME']; 
$refTableName = $assoc['REFERENCED_TABLE_NAME'];
$refColumnName = $assoc['REFERENCED_COLUMN_NAME']; 


$sql = "SELECT * FROM {$tableName} LEFT JOIN {$refTableName}
ON {$tableName}.{$columnName} = {$refTableName}.{$refColumnName}
WHERE {$refTableName}.{$refColumnName} IS NULL
";