2014-01-29 56 views
10

我的PHP代码在Amazon.com上发送查询以检索有关图书的信息。 当它收到信息时,执行以下程序有两种可能性。可以定义应该使用什么,它必须看研究的书籍利润总数。停止执行php代码并将信号发送到JavaScript

我现在在做什么,我发送第一个请求并检索结果的总数。根据结果​​的数量,我为变量$queryUrl分配一个新值。如果结果的数量大于1200,那么应执行程序。

如果结果数小于1200,程序应该完成循环遍历整个页面的结果和其他的php代码,但只有一次。

目前,如果结果少于1200个。该程序遍历结果的所有页面,但停留在PHP代码的末尾。它根据查询的参数执行所有代码几次是$searchMonthUrlParam继承变量recupMonth JavaScript。

现在,我有

PHP:

//Retrieve variable value passed in POST from JavaScript 
$pageNum = (isset($_POST["pageNum"]) && $_POST["pageNum"]) ? intval($_POST["pageNum"]) : 1; 
     $writeMode = (isset($_POST["writeMode"]) && $_POST["writeMode"]) ? $_POST["writeMode"] : "w"; 
     $searchType = (isset($_POST["searchType"]) && $_POST["searchType"]) ? intval($_POST["searchType"]) : 0; 
     $month = (isset($_POST["month"]) && $_POST["month"]) ? intval($_POST["month"]) : date("n"); 
     $year = (isset($_POST["year"]) && $_POST["year"]) ? intval($_POST["year"]) : date("Y") ; 
     $keyword = (isset($_POST["keyword"]) && strlen($_POST["keyword"])) ? $_POST["keyword"] : ""; 
     $startMonth = (isset($_POST["startMonth"]) && strlen($_POST["startMonth"])) ? $_POST["startMonth"] : NULL; 
     $startYear = (isset($_POST["startYear"]) && strlen($_POST["startYear"])) ? $_POST["startYear"] : NULL; 
     $endMonth = (isset($_POST["endMonth"]) && strlen($_POST["endMonth"])) ? $_POST["endMonth"] : NULL; 
     $endYear = (isset($_POST["endYear"]) && strlen($_POST["endYear"])) ? $_POST["endYear"] : NULL; 
     if($keyword) { 
      if($writeMode === "w") { 
       file_put_contents(CSV_FILE, ""); 
      } 

      $searchMonthUrlParam = "&field-datemod=".$month; 
      $searchYearUrlParam = "&field-dateyear=".$year; 

      $searchTypeUrlParam = ""; 
      switch($searchType) { 
       case SEARCH_TYPE_TITLE: 
        $searchTypeUrlParam = "&field-title="; 
        break; 
       case SEARCH_TYPE_KEYWORDS: 
        $searchTypeUrlParam = "&field-keywords="; 
        break; 
       case SEARCH_TYPE_AUTHOR: 
        $searchTypeUrlParam = "&field-author="; 
        $searchTypeUrlParam = "&field-publisher="; 
        break; 
       case SEARCH_TYPE_PUBLISHER: 
        break; 
      } 
    //send request to Amazon  
    $queryUrl = AMAZON_TOTAL_BOOKS_COUNT . $searchMonthUrlParam . $searchYearUrlParam . $searchTypeUrlParam . urlencode($keyword) . '&page=' . $pageNum; 
        $queryResult = file_get_contents($queryUrl); 
        //Search number total results 
        if (preg_match('/of\s+([0-9,]+)\s+Results/', $queryResult, $matches)) { 
         $totalResults = (int) str_replace(',', '', $matches[1]); 
        } else { 
         throw new \RuntimeException('Total number of results not found'); 
        } 
        //this condition work 
        if ($totalResults > MAX_RESULT_ALL_PAGES) { 
         $queryUrl = AMAZON_SEARCH_URL . $searchMonthUrlParam . $searchYearUrlParam . $searchTypeUrlParam . urlencode($keyword) . '&page=' . $pageNum; 
        } 

        //with this condition I don't know how to proceed 
        else { 

         $queryUrl = AMAZON_TOTAL_BOOKS_COUNT.$searchMonthUrlParam.$searchYearUrlParam.$searchTypeUrlParam.urlencode($keyword)."&page=".$pageNum; 

       } 
$htmlResultPage = file_get_html($queryUrl); 
$htmlQueryResult = $htmlResultPage->find("div[class=result]"); 
exit; 

的JavaScript:

if(processedResultCount === 0) { 
         pageNum = 1; 
         recupMonth--; 
         if(recupMonth === 0 && recupYear > endYear) { 
          recupMonth = 12; 
          recupYear--; 
         } 
         else if(parseInt(recupMonth, 10) === parseInt(endMonth, 10) && parseInt(recupYear, 10) === parseInt(endYear, 10)) { 
          alert("Processing finished"); 
          if(totalResultCount != 0) { 
           contentElt.innerHTML = "Total processed results: " + totalResultCount + '<br/><br/>&gt; <a href="amazon_keyword_stats.csv" title="Download CSV result file">Download CSV result file</a>'; 
          } 
          return; 
         } 
        } 
       getAmazonResult(pageNum, writeMode); 
       return; 
      } 
     } 
    } 
xmlHttp.open("POST", "ctrl/getAmazonResult.php", true); 
    xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
    xmlHttp.send("pageNum=" + pageNum + "&writeMode=" + writeMode + "&searchType=" + searchType + "&month=" + recupMonth + "&year=" + recupYear + "&keyword=" + keyword + "&startMonth=" + startMonth + "&startYear=" + startYear + "&endMonth=" + endMonth + "&endYear=" + endYear); 

有人会对如何,如果它在提供动力的stoper PHP代码执行的解决方案别的,但他完成了一次完整的执行?

+0

这是正常的思想家。你有没有想过在使用nodejs之前,在将它传递给php之前,在进行初始处理的脚本末尾之前会返回? –

+0

不,我不使用nodejs,但是如果超过1200个结果的执行已经有脚本结束之前返回的控制器。 但问题是,我不知道目前如何 – mortiped

+2

我不明白你的需要吗?如果结果数低于1200,你想怎么做?你需要再次查询亚马逊还是做其他事情? –

回答

2

要从循环和最终执行PHP逃脱,只返回一个结果:

//this is the condition you indicated works 
if ($totalResults > MAX_RESULT_ALL_PAGES) { 
    $queryUrl = AMAZON_SEARCH_URL . $searchMonthUrlParam . $searchYearUrlParam . $searchTypeUrlParam . urlencode($keyword) . '&page=' . $pageNum; 
    } 
//this is the condition you indicated does not work 
else { 
    return someSortOfResultProcessing($queryResult); 
} 
+0

与返回,查询将被发送一次? – mortiped

+0

这取决于你的其他功能或方法。我不知道你所布置的代码片段是在一个循环还是什么。如果是,那么是的,它应该结束循环,返回一个结果(大概是通过AJAX到你的javascript?)并停止执行该函数或方法。更多信息将有助于解决您的问题。 – clarkatron