我正在使用PHP PDO来解析我从针对数据库的MySQL查询中收到的结果。我现在遇到了耗尽已分配内存的问题。有关如何提高代码效率的建议或其他更有效的方法来处理查询结果而不是解析PDO?谢谢。
这是我的代码(它将返回数据库是否具有参照完整性):
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
答案 0 :(得分:0)
您应该使用Query来获取它,而不是使用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
";