K
Try this way, I made some changes to the source, but the logic follows it, 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!";
}
?>