2016-02-12 1 views
0

Ceci est pour obtenir le titre et la date de chaque messages (de forbes.com) en utilisant Curl et PHP Dom. Lorsque j'imprime la date à l'intérieur de foreach, le titre et l'heure affichent le nombre correct "30". Mais mon problème est lorsque j'imprime une requête d'insertion, le résultat est erroné. Chaque page a 15 messages ci-dessous le code est pour obtenir des données à partir de deux pages. s'il vous plaît vérifier ci-dessous le code et m'aider à résoudre ce problème?Obtenir des données à partir des messages dans chaque page en utilisant php

<?php 
require_once('dbconnect.php'); 

//use curl to get html content 
function getHTML($url) 
{ 
    $curl=curl_init(); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET"); 
    curl_setopt($curl, CURLOPT_COOKIEFILE, '/cookies.txt'); 
    $result = curl_exec($curl); 
    curl_close($curl); 
    return $result; 
} 

$url         = "http://www.forbes.com/search/post/REIT/15/All-time/0/"; 
$results        = getHTML($url); 
$dom_document      = new DOMDocument(); 
$dom_document->loadHTML($results); 
$remove[]       = ","; 
$remove[]       = " "; 
$remove[]       = "results"; 

/* ############################################################################ Total ###################################################################*/ 
$total_results      = @$dom_document->getElementsByTagName('div'); 
foreach ($total_results as $total_result) { 
    $total_result_class = $total_result->getAttribute('class'); 
    if(strstr($total_result_class, 'total_records')){ 
     $total_result_replace = str_replace($remove, '', $total_result->textContent); 
    } 
} 
$pages_divide = $total_result_replace/15;   //338.4666 
$pages_floor = floor($pages_divide);    //338 

for($i = 1; $i<= 2; $i++) { // $i<= 2 (two page) 
    $url_without_page  = "http://www.forbes.com/search/post/REIT/15/All-time/"; 
    $url_with_page   = $url_without_page . $i . '/'; 
    /*echo '<pre>'; 
     print_r($url_with_page);*/ 
    $url_pages    = getHTML($url_with_page); 
    $dom_document_pages  = new DOMDocument(); 
    $dom_document_pages->loadHTML($url_pages); 

    /* ############################################################################ Title ###################################################################*/ 
    $title_result        = array(); 
    $titles         = @$dom_document_pages->getElementsByTagName('h2'); 
    foreach ($titles as $title) { 
     foreach($title->childNodes as $nodes){ 
      if($nodes->tagName == 'a'){ 
       $title_result     = str_replace("'", "", $nodes->textContent); 
       /* echo '<pre>'; 
        print_r($title_result);*/ 
      } 
     } 

    } 

    /* ############################################################################# Time ###################################################################*/ 
    $time_result     = array(); 
    $times      = @$dom_document_pages->getElementsByTagName('time'); 
    foreach ($times as $time) { 
     $date      = new DateTime(); 
     $date_replace    = str_replace(",", "", $time->textContent); //Feb 10, 2016 
     $string_to_time   = strtotime($date_replace); 
     $date->setTimestamp($string_to_time); 
     $time_result    = $date->format('Y-m-d'); 
     /*echo '<pre>'; 
      print_r($time_result);*/ 
    } 
    $query_insert     = "INSERT INTO article_forbes(title, datetime) VALUE ('".$title_result."', '".$time_result."')"; 
    echo '<pre>'; 
    echo $query_insert; 
    //$mysqli->query($query_insert); 
} 
+0

Que voulez-vous dire que l'heure montre correctement "" 30 "'? Ce n'est pas un moment. – Barmar

+0

Pourquoi faites-vous des boucles pour obtenir les titres et les heures, et ensuite seulement insérer le dernier de chaque? Et quel est le point de définir $ title_result à un tableau, puis dans la boucle, vous le définissez à un seul titre. Vous faites la même chose avec '$ time_result'. – Barmar

+0

@Barmar "30" signifie compter –

Répondre

0

Vous n'insérez pas les données dans les boucles. Donc, vous insérez juste le dernier titre et la dernière fois.

Vous avez initialisé $title_result et $time_result à des tableaux, donc je suppose que vous aviez initialement l'intention de collecter tous les titres et toutes les heures. Mais alors au lieu de les pousser sur les tableaux dans les boucles, vous avez remplacé les tableaux avec des chaînes. Changer

$title_result = str_replace("'", "", $nodes->textContent); 

à

$title_result[] = $nodes->textContent; 

afin que vous appuyez sur la matrice, et de faire un changement semblable à $time_result.

Ensuite, vous devriez faire les insertions dans une boucle. L'utilisation d'une instruction préparée de cette manière signifie que vous n'avez pas besoin de supprimer les caractères spéciaux du titre.

+0

Actuellement, je reçois seulement 15 entrées Mais j'ai écrit le code pour 30 entrées. –

+0

Je ne vois pas de raison. Il devrait obtenir 15 entrées sur chaque page. – Barmar

+0

Je suis désolé. J'ai ajouté une boucle pour une autre boucle. Maintenant tout est clair et correct. Merci pour votre aide. –