2011-06-28 2 views
1

Désolé pour le code long, je le perds vraiment.php étrange problème de bouclage

Ce code est supposé obtenir une liste d'URL via POST, dans une zone de texte avec des lignes de rupture entre chaque URL. Le script devrait télécharger chaque URL, parcourir le code HTML et prendre des liens, puis aller dans ces liens, obtenir des données et faire écho.

Pour une raison quelconque, visuellement il semble que je cours getDetails() une seule fois, car je ne reçois qu'un ensemble de résultats.

J'ai vérifié plusieurs fois si la boucle foreach prend chaque URL séparément et cette partie travaille

Quelqu'un peut-il repérer le problème?

require_once('simple_html_dom.php'); 

function getDetails($html) { 
    $dom = new simple_html_dom; 
    $dom->load($html); 
    $title = $dom->find('h1', 0)->find('a', 0); 
    foreach($dom->find('span[style="color:#333333"]') as $element) { 
     $address = $element->innertext; 
    } 
    $address = str_replace("<br>"," ",$address); 
    $address = str_replace(","," ",$address); 
    $title->innertext = str_replace(","," ",$title->innertext); 

    if ($address == "") { 
     $exp = explode("<strong><strong>",$html); 
     $exp2 = explode("</strong>",$exp[1]); 
     $address = $exp2[0]; 
    } 

    echo $title->innertext . "," . $address . "<br>"; 
} 

function getHtml($Url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $Url); 
    curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/"); 
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0"); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    $output = curl_exec($ch); 
    curl_close($ch); 
    return $output; 
} 

function getdd($u) { 
    $html = getHtml($u); 
    $dom = new simple_html_dom; 
    $dom->load($html); 
    foreach($dom->find('a') as $element) { 
     if (strstr($element->href,"display_one.asp")) { 
      $durls[] = $element->href; 
     } 
    } 
    return $durls; 
} 

if (isset($_POST['url'])) { 
    $urls = explode("\n",$_POST['url']); 
    foreach ($urls as $u) { 
     $durls2 = getdd($u); 
     $durls2 = array_unique($durls2); 
     foreach ($durls2 as $durl) { 
      $d = getHtml("http://www.example.co.il/" . $durl); 
      getDetails($d); 
     } 

    } 
} 
+0

Pouvez-vous donner un exemple de ce à quoi pourrait ressembler le $ _POST ['url']? Je ne comprends pas vraiment ce que vous essayez de faire. –

+0

obtenir une sortie de débogage là-bas. nombre d'échos ($ urls). "\ n"; à la boucle externe, echo "\ t" .count ($ durls2). "\ n"; à la boucle du milieu, et echo "\ t \ t". $ durl. "\ n"; à la boucle intérieure. Cela vous dira combien de fois les boucles sont en cours d'exécution, puis nous pouvons déterminer où il échoue. – ben

Répondre

0

Vous assignez uniquement le dernier élément de la boucle, il ressemble. Vous devrez concaténer. Quelque chose comme $address .= $element->innertext; à l'intérieur de la boucle (notez le. = Au lieu de =).

edit: à moins que je ne me trompe sur ce qu'il est supposé faire. Je pense que je me suis peut-être concentré sur la mauvaise partie du code.

+0

Cette partie est en fait ok, j'ai besoin du dernier $ element-> innertext, donc pas besoin de concaténer ici. le problème est visuellement que je cours getDetails() seulement une fois, car je reçois seulement un ensemble de résultats –

+0

Désolé, une fois que j'ai posté que j'ai pensé que je ne le lisais probablement pas de toute façon. Mais je l'ai juste essayé sans la boucle et ça semblait bien tourner, même si je ne sais pas comment ça aurait pu interférer. –

0

Lorsque vous utilisez DOMDocument en html vous chargez avec $dom->loadHTMLFile() ou $dom->loadHTML() vous devez également appeler libxml_use_internal_errors(true) avant la main afin qu'il ne plantera pas à cause de HTML mal formaté.