2017-04-26 27 views
0

2つの異なるデータベースから2つのクエリをマージしようとしています(両方のデータベースから合計を取得しています)。 私が別のライブラリ内の関数を行っている、これは私のコードです:PHPのライブラリから関数を呼び出してクエリの結果を表示

function getFirstTables($conn) { 
    $tables = []; 

    $q = "SELECT DISTINCT job_processing_table FROM job_type"; 

    $_tables = $conn->query($q); 
    while ($table = $_tables->fetch_assoc()) { 
     $tables []= $table["job_table"]; 
    } 

    return $tables; 
} 


/** 
* This returns a list of all call_report_* tables. 
* $conn: connection to database 
* @returns: list of tables 
*/ 
function getSecondTables($conn) { 

    $call_tables = []; 

    $r = "SHOW TABLES LIKE 'call_report_%'"; 

    $c_r_tables = $conn->query($r); 
    while ($c_r_table = $c_r_tables->fetch_assoc()) { 
     $call_tables []= $c_r_table["Tables_in_spear_reports (call_report_%)"]; 
    } 

    return $call_tables; 
} 



/** 
* This returns the constructed query for getting test data from spearlinedb 
* $conn: connection to database 
* $startDate: call start time 
* $endDate: call end time 
* @returns: constructed query as a string 
*/ 
function constructFirstQuery($conn, $startDate, $endDate) { 

    foreach(getFirstTables($conn) as $table) { 

     $sql []= "SELECT 
       number.company_id AS company_id, 
       DATE(call_start_time) AS `date`, 
       COUNT(*) AS `sub_total`, 
       '$table' AS `table` 
       FROM $table 
       LEFT JOIN number ON number.id = $table.number_id 
       WHERE $table.show IS TRUE 
       AND call_start_time BETWEEN '$startDate 00:00:00' AND '$endDate 23:59:59' 
       AND $table.processing_complete IS TRUE 
       GROUP BY `date`"; 
    } 

    $sql = implode("\n UNION \n", $sql); 
    return $sql = "SELECT company_id, `date`, 
        SUM(sub_total) AS First_total, 
        0 AS Second_total 
        FROM ($sql) AS temptable1 
        GROUP BY company_id, `date`"; 

} 


/** 
* This returns the constructed query for getting test data from reportingdb 
* $conn: connection to database 
* $startDate: call start time 
* $endDate: call end time 
* @returns: constructed query as a string 
*/ 
function construcSecondQuery($conn_2, $startDate, $endDate) { 

    foreach(getSecondTables($conn_2) as $table) { 
     $company_id = str_replace('call_report_', '', $table); 
     $sql_cr []= "SELECT 
        $company_id As company_id, 
        DATE(start_time) AS `date`, 
        COUNT(*) AS sub_total 
        FROM $table 
        WHERE $table.published = 1 
        AND start_time BETWEEN '$startDate 00:00:00' AND '$endDate 23:59:59' 
        GROUP BY `date`"; 
     } 


     $sql_cr = implode("\n UNION \n", $sql_cr); 
     return $sql_cr = "SELECT company_id,`date`, 0 AS First_total, SUM(sub_total) AS Second_total FROM ($sql_cr) AS tempTable GROUP BY company_id, `date`"; 

私は2つの次の列でテーブルをマージ表示したい:のcompany_id、日付、合計、report_total、違い。私が問題を抱えているのは、別のライブラリから関数を呼び出すことです。私は、コードを実行したとき、私はこのエラーを受け付けており、現時点では

$sql = ""; 


echo constructFirstQuery($conn, $startDate, $endDate);; 
echo constructSecondQuery($conn_2, $startDate, $endDate); 

$result_first = constructFirstQuery($conn, $startDate, $endDate); 
$result_first = $conn->query($sql) or die($conn->error); 

$result_cr =constructSecondQuery($conn_2, $startDate, $endDate); 
$result_cr = $conn_2->query($sql_cr) or die($conn_2->error); 


$total_results = array(); 
while ($row = $result_first->fetch_assoc()) { 
    $total_results[$row['company_id']] = $row; 
} 

while ($row = $result_cr->fetch_assoc()) { 
    if(!isset($total_results[$row['company_id']])) { 
     $total_results[$row['company_id']] = $row; 
    } else { 
     $total_results[$row['company_id']]['Reporting_total'] = $row['Reporting_total']; 
    } 
} 

if ($total_results) { 
    echo"<TABLE><TR><TH>Company ID</TH> 
     <TH>Date</TH> 
     <TH>Spearlinedb Total</TH> 
     <TH>Reportingdb Total</TH> 
     <TH>Difference</TH></TR>"; 



    foreach($total_results as $row) { 

     $first_total = $row['First_total']; 
     $second_total = $row['Second_total']; 
     $difference = ($first_total - $second_total); 
     echo"<TR><TD>". $row["company_id"]. "</TD>"; 
     echo"<TD>". $row["date"]. "</TD>"; 
     echo"<TD>". $row["First_total"]. "</TD>"; 
     echo"<TD>". $row["Second_total"]. "</TD>"; 
     echo"<TD>". $difference . "</TD></TR>"; 
    } 
    echo"</TABLE>"; 
} else { 
    echo "0 results"; 
} 

mysqliの::クエリ():中....空のクエリをこれは私が書いたコードです。関数はそれ自身で正常に実行されているし、文字列としてクエリを印刷しますが、私はメインコードでそれらを呼び出すことはできませんし、私は期待どおりにクエリを返すようにします。誰かがこれで正しい方向に私を指すことができるだろうか?私はまだPHPを学んでいるので、どんな助けもありがたいです。

+0

'空のクエリの下の編集を参照してください! –

+0

@u_mulderそれから賞金は得られますか? – RiggsFolly

+0

確かに、あなたはします。 –

答えて

0

変数名を混乱させるので、組み込みクエリを​​メソッドに渡すことはありません。

はイェーイ、ラインゲームを推測in`

$sql = ""; 

//$result_first = constructFirstQuery($conn, $startDate, $endDate); 
$sql = constructFirstQuery($conn, $startDate, $endDate); 
$result_first = $conn->query($sql) or die($conn->error); 

//$result_cr = constructSecondQuery($conn_2, $startDate, $endDate); 
$sql = constructSecondQuery($conn_2, $startDate, $endDate); 
$result_cr = $conn_2->query($sql) or die($conn_2->error); 
+0

なぜ$ sql_crの代わりに$ sqlを使用しているのでしょうか?ありがとう – seb

+0

'$ sql'をロードして最初の' - > query($ sql) 'に渡すと、その関数は完了しており、再び使用されることはないためです。したがって、2番目のクエリで再利用することができます。 – RiggsFolly

+0

また、これらの3つの更新をトランザクションにラップすることを検討する必要があります。そのため、いずれかが失敗した場合、以前の変更のすべてがロールバックされ、データベースがクリーンな状態に保たれます。 – RiggsFolly

関連する問題