Read multiple url s at the same time by saving information to Database

Asked

Viewed 190 times

0

I’m getting, from a few url´s provided by a api of Climatempo, weather forecast information on these url´s should inform the cities I wish to consult, ie their id´s and they return to me a xml with the information I need to record in my database. The problem I’m having is, how to read the information of various url´s At the same time, I ran a test to create a framework to try to solve this, but I’m having a hard time making it work. Initially I made a loop to search the city id in my database, if there are records I try to do an update and if not, try the Insert, within this context I can only get the information from the first url.

I will post the full code, I hope I have been able to explain clearly my difficulty.

require_once('../Connections/con.php');

mysql_select_db($database_conCons, $conCons);
$query_rcCidades = "SELECT * FROM PrevisaoCidade WHERE PrevisaoCidade.ativo = 1 ORDER BY PrevisaoCidade.IdCidade";
$rcCidades = mysql_query($query_rcCidades, $conCons) or die(mysql_error());
$row_rcCidades = mysql_fetch_assoc($rcCidades);
$totalRows_rcCidades = mysql_num_rows($rcCidades);


do {

    // CIDADES CADASTRADAS
    $cCidades = $row_rcCidades['IdCidade'];

    $url = 'http://api.climatempo.com.br/api/v1/forecast/15days/rain?idlocale="'.$cCidades.'"'; 
    $url = 'http://api.climatempo.com.br/api/v1/forecast/15days/temperature?idlocale="'.$cCidades.'"';
    $url = 'http://api.climatempo.com.br/api/v1/forecast/15days/wind?idlocale="'.$cCidades.'"';
    $url = 'http://api.climatempo.com.br/api/v1/forecast/15days/humidity?idlocale="'.$cCidades.'"'; 
    $url = 'http://api.climatempo.com.br/api/v1/forecast/15days/icon?idlocale="'.$cCidades.'"';
    $url = 'http://api.climatempo.com.br/api/v1/forecast/15days/uv?idlocale="'.$cCidades.'"';

    // PERMISSÃO 
    $post = array(  
        'key' => '',  
        'client' => '', 
        'nocache' => true,  
        'type' => 'xml',  
        'application' => 'Previsão 15 dias - Cidades'  
    );  

    // OBTENDO PERMISSÃO  
    $http = array(  
        'method' => 'POST',  
        'header' => 'Content-type: application/x-www-form-urlencoded',  
        'content' => http_build_query($post)  
    );  

    $context = stream_context_create(array('http' => $http));   
    $request = file_get_contents($url, true, $context); 
    $item =  simplexml_load_string($request);           

    // DATA PARA INSERÇÃO E/OU UPDATE
    $DataAux = substr((string)$item->data->item['dateBegin'], 0, -9);

    // SELECIONANDO TODAS AS OPÇÕES
    foreach($item->data->item->weather->item as $reg) {   

        // $data_aux  = substr($data,6,4).'-'.substr($data,3,2).'-'.substr($data,0,2);

        // ZERANDO O ARRAY
        $data = array();

            // CHUVA                
            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS
                'precipitation' => (string)$reg['precipitation'],
                'probability' => (string)$reg['probability'],
                'date' => (string)$reg['date']
            );

            // ATRIBUINDO AS VARIÁVEIS      
            $Prec = $data['api']['data']['item']['weather']['item'][0]['precipitation'];
            $Prob = $data['api']['data']['item']['weather']['item'][0]['probability'];

            // TEMPERATURA  
            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS
                'TMin' => (string)$reg['min'],
                'TMax' => (string)$reg['max']
            );

            // ATRIBUINDO AS VARIÁVEIS      
            $TMin = $data['api']['data']['item']['weather']['item'][0]['min'];
            $TMax = $data['api']['data']['item']['weather']['item'][0]['max'];

            // VENTO    
            $data['api']['data']['item']['locale']['id']        = (string)$item->data->item->locale['id'];
            $data['api']['data']['item']['locale']['name']      = (string)$item->data->item->locale['name'];
            $data['api']['data']['item']['locale']['latitude']  = (string)$item->data->item->locale['latitude'];
            $data['api']['data']['item']['locale']['longitude'] = (string)$item->data->item->locale['longitude'];

            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS
                'direction' => (string)$reg['direction'],                   
                'minVelocity' => (string)$reg['minVelocity'],               
                'maxVelocity' => (string)$reg['maxVelocity']
            );

            // ATRIBUINDO AS VARIÁVEIS      
            $VenDir = $data['api']['data']['item']['weather']['item'][0]['direction'];              
            $VelMin = $data['api']['data']['item']['weather']['item'][0]['minVelocity'];    
            $VelMax = $data['api']['data']['item']['weather']['item'][0]['maxVelocity'];

            // UMIDADE RELATIVA         
            $data['api']['data']['item']['dateBegin'] = (string)$item->data->item['dateBegin'];
            $data['api']['data']['item']['dateEnd']   = (string)$item->data->item['dateEnd'];   
            $data['api']['data']['item']['latitude']  = (string)$item->data->item->locale['latitude'];
            $data['api']['data']['item']['longitude'] = (string)$item->data->item->locale['longitude'];         

            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS                 
                'UmiMin' => (string)$reg['min'],
                'UmiMax' => (string)$reg['max']
            );

            // ATRIBUINDO AS VARIÁVEIS                      
            $UmMin = $data['api']['data']['item']['weather']['item'][0]['min'];
            $UmMax = $data['api']['data']['item']['weather']['item'][0]['max']; 

            // ÍCONES
            $data['api']['data']['item']['dateBegin'] = (string)$item->data->item['dateBegin'];
            $data['api']['data']['item']['dateEnd']   = (string)$item->data->item['dateEnd'];           

            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS                 
                'morning' => (string)$reg['morning'],   
                'afternoon' => (string)$reg['afternoon'],
                'night' => (string)$reg['night'],   
                'day' => (string)$reg['day'],
                'pt' => (string)$reg['pt']
            );

            // ATRIBUINDO AS VARIÁVEIS                      
            $IcoManha = $data['api']['data']['item']['weather']['item'][0]['morning'];
            $IcomTarde = $data['api']['data']['item']['weather']['item'][0]['afternoon'];   
            $IcoNoite = $data['api']['data']['item']['weather']['item'][0]['night'];
            $IcoDia = $data['api']['data']['item']['weather']['item'][0]['day'];
            $Frase = $data['api']['data']['item']['weather']['item'][0]['pt'];                  

            // UV               
            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS
                'UvMax' => (string)$reg['max']                      

            );

            // ATRIBUINDO AS VARIÁVEIS      
            $UvMax = $data['api']['data']['item']['weather']['item'][0]['max'];         

        // INSERT DOS SERVIÇOS
        mysql_select_db($database_conCons, $conCons);
        $sql = "SELECT Data, IdCidade FROM PrevisaoClima WHERE Data = '$DataAux' AND IdCidade = $cCidades";
        $rcDados = mysql_query($sql, $conCons) or die(mysql_error());
        $row_rcDados = mysql_fetch_assoc($rcDados);
        $totalRows_rcDados = mysql_num_rows($rcDados);

        if ($totalRows_rcDados > 0) {               
            mysql_select_db($database_conCons, $conCons);
            $sql = "UPDATE `cpCons_webCons`.`PrevisaoClima` SET `Frase`='$Frase', `TempMin`='$TMin', `TempMax`='$TMax', `ProbChuva`='$Prob', `PrecisaoChuva`='$Prec', `IconeManha`='$IcoManha', `IconeTarde`='$IcoTarde', `IconeNoite`='$IcoNoite', `IconeDia`='$IcoDia', `VentoDir`='$VenDir', `VentoMax`='$VenMax', `VentoMin`='$VenMin', `Umidade`='$UmMax', `Uv`='$UvMax' WHERE `Data`='$DataAux' AND `IdCidade` = $cCidades";
            $result = mysql_query($sql, $conCons);
            if (!$result) {
                $message  = 'ERRO: ' . mysql_error() . "\n";
                $message .= 'Query: ' . $sql;
                die($message);
            }
        } else {
            //Cria os dados da importação
            mysql_select_db($database_conCons, $conCons);
            $sql = "INSERT INTO `cpCons_webCons`.`PrevisaoClima` (`Data`, `IdCidade`, `Frase`, `TempMin`, `TempMax`, `ProbChuva`, `PrecisaoChuva`, `IconeManha`, `IconeTarde`, `IconeNoite`, `IconeDia`, `VentoDir`, `VentoMax`, `VentoMin`, `Umidade`, `Uv`) VALUES ('$DataAux', '$cCidades', '$Frase', '$TMin', '$TMax', '$Prob', '$Prec', '$IcoManha', '$IcoTarde', '$IcoNoite', '$IcoDia', '$VenDir', '$VenMax', '$VenMin', '$UmiMax', '$UvMax')";
            $result = mysql_query($sql, $conCons);
            if (!$result) {
                $message  = 'ERRO: ' . mysql_error() . "\n";
                $message .= 'Query: ' . $sql;
                die($message);
            }
        }
    }           

} while ($row_rcCidades = mysql_fetch_assoc($rcCidades));   
  • Why the variable $url has its contents written several times?

  • 2

    You would not have to store the URL’s in an array and then perform a loop loop in that array to make the connection for each specific URL?

  • There it is, my attempt was also this, would like to post a hint of how it would look?

  • see if my answer helps you, abçs

  • Perhaps the most worrying thing there is whether the webservice will allow so many connections in a short time. If you have no agreement to do so, you may not like it and block access.

