Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stop the execution of php code and send the signal to JavaScript

My PHP code sends queries on Amazon.com to retrieve information about books. When it receives the information, there are two possibilities for execution of the following program. Possibility to define what should be used, it must look at the total number of book profit for research.

What I do at the moment, I am sending a first request and retrieves the total number of results. According to the number of results, I assign a new value to the variable $queryUrl. If the number of results is greater than 1200, the programs to execute as it should.

If the number of results is less than 1200, the program should finish execute the loop to iterate through the entire pages of results and the rest of the php code but only a single time.

At the moment, if there is less than 1200 results. The program goes through all pages of results, but places to stop at the end of PHP code. It executes all the code several times depending on the parameter of the queries is $searchMonthUrlParam inherit the variable recupMonth JavaScript.

For now, I have that

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);

Someone would have a solution on how to power stoper php code execution if it goes in the else but he is finished to execute once in full?

like image 417
mortiped Avatar asked Jan 29 '14 08:01

mortiped


1 Answers

To escape from your loop and end PHP execution, simply return a result:

//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);
}
like image 189
clarkatron Avatar answered Oct 05 '22 23:10

clarkatron