我如何在PHP中的两个不同服务器中交叉我的两个不同的数据库?

时间:2015-07-29 09:07:08

标签: php mysql

我执行查询,为我返回HTML表格中我的第一个数据库的字段,以及其中一个字段" number"我想使用相同的字段查询另一个数据库" number"返回一个字段"价格"在我的第二个数据库中。

"数"它在我的两个数据库中提交了相同的内容。

我怎么能在php中做到这一点?

这是我的代码PHP:

   <?php  
                 if(isset($_POST['date']))
                 {

                    $pro_date = $_POST['date'];
                    $sql = "
                           SELECT 
                             left(list_product_order.number,8) as number,
                             list_product_order.created_at as date,
                             date(list_product_order.received) as received_date,
                             date(list_product_order.deliv) as deliv_date,
                             list_product_order.four_name as name,
                             COUNT(id_product_order) as items,
                             MONTH(list_product_order.created_at) as month,
                             -1 as price

                           FROM `list_product_order`

                           WHERE YEAR(list_product_order.created_at) = $date

                           GROUP BY list_product_order.number,month

                           ORDER BY list_product_order.created_at DESC 

                           ";

                           $datao->exec ( "set names utf8" );
                           $req = $datao->prepare($sql);
                           $req->execute();
                           $fquery = $req -> fetchAll(PDO::FETCH_ASSOC);

                }

                 $sqll = "
                         SELECT 
                         data_command.number as number,
                         data_command.sup_name as sup_name,
                         SUM(data_command_item.value * data_command_item.quantity) as price                                              

                         FROM data_command
                         LEFT JOIN data_command_item on data_command.id_number = data_command_item.fk_number
                         WHERE (data_command_item IN (implode(',',$fquery)))
                         ";

                   $datam->exec ( "set names utf8" );
                   $req = $datam->prepare($sqll);
                   $req->execute();
                   $squery = $req -> fetchAll(PDO::FETCH_ASSOC);
                         ?>

         <div class="panel-body">
             <?php if(isset($_POST['pro_date']))  
             { 

             foreach($fquery as $key => $value)
                      {
                         foreach($squery as $value2)
                         {
                             if($value['number'] === $value2['number'])
                             {
                                $fquery[$key]['four_name'] = $value2['sup_name'];
                                  $fquery[$key]['price'] = $value2['price'];

                             }               
                         }
                       }

                       echo '

                       <table class="table table-striped table-bordered table-hover display" id="table_with_sorting" style="zoom: 85%">
                       <thead>
                       <tr>
                       <th style="font-size:11px">Number</th>
                       <th style="font-size:11px">Date</th>
                       <th style="font-size:11px">Name</th>
                       <th style="font-size:11px">Items</th>
                       <th style="font-size:11px">Received_date</th>
                       <th style="font-size:11px">Deliv_date</th>
                       <th style="font-size:11px">Month</th>
                       <th style="font-size:11px">Price</th>
                     </tr>
                     </thead>
                     <tbody>';
               <?php


                   foreach($fquery as $f)
                    {
                    echo "
                         <tr style='text-align: center;'>
                         <td>".$f['number']."</td>
                         <td>".$f['date']."</td>
                         <td>".$f['name']."</td>
                         <td>".$f['items']."</td>
                         <td>".$f['received_date']."</td>
                         <td>".$f['deliv_date']."</td>
                         <td>".$f['month']."</td>
                         <td>".$f['price']."</td>
                         </tr>";
                  }

                  echo" </tbody>
                   </table>";
                   ?>

                    <?php   }
                        ?>
                                </div>
                            </div>
                        </div>
                            <?php
                        ?>
                </div>

这是我对第二个数据库的查询:

SELECT 

      data_command.number as number,
      data_command.sup_name as sup_name,
      SUM(data_command_item.value * data_command_item.quantity) as price                                              

FROM  data_command

LEFT JOIN data_command_item on data_command.id_number = data_command_item.fk_number

它为我显示一个价格为-1的数字。

enter image description here

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以通过使用多个数据库实例并将数据从这些数据库加载到单独的数组中来实现此目的(请参阅下面的 $ arrayOne $ arrayTwo )。

