2017-11-30 2 views
0

Ich habe ein PHP-Skript, die mir eine Zeichenfolge nach dem Parsen eines DOM aus einer HTML-Datei zurückgeben.XMLHttpRequest funktioniert nicht im asynchronen Modus, wenn mein PHP-Code DOMDocument :: loadHTMLFile verwendet

parserFunctions.php (Ich habe gerade angezeigt nützliche Funktionen):

<?php 
function initPagesToParse($Path){ 
    define('MESSAGES_BY_PAGE', 20); 
    $Docs[0] = new DOMDocument(); 
    $Docs[0]->loadHTMLFile($Path); 
    $numberOfPages = getMessageNumber($Docs[0])/MESSAGES_BY_PAGE; 
    if($numberOfPages > 1){ 
     for($i = 1; $i < $numberOfPages; $i++){ 
      $startPost = $i * MESSAGES_BY_PAGE; 
      $Docs[$startPost] = new DOMDocument(); 
      $Docs[$startPost]->loadHTMLFile($Path . '&start=' . $i); 
     } 
    } 
    return $Docs; 
} 

function runParser($Path){ 
    $Result = ''; 
    foreach(initPagesToParse($Path) as $Doc) { 
     $Result = $Result . getVoteIDsFromDocument($Doc); 
    } 
    if($Result == ''){ 
     return FALSE; 
    } 
    $FileID = uniqid('Vote_IDs_', TRUE); 
    if(file_put_contents ('VoteIDs_files/' . $FileID . '.txt', $Result, LOCK_EX) === FALSE){ 
     return FALSE; 
    } 
    return $FileID; 
} 
?> 

parserMain.php:

<?php 
include 'parserFunctions.php'; 

error_log("Parsing \n"); 

if(!isset($_POST["URL"]) || $_POST["URL"] == null) { 
    echo 'REQ ERROR'; 
    exit(); 
} 

$url = $_POST["URL"]; 

if(($FileID = runParser($url)) === FALSE){ 
    echo 'PARSING ERROR'; 
    exit(); 
} 

error_log($url); 
error_log($FileID); 
echo $FileID; 
?> 

Und diese Zeichenfolge ich eine HTML-Seite mit einem haben Javascript zu erhalten, die eine Verwendung XMLHttpRequest, um das Ergebnis zu erhalten.

<script type="text/javascript"> 
"use strict"; 
function sendUrlToParser() { 
    var handleResponse = function (status, response) { 
     alert(response); 
    } 

    var handleStateChange = function() { 
     switch (xmlhttp.readyState) { 
      case 0 : // UNINITIALIZED 
      case 1 : // LOADING 
      case 2 : // LOADED 
      case 3 : // INTERACTIVE 
       break; 
      case 4 : // COMPLETED 
       handleResponse(xmlhttp.status, xmlhttp.responseText); 
       break; 
      default: alert("error"); 
     } 
    } 

    var xmlhttp=new XMLHttpRequest(); 
    xmlhttp.onreadystatechange = handleStateChange; 
    xmlhttp.open("POST", "parserMain.php", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.send("URL=" + document.getElementById("URL").value); 
} 
</script> 

Wenn ich dieses Skript verwende das Ergebnis meines PHP-Skript zu bekommen, in Asynchron-Modus (true) ich einen Status == 0 erhalten, und ich bekomme eine leere Antwort, während in synchronus Modus (false) Ich erhalte eine Status == 200 und ich kann mein Ergebnis anzeigen.

Nach mehreren Tests habe ich festgestellt, dass nur wenn ich den Parser verwende, dass meine asynchrone Anfrage nicht mehr funktioniert. Wenn das PHP-Skript vor dem runParser stoppt (im Falle einer nicht existierenden Variable zum Beispiel), kann ich eine Antwort bekommen (REQ ERROR in diesem Fall).

Ist mein Problem im Zusammenhang mit der Verwendung von DOMDocument :: loadHTMLFile oder ist das Problem an anderer Stelle?

Antwort

0

Problem gelöst durch Deaktivieren der Seitenaktualisierung nach einer Anfrage. Hinzufügen eines "Return false;" im Attribut "onsubmit".

<form method="POST" onsubmit="sendUrlToParser(); return false;"> 
Verwandte Themen