簡體   English   中英

PHP PDO MySQL有效解析SQL查詢結果

[英]PHP PDO MySQL parsing SQL query results efficiently

我正在使用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

而不是array_diff和存儲巨型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
";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM