"Error" upon completion of CSV import

Asked

Viewed 103 times

1

Good afternoon,

I created a code in PHP to read a . CSV containing Name, Email and IP. The goal is to consult the Geolocation API of http://ip-api.com/ and return me the state corresponding to the IP "ex:RJ", after this is inserted in the table of the corresponding state database.

Well everything works the API is consulted I have the return, write in the database and everything else, but at the end of the list import in the case the . CSV comes across the following message:

inserir a descrição da imagem aqui

Here comes the code:

1 - this is index.php

<!DOCTYPE html>
<html lang="pt-br">
    <head>
        <!-- Meta tags Obrigatórias -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
        <title>Importar Csv</title>
    </head>
    <body>
        <div class="container mt-3">
            <h2>Upload CSV</h2>
            <p>Arquivo CSV contendo Nome, Email e IP sem cabaçalho!</p>
            <p>A importação pode demorar dependendo da quantidade de consultas de IP que devem ser realizadas, a API suporta 150 requisições a cada 60 segundos então pegue um café e aguarde, Quando a importação terminar uma mensagem será exibida!</p>
            <form action="importar.php" method="post" enctype="multipart/form-data">
                <p>Arquivo CSV:</p>
                <div class="custom-file mb-3">
                    <input type="file" class="custom-file-input" id="exampleFormControlFile1" name="file">
                    <label class="custom-file-label" for="customFile">Escolher Arquivo</label>
                </div>


                <div class="mt-3">
                    <button type="submit" class="btn btn-primary">Enviar</button>
                </div>
            </form>
        </div>
        <!-- JavaScript (Opcional) -->
        <!-- jQuery primeiro, depois Popper.js, depois Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
    </body>
</html>

2 - here’s the import.php