您的结果集会有关系(请参阅下面的&#34;数字&#34; 字段),您可以使用该关系将 $ arrayTwo 值附加到 $ arrayOne 使用嵌套的foreach循环。

。然后,您可以遍历 $ arrayOne 并将其显示在html表中。

NB !!
以下代码:(isset($ items [&#39; sup_name&#39;])?$ items [&#39; sup_name&#39;]:&#39; No Supplier&#39;)
检查供应商是否存在,如果不存在,将显示&#34; No Supplier&#34;。

PHP代码

<?php
//ArrayOne is the result from DB 1
$arrayOne = array(
    array("number" => 5, "date" => "12-01-2011", "name"=> "Jack","items" => 30),
    array("number" => 8, "date" => "12-05-2015", "name"=> "John","items" => 20),
    array("number" => 3, "date" => "12-08-2014", "name"=> "Sarah","items" => 320),
);
//Result from DB 2
$arrayTwo = array(
    array("number" => 3, "sup_name" => "Coke","price" =>"25000"),
    array("number" => 8, "sup_name" => "Simba","price" =>"1200"),
);
foreach($arrayOne as $key => $value){
    foreach($arrayTwo as $value2){
        if($value['number'] === $value2['number']){
            //add "sup_name" and "price" to arrayOne
            $arrayOne[$key]['sup_name'] = $value2['sup_name'];
            $arrayOne[$key]['price'] = $value2['price'];
        }               
    }
}
echo '
<table class="table table-striped table-bordered table-hover display" id="table_with_sorting" style="zoom: 85%"> 
<thead> 
<tr> 
<th style="font-size:11px">Number</th> 
<th style="font-size:11px">Date</th> 
<th style="font-size:11px">Name</th> 
<th style="font-size:11px">Items</th> 
<th style="font-size:11px">Supplier Name</th> 
<th style="font-size:11px">Price</th> 
</tr> 
</thead> 
<tbody> ';
foreach($arrayOne as $items)
{
    echo "<tr style='text-align: center;'><td>".$items['number']."</td> 
<td>".$items['date']."</td>
<td>".$items['name']."</td>
<td>".$items['items']." </td>
<td>". (isset($items['sup_name']) ? $items['sup_name'] : 'No Supplier')." </td>
<td>". (isset($items['price']) ? $items['price'] : '0.00')." </td></tr>";
}
echo '</tbody> 
</table> ';   
?>

<强>结果

Display data from different servers in html table

PHP小提琴 Demo with source code in PHP fiddle

答案 1 :(得分:1)

如果我理解正确,第一个查询的结果将返回一个您命名的列&#34; number&#34;。

现在,您要使用第一个查询返回的数字查询另一个数据库。正确?

当您使用来自同一供应商的数据库时,您通常可以跨数据库加入。但你也可以手工制作#34;

只需将第一个查询中的&#34;数字&#34;存储在数组中,然后使用该数组查询第二个数据库:

$ArrMyNumbers = array();
// fill it with numbers from first resultset.
// pseudocode, I don't know your exact situation
foreach ($myFirstResultSet as $one){
  $ArrMyNumbers[] = (int)$one["number"];
}

And then for your second query:

$SQL2 = "SELECT data_command.number as number,
        data_command.sup_name as sup_name,
        SUM(data_command_item.value * data_command_item.quantity) as price                                              
            FROM data_command
WHERE (data_command_item IN (".implode(",",$ArrMyNumbers).")) "

现在,您可以通过不同的方式将第一组数据与第二组数据合并。

假设您可以在PHP中表示结果集,我建议您使用密钥将整个结果集存储在数组中,使用&#34; number&#34;在这种情况下。确保它是独一无二的! 另外,只需在第一个查询中添加名为&#34; price&#34;的字段,并使其始终为-1,表示尚未设置。 (这只适用于您自己,所以您可以很容易地看到您在第二个数据库中找不到价格。)

例如:

    $sql = "
            SELECT 
            left(list_product_order.number,8) as number,
            -1 as price,
            list_product_order.created_at as date,

接下来,使用以下内容:

$firstRS = array();
foreach ($data_req as $one){
   $firstRS[$one["number"]] = $one;
}

现在您已将结果集映射到&#34; number&#34;作为索引。 这样可以很容易地找到正确的行。

现在到第二个查询,一旦你运行它,你只需循环结果集,同时选择&#34;数字&#34;和&#34;价格&#34;,并使用它们来更新第一个结果集(我在这里名为$ firstRS)

类似的东西:

foreach ($RS_Second as $one){
   $firstRS[$one["number"]]["price"] = $one["price"];
}

现在你有$ firstRS可以使用,包括第二个查询的更新价格。

请注意,这是一种适用于不同数据库的通用方法。当您使用相同的数据库供应商时,简单地使用(更复杂的)连接语法ACROSS数据库可能更容易。 只需在google上查找您的数据库(使用跨数据库X的交叉连接等词语,其中X是您的数据库)