1 answer

3


you have to separate the Urls and the data obtained for each request:

$urlChuva = 'http://api.climatempo.com.br/api/v1/forecast/15days/rain?idlocale="'.$cCidades.'"'; 
$urlTemp = 'http://api.climatempo.com.br/api/v1/forecast/15days/temperature?idlocale="'.$cCidades.'"';
$urlVento = 'http://api.climatempo.com.br/api/v1/forecast/15days/wind?idlocale="'.$cCidades.'"';
$urlHumi = 'http://api.climatempo.com.br/api/v1/forecast/15days/humidity?idlocale="'.$cCidades.'"'; 
$urlIcon = 'http://api.climatempo.com.br/api/v1/forecast/15days/icon?idlocale="'.$cCidades.'"';
$urlUV = 'http://api.climatempo.com.br/api/v1/forecast/15days/uv?idlocale="'.$cCidades.'"';

then execute a request for each URL:

 $request = file_get_contents($urlChuva, true, $context); 
 $itemChuva =  simplexml_load_string($request);
 $request = file_get_contents($urlTemp, true, $context); 
 $itemTemp =  simplexml_load_string($request);

...

and process them separately, since each request comes with a different structure.

Follow code only with Rain and Temperature, have to implement the others

<?php 

require_once('../Connections/con.php');

mysql_select_db($database_conCons, $conCons);
$query_rcCidades = "SELECT * FROM PrevisaoCidade WHERE PrevisaoCidade.ativo = 1 ORDER BY PrevisaoCidade.IdCidade";
$rcCidades = mysql_query($query_rcCidades, $conCons) or die(mysql_error());
$row_rcCidades = mysql_fetch_assoc($rcCidades);
$totalRows_rcCidades = mysql_num_rows($rcCidades);


do {

    // CIDADES CADASTRADAS
    $cCidades = $row_rcCidades['IdCidade'];

    $urlChuva = 'http://api.climatempo.com.br/api/v1/forecast/15days/rain?idlocale="'.$cCidades.'"'; 
    $urlTemp = 'http://api.climatempo.com.br/api/v1/forecast/15days/temperature?idlocale="'.$cCidades.'"';
    $urlVento = 'http://api.climatempo.com.br/api/v1/forecast/15days/wind?idlocale="'.$cCidades.'"';
    $urlHumi = 'http://api.climatempo.com.br/api/v1/forecast/15days/humidity?idlocale="'.$cCidades.'"'; 
    $urlIcon = 'http://api.climatempo.com.br/api/v1/forecast/15days/icon?idlocale="'.$cCidades.'"';
    $urlUV = 'http://api.climatempo.com.br/api/v1/forecast/15days/uv?idlocale="'.$cCidades.'"';

    // PERMISSÃO 
    $post = array(  
        'key' => '',  
        'client' => '', 
        'nocache' => true,  
        'type' => 'xml',  
        'application' => 'Previsão 15 dias - Cidades'  
    );  

    // OBTENDO PERMISSÃO  
    $http = array(  
        'method' => 'POST',  
        'header' => 'Content-type: application/x-www-form-urlencoded',  
        'content' => http_build_query($post)  
    );  

    $context = stream_context_create(array('http' => $http));   
    $request = file_get_contents($urlChuva, true, $context); 
    $itemChuva =  simplexml_load_string($request);
    $request = file_get_contents($urlTemp, true, $context); 
    $itemTemp =  simplexml_load_string($request);       
    //OUTRAS REQUISIÇÕES...

    // DATA PARA INSERÇÃO E/OU UPDATE
    $DataAux = substr((string)$item->data->item['dateBegin'], 0, -9);

    // SELECIONANDO CHUVA
    $Prec = null;
    $Prob = null;
    foreach($itemChuva->data->item->weather->item as $reg) {   

        // $data_aux  = substr($data,6,4).'-'.substr($data,3,2).'-'.substr($data,0,2);

        // ZERANDO O ARRAY
        $data = array();

            // CHUVA                
            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS
                'precipitation' => (string)$reg['precipitation'],
                'probability' => (string)$reg['probability'],
                'date' => (string)$reg['date']
            );

            // ATRIBUINDO AS VARIÁVEIS      
            $Prec = $data['api']['data']['item']['weather']['item'][0]['precipitation'];
            $Prob = $data['api']['data']['item']['weather']['item'][0]['probability'];
    }

    // SELECIONANDO TEMPERATURA
    $TMin = null;
    $TMax = null;
    foreach($itemTemp->data->item->weather->item as $reg) {   

        // $data_aux  = substr($data,6,4).'-'.substr($data,3,2).'-'.substr($data,0,2);

        // ZERANDO O ARRAY
        $data = array();

            // TEMPERATURA  
            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS
                'TMin' => (string)$reg['min'],
                'TMax' => (string)$reg['max']
            );

            // ATRIBUINDO AS VARIÁVEIS      
            $TMin = $data['api']['data']['item']['weather']['item'][0]['min'];
            $TMax = $data['api']['data']['item']['weather']['item'][0]['max'];
    }


    //RESTANTE DOS PROCESSAMENTOS


    //OS COMANDOS DO BANCO FICAM FORA DO LOOP QUE PERCORRE O RETORNO DE DADOS
    // INSERT DOS SERVIÇOS
    mysql_select_db($database_conCons, $conCons);
    $sql = "SELECT Data, IdCidade FROM PrevisaoClima WHERE Data = '$DataAux' AND IdCidade = $cCidades";
    $rcDados = mysql_query($sql, $conCons) or die(mysql_error());
    $row_rcDados = mysql_fetch_assoc($rcDados);
    $totalRows_rcDados = mysql_num_rows($rcDados);

    if ($totalRows_rcDados > 0) {               
        mysql_select_db($database_conCons, $conCons);
        $sql = "UPDATE `cpCons_webCons`.`PrevisaoClima` SET `Frase`='$Frase', `TempMin`='$TMin', `TempMax`='$TMax', `ProbChuva`='$Prob', `PrecisaoChuva`='$Prec', `IconeManha`='$IcoManha', `IconeTarde`='$IcoTarde', `IconeNoite`='$IcoNoite', `IconeDia`='$IcoDia', `VentoDir`='$VenDir', `VentoMax`='$VenMax', `VentoMin`='$VenMin', `Umidade`='$UmMax', `Uv`='$UvMax' WHERE `Data`='$DataAux' AND `IdCidade` = $cCidades";
        $result = mysql_query($sql, $conCons);
        if (!$result) {
            $message  = 'ERRO: ' . mysql_error() . "\n";
            $message .= 'Query: ' . $sql;
            die($message);
        }
    } else {
        //Cria os dados da importação
        mysql_select_db($database_conCons, $conCons);
        $sql = "INSERT INTO `cpCons_webCons`.`PrevisaoClima` (`Data`, `IdCidade`, `Frase`, `TempMin`, `TempMax`, `ProbChuva`, `PrecisaoChuva`, `IconeManha`, `IconeTarde`, `IconeNoite`, `IconeDia`, `VentoDir`, `VentoMax`, `VentoMin`, `Umidade`, `Uv`) VALUES ('$DataAux', '$cCidades', '$Frase', '$TMin', '$TMax', '$Prob', '$Prec', '$IcoManha', '$IcoTarde', '$IcoNoite', '$IcoDia', '$VenDir', '$VenMax', '$VenMin', '$UmiMax', '$UvMax')";
        $result = mysql_query($sql, $conCons);
        if (!$result) {
            $message  = 'ERRO: ' . mysql_error() . "\n";
            $message .= 'Query: ' . $sql;
            die($message);
        }
    }   

} while ($row_rcCidades = mysql_fetch_assoc($rcCidades));  
  • To get "better," I could change all that SELECT, INSERT, UPDATE for REPLACE INTO.

  • I work with postgresql, I think I don’t have that option there. But in adventistapr Mysql, it can implement will improve a lot. A detail that was being executed the SGDB commands inside the loop that traversed the return of the data.

  • @Rovannlinhalis, thank you for the dedication and quality of the code, I’m checking all the tips possible. Daniel Omine, thank you equally for the tip, thanks.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.