<?php    
    //conexãO COM O BANCO DE DADOS
    $conn = new mysqli("localhost","root","","csv");

    //A função mysqli_set_charset () especifica o conjunto de caracteres padrão a ser usado ao enviar dados de e para o servidor de banco de dados.
    mysqli_set_charset($conn, "utf8");

    //A função date_default_timezone_set () define o fuso horário padrão usado por todas as funções de data / hora no script.
    date_default_timezone_set('America/Sao_Paulo');

    //Verificação se o arquivo é csv
    $arquivo = $_FILES["file"]["tmp_name"];
    $nome = $_FILES["file"]["name"];

    //A função explode () divide uma string em uma matriz.
    $ext = explode(".", $nome);

    //A função end () move o ponteiro interno para e produz o último elemento na matriz.
    $extensao = end($ext);       

    if($extensao != "csv"){
        echo "Extensão inválida";
    }else{
        $objeto = fopen($arquivo, 'r');
            $cont =0;

            while(($dados = fgetcsv($objeto, 1000, ";"))!==FALSE)
            {                
                //contador para saber quantas vezes foi executado o sistema
                $cont = $cont + 1;                  

                $nome = utf8_encode($dados[0]);
                $email = utf8_encode($dados[1]);               
                $ip = utf8_encode($dados[2]);   

                // echo $ip;                

                // Inicializa uma nova sessão e retorna um identificador cURL para uso com as funções curl    
                $ch = curl_init();                

                // Define uma opção no manipulador de sessão cURL fornecido.
                curl_setopt($ch, CURLOPT_URL, "http://ip-api.com/json/".$ip); 


                // TRUE para retornar a transferência como uma string do valor de retorno 
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 7);

                // Tempo maximo limite para solicitação
                curl_setopt($ch, CURLOPT_TIMEOUT, 7);                

                // Pegue o URL e passe para o navegador
                $content = trim(curl_exec($ch));

                // Fechar o recurso cURL e liberar recursos do sistema
                curl_close($ch);

                $regiao = json_decode($content)->region;

                //concatenação do valor para criar valor de variavel unico para a comparação                
                $state = "state-".strtolower($regiao)."-class";    

                $acre = 'state-ac-class';
                $alagoas = 'state-al-class';                
                $amapa = 'state-ap-class';
                $amazonas = 'state-am-class';
                $bahia = 'state-ba-class';
                $ceara = 'state-ce-class';
                $distrito_federal = 'state-df-class';
                $espirito_santo = 'state-es-class';
                $goias = 'state-go-class';
                $maranhao = 'state-ma-class';
                $mato_grosso = 'state-mt-class';
                $mato_grosso_do_sul = 'state-ms-class';
                $minas_gerais = 'state-mg-class';
                $para = 'state-pa-class';
                $paraiba = 'state-pb-class';
                $parana = 'state-pr-class';
                $pernambuco = 'state-pe-class';
                $piaui = 'state-pi-class';
                $rio_de_janeiro = 'state-rj-class';
                $rio_grande_do_norte = 'state-rn-class';
                $rio_grande_do_sul = 'state-rs-class';
                $rondonia = 'state-ro-class';
                $roraima = 'state-rr-class';
                $santa_catarina = 'state-sc-class';
                $sao_paulo = 'state-sp-class';
                $sergipe = 'state-se-class';
                $tocantins = 'state-to-class';


                if($state == $alagoas){
                    $result = $conn->query("INSERT INTO alagoas(nome, email) VALUES('$nome','$email')");                   
                }
                else if($state == $acre){
                    $result = $conn->query("INSERT INTO acre(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $amapa){
                    $result = $conn->query("INSERT INTO amapa(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $amazonas){
                    $result = $conn->query("INSERT INTO amazonas(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $bahia){
                    $result = $conn->query("INSERT INTO bahia(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $ceara){
                    $result = $conn->query("INSERT INTO ceara(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $distrito_federal){
                    $result = $conn->query("INSERT INTO distrito_federal(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $espirito_santo){
                    $result = $conn->query("INSERT INTO espirito_santo(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $goias){
                    $result = $conn->query("INSERT INTO goias(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $maranhao){
                    $result = $conn->query("INSERT INTO maranhao(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $mato_grosso){
                    $result = $conn->query("INSERT INTO mato_grosso(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $mato_grosso_do_sul){
                    $result = $conn->query("INSERT INTO mato_grosso_do_sul(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $minas_gerais){
                    $result = $conn->query("INSERT INTO minas_gerais(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $para){
                    $result = $conn->query("INSERT INTO para(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $paraiba){
                    $result = $conn->query("INSERT INTO paraiba(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $parana){
                    $result = $conn->query("INSERT INTO parana(nome, email) VALUES('$nome','$email')");
                }                
                else if($state == $pernambuco){
                    $result = $conn->query("INSERT INTO pernambuco(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $piaui){
                    $result = $conn->query("INSERT INTO piaui(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $rio_de_janeiro){
                    $result = $conn->query("INSERT INTO rio_de_janeiro(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $rio_grande_do_norte){
                    $result = $conn->query("INSERT INTO rio_grande_do_norte(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $rio_grande_do_sul){
                    $result = $conn->query("INSERT INTO rio_grande_do_sul(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $rondonia){
                    $result = $conn->query("INSERT INTO rondonia(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $roraima){
                    $result = $conn->query("INSERT INTO roraima(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $santa_catarina){
                    $result = $conn->query("INSERT INTO santa_catarina(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $sao_paulo){
                    $result = $conn->query("INSERT INTO sao_paulo(nome, email) VALUES('$nome','$email')");                    
                }
                else if($state == $sergipe){
                    $result = $conn->query("INSERT INTO sergipe(nome, email) VALUES('$nome','$email')");
                }
                else if($state == $tocantins){
                    $result = $conn->query("INSERT INTO tocantins(nome, email) VALUES('$nome','$email')");
                }else{
                    $result = $conn->query("INSERT INTO semip(nome, email) VALUES('$nome','$email')");
                }



                //Atrasa a execução do programa por um dado número de milionésimos de segundos pois a API só permite 150 consultas por minuto.
                usleep(50000);
            }

            if($result)
                {
                    echo "Dados filtrados e inseridos com sucesso em suas respectivas bases de dados!";
                }else{
                    echo "Erro ao inserir os dados </br>";                                                      
                } 

            //Ao fim da execução mostra a quantia de vezes que foi executado            
            echo "</br>FIM DA EXECUÇÃO DO PROGRAMA, FORAM FEITAS: *".$cont."* CONSULTAS A API!";            
    }    
?> 

PS: I’m testing everything Localhost

Does anyone know how to fix this?

line 66 is here but I’m not getting to fix

$regiao = json_decode($content)->region;
  • Your $content has the property of the Region in return, would it be good to see if it comes empty before putting somewhere? If isset, Try catch would be very useful there..

2 answers

1


Try this way, I made some changes to the source, but the logic follows the same, I commented the critical points.

<?php    

    function chamaApi($ip){
        // Inicializa uma nova sessão e retorna um identificador cURL para uso com as funções curl    
        $ch = curl_init();

        // Define uma opção no manipulador de sessão cURL fornecido.
        curl_setopt($ch, CURLOPT_URL, "http://ip-api.com/json/".$ip);

        // TRUE para retornar a transferência como uma string do valor de retorno 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 7);

        // Tempo maximo limite para solicitação
        curl_setopt($ch, CURLOPT_TIMEOUT, 7);

        if(curl_exec($ch) === false){
            throw new Exception('ERRO AO EXECUTAR CHAMADA VIA CURL');
        }

        // Pegue o URL e passe para o navegador
        $content = trim(curl_exec($ch));
        $details = json_decode($content);
        // var_dump($details);
        if($details->status !== 'success'){
            throw new Exception('ERRO NO RETORNO DA API! STATUS: '.$details->status.' MENSAGEM: '.$details->message.' IP: '.$ip);
        }
        // Fechar o recurso cURL e liberar recursos do sistema
        curl_close($ch);

        return $details;
    }

    // Predefinicao dos nomes das tabelas de acordo com cada sigla
    $aEstadosTabelas = [
        'ac' => 'alagoas',
        'al' => 'acre',
        'ap' => 'amapa',
        'am' => 'amazonas',
        'ba' => 'bahia',
        'ce' => 'ceara',
        'df' => 'distrito_federal',
        'es' => 'espirito_santo',
        'go' => 'goias',
        'ma' => 'maranhao',
        'mt' => 'mato_grosso',
        'ms' => 'mato_grosso_do_sul',
        'mg' => 'minas_gerais',
        'pa' => 'para',
        'pb' => 'paraiba',
        'pr' => 'parana',
        'pe' => 'pernambuco',
        'pi' => 'piaui',
        'rj' => 'rio_de_janeiro',
        'rn' => 'rio_grande_do_norte',
        'rs' => 'rio_grande_do_sul',
        'ro' => 'rondonia',
        'rr' => 'roraima',
        'sc' => 'santa_catarina',
        'sp' => 'sao_paulo'
        'se' => 'sergipe',
        'to' => 'tocantins'
    ];


    //conexãO COM O BANCO DE DADOS
    $conn = new mysqli("localhost","root","","csv");

    //A função mysqli_set_charset () especifica o conjunto de caracteres padrão a ser usado ao enviar dados de e para o servidor de banco de dados.
    mysqli_set_charset($conn, "utf8");

    //A função date_default_timezone_set () define o fuso horário padrão usado por todas as funções de data / hora no script.
    date_default_timezone_set('America/Sao_Paulo');

    //Verificação se o arquivo é csv
    $arquivo = $_FILES["file"]["tmp_name"];
    $nome = $_FILES["file"]["name"];

    //A função explode () divide uma string em uma matriz.
    $ext = explode(".", $nome);

    //A função end () move o ponteiro interno para e produz o último elemento na matriz.
    $extensao = end($ext);       

    if($extensao != "csv"){
        echo "Extensão inválida";
    }else{
        $objeto = fopen($arquivo, 'r');
        $cont = 0;

        while(($dados = fgetcsv($objeto, 1000, ";"))!==FALSE){                
            $nome = utf8_encode($dados[0]);
            $email = utf8_encode($dados[1]);               
            $ip = utf8_encode($dados[2]);   

            // nao precisa contatenar pra ter um id unico, os estados ja sao unicos kkkkk

            try{
                $content = chamaApi($ip);
                // se precisar concatenar algo pra usar em algum lugar...
            }catch (Exception $e) {
                echo 'Exceção capturada: ',  $e->getMessage(), "<br>";
                continue; // vai pro proximo laco do while , tira pra cair no else a seguir do insert no semip / sem ip ou ip errado cai aqui
            }

            $estado = strtolower($content->region);

            // Verifico se a chave do estado existe no array de tabelas predefinido
            if(array_key_exists($estado, $aEstadosTabelas)){
                $query = "INSERT INTO ".$aEstadosTabelas[$estado]."(nome, email) VALUES('$nome','$email')";
            }else{
                $query = "INSERT INTO semip(nome, email) VALUES('$nome','$email')";
            }

            $result = $conn->query($query);

            if($result){
                echo "IP ".$ip." inserido com sucesso!";
                //contador para saber quantas vezes foi executado com sucesso
                $cont++;
            }else{
                echo "Erro ao inserir os dados.. IP: ".$ip."</br>";
            }

            //Atrasa a execução do programa por um dado número de milionésimos de segundos pois a API só permite 150 consultas por minuto.
            usleep(50000);
        }

        //Ao fim da execução mostra a quantia de vezes que foi executado            
        echo "</br>FIM DA EXECUÇÃO DO PROGRAMA, FORAM FEITAS: *".$cont."* CONSULTAS A API!";            
    }    
?> 

0

One possibility is to include

if ($dados) continue;

At the beginning of while.

Notice PHP

Browser other questions tagged

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