2012-07-20 82 views
2

如何執行該循環:PHP凍結:如何循環連接到2個MySQL數據庫

while ($row = mysql_fetch_array($result)) { 
    collectData($row['NAME']); 
} 

30秒後未凍結我的PHP?

我認爲可以通過將整個數據庫轉換爲數組或* .temp文件來處理它,而不是每次我想要輸入/輸出時連接。但是我在文件和數組上遇到了問題,所以我就這樣問:爲什麼最好/最好的方法快速而無痛地做到這一點?

<?php 

//fiveMin - Database that data is taken form 
//HighCharts - Database that data is transferred to 

$fiveMin=mysql_connect($fiveMin_host,$fiveMin_user,$fiveMin_pass); 
mysql_select_db($fiveMin_db,$fiveMin) or die (mysql_error());    

$query="SELECT * FROM BetterShopItemStock"; 
$result = mysql_query($query); 
while ($row = mysql_fetch_array($result)) { 
    collectData($row['NAME']); 
} 

function collectData($itemID) { 

    global $fiveMin_host, $fiveMin_user, $fiveMin_pass, $fiveMin_db, $week_host, $week_user, $week_pass, $week_db; 

    $fiveMin=mysql_connect($fiveMin_host,$fiveMin_user,$fiveMin_pass); //Load and store data from fiveMin Database 
    mysql_select_db($fiveMin_db,$fiveMin) or die (mysql_error()); 
    $function_Query="SELECT AMT FROM BetterShopItemStock WHERE NAME = '$itemID'"; 
    $function_Ask = mysql_query($function_Query); 
    $function_Result = mysql_fetch_row($function_Ask, 0); 
    $dataReadyToImport = "," . $function_Result[0]; 
    @mysql_close($fiveMin); 

    $HighCharts=mysql_connect($week_host,$week_user,$week_pass); //Save stored data to weekly Database 
    mysql_select_db($week_db,$HighCharts) or die (mysql_error()); 
    $function_Query="SELECT AMT FROM BetterShopItemStock WHERE NAME = '$itemID'"; 
    $function_Ask = mysql_query($function_Query); 
    $function_Result = mysql_fetch_row($function_Ask, 0); 
    $storedData = $function_Result[0]; 
    $dataReadyToImport = $storedData . $dataReadyToImport; 
    mysql_query("UPDATE BetterShopItemStock SET AMT='$dataReadyToImport' WHERE NAME='$itemID'"); 

    @mysql_close($HighCharts); 

} 

?> 
+0

由於30秒的(默認)最大執行時間已經過去,PHP是否凍結或死亡? – drew010 2012-07-20 00:34:08

+0

它的停止速度甚至超過了30秒,但表示它延長了它。 – IlikeITalot 2012-07-20 06:53:42

回答

1

(1)你不必打開和關閉,每次查詢的連接 - 開一個連接到每個服務器,並多次mysql_query()調用它們。這應該會加快你的速度。 (2)不要使用「SELECT * FROM BetterShopItemStock」...只選擇你需要的行。 (這裏是'NAME')。如果您已經在查詢該表的'NAME',請同時選擇'AMT',而不是再次打電話給它。

(3)您可以將您的選擇和更新呼叫組合到一個查詢中。

總之,一切都應該是這個樣子:

<?php 

    //fiveMin - Database that data is taken form 
    $fiveMin=mysql_connect($fiveMin_host,$fiveMin_user,$fiveMin_pass); 
    mysql_select_db($fiveMin_db,$fiveMin) or die (mysql_error()); 

    //HighCharts - Database that data is transferred to 
    $HighCharts=mysql_connect($week_host,$week_user,$week_pass); //Save stored data to weekly Database 
    mysql_select_db($week_db,$HighCharts) or die (mysql_error()); 

    $query="SELECT NAME,AMT FROM BetterShopItemStock"; 
    $result = mysql_query($query,$fiveMin); 
    while ($row = mysql_fetch_row($result)) { 
     collectData($row[0],$row[1],$HighCharts); 
    } 

    function collectData($itemID, $itemAmt, $mysql) { 
     $id = mysql_real_escape_string($itemID); 
     $amt = mysql_real_escape_string($itemAmt); 
     $q = "UPDATE BetterShopItemStock SET ". 
      "AMT=CONCAT(AMT,',','$amt') WHERE NAME='$id'"; 
     $r = mysql_query($q,$mysql); 
     return (!$r ? false : true); 


    } 

    //now close the databases 
    @mysql_close($HighCharts); 
    @mysql_close($fiveMin); 
?> 

(4)最後,如果您有執行超時錯誤,看看PHP的set_time_limit延長你的執行時間

+0

請問我在哪裏有多個mySqlquery?你爲什麼要改變我的方法?我將數據從一個數據庫附加到另一個數據庫。 '函數collectData($ itemID,$ itemAmt,$ mysql)' - 這是生病的。爲什麼我需要增加$ itemAmt和$ mysql? – IlikeITalot 2012-07-20 07:02:15

+0

包括'$ itemAmt'可以防止您必須進行第二次'SELECT'調用才能獲得'AMT'列。 '$ mysql'就是你要更新的數據庫的mysql連接(這裏是'$ HighCharts') – cegfault 2012-07-21 05:11:24

0

獨立每份進入上課後和他們一起工作。它使它們更有效地運行,並且查詢不會互相影響:

<?php 
class class1{ 
    function fivemin(){ 
      **code0** 
    } 
    function collectdata1-fivemin() { 
      class1::fivemin(); 
      **code** 
    } 
    function collectdataHighcharts(){ 
      class1::fivemin(); 
      **code2** 
    } 
} 
$a = new class1; 
$a->collectdata1-fivemin(); 
$a->collectdata1HighCharts(); 
?> 
+0

'$ a-> collectdata1-fivemin();'是做什麼的? – IlikeITalot 2012-07-20 07:03:38