Jump to content

RodriAndreotti

Members
  • Content count

    223
  • Joined

  • Last visited

  • Days Won

    1

RodriAndreotti last won the day on June 17 2015

RodriAndreotti had the most liked content!

Community Reputation

25 Levemente Bom

2 Followers

About RodriAndreotti

  • Rank
    Desenvolvedor PHP (Front / Backend)
  • Birthday 07/08/1984

Informações Pessoais

  • Sexo
    Masculino
  • Localização
    Mauá - São Paulo
  • Interesses
    Games, Tecnologia, Fotografia, Música, Programação, Web

Contato

Recent Profile Visitors

808489 profile views
  1. RodriAndreotti

    Normalização

    Bom dia, pessoal! Estou desenvolvendo um sisteminha aqui, e surgiu uma dúvida no que seria o melhor caminho a seguir com relação a normalização de dados, o sistema terá basicamente três tipos de "pessoas": Agência Colaborador Cliente Estas entidades tem algumas propriedades comuns, por exemplo: Contatos, Endereço, número de documento, nome, usuário enfim. Gostaria de opiniões sobre qual seria o melhor caminho a seguir do ponto de vista da normalização. - Uma tabela para cada entidade? ou - Uma tabela pessoa com os dados comuns a todos, e uma subtabela para cada especificidade? Desde já obrigado!
  2. RodriAndreotti

    CURL do PHP às vezes retorna resultado vazio

    Bom, creio que conseguir resolver o problema por conta própria, sendo assim, gostaria de deixar a solução que alcancei aqui caso alguém mais passe pelo mesmo problema. Aparentemente o problema estava neste bloco de código do método callService: curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE); // Linhas abaixo necessárias para usar o cUrl com windows sem certificado //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt_array($ch, array( CURLOPT_HTTPGET => TRUE, CURLOPT_RETURNTRANSFER => 1, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $this->loadToken(), 'X-Api-Key: ' . $this->apiKey, ) )); Não consegui descobrir o motivo exato, mas o comparei com o código gerado pelo Postman e alterei algumas linhas para ajustar o request ao que o postman estava usando, ficando assim: // Linhas abaixo necessárias para usar o cUrl com windows sem certificado //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $token = $this->loadToken(); curl_setopt_array($ch, array( CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPGET => TRUE, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $token, 'Cache-Control: no-cache', 'X-Api-Key: ' . $this->apiKey, ) )); Para mim, aparentemente, resolveu o problema. Obrigado!
  3. RodriAndreotti

    php instalation

    Olá, como o Vinicius falou, o XAMPP já faz isso por você, tenta executar as verificações que ele sugeriu. Porém se por algum motivo você quiser instalar ele manualmente (eu prefiro, por sinal), aqui tem um passo a passo para o PHP e para o Apache: https://blog.eximiaweb.com.br/tutorial-php-instalando-o-php/ https://blog.eximiaweb.com.br/tutorial-php-instalando-o-apache/
  4. RodriAndreotti

    CHECKBOX e VARIAVEIS

    Opa... precisando, estamos ai!
  5. RodriAndreotti

    CHECKBOX e VARIAVEIS

    Olá, Webbcharles! Assim como você fez com os checkbox (colocando eles como array), você vai precisar fazer com os demais campos também, se não ele só trará um dos que estiverem preenchidos, ficaria tipo isso: <input type="hidden" name="matricula[]" id="matricula" value="<?=$row->matricula?>"> <input type="hidden" name="codcusto[]" value="<?=$row->CODCUSTO?>"> <input type="hidden" name="perletivo[]" value="<?=$row->Perletivo?>"> E no seu for: for ($i=0;$i<$count;$i++){ $vetor = array( 'matricula' => $matricula[$i], 'certificado' => $certificado[$i], 'codcusto' => $codcusto[$i], 'perletivo' => $perletivo[$i] ); $atualiza = $this->colaborador->liberarCertificados($vetor); } Veja se te ajuda. Abraços!
  6. RodriAndreotti

    Checkbox Indeterminado em PHP

    Olá, Rafael! Então, veja, o checkbox é um campo binário, ou está selecionado, ou não está, quando colocamos um input hidden com o mesmo nome do checkbox (como no seu exemplo) estamos garantindo que o checkbox sempre receba um valor, pois o último elemento sobrescreve o primeiro. Explicando um pouco melhor: Quando um navegador posta um checkbox, ele só o posta caso o checkbox esteja selecionado, ou seja, se você tem: <label><input type="checkbox" value="M" name="sexo"> Masculino</label> Porém na hora que você clica no botão de submit você não selecionou este checkbox, ele não será postado, e no PHP você tentar acessar o índice $_POST['sexo'] receberá a mensagem de "undefined offset". Neste caso você teria que tratar o checkbox do lado do php com isset ou array_key_exists. Se você fizer o seguinte: <label> <input type="hidden" value="F" name="sexo"> <input type="checkbox" value="M" name="sexo"> Masculino </label> E fizer o mesmo teste, irá observar que agora o índice $_POST['sexo'] receberá o valor "F". Ou seja, neste caso o $_POST['sexo'] nunca estará indefinido, ao contrário do primeiro exemplo. Veja que mesmo me java não faz muito sentido ter esta verificação, pois se o campo só pode ter dois estados (checado e não checado), não faz sentido ter uma verificação para uma terceira condição, saca? PS.: Utilizei a superglobal $_POST só para demostração, não é recomendável acessá-la diretamente no seu código, é sempre bom tratar ela com filter_input, filter_var e filter_has_var ao invés de acessar diretamente. Espero ter ajudado de alguma forma, e qualquer dúvida, posta aí. Abraços!
  7. RodriAndreotti

    Como descobrir se o visitante deu refresh na página?

    Outra opção é você salvar a mensagem de erro na sessão e quando exibir a mensagem, removê-la da sessão, assim quando o F5 for dado já não haverá mais mensagem
  8. RodriAndreotti

    CURL do PHP às vezes retorna resultado vazio

    Bom dia, pessoal! Estou com um problema um tanto inconveniente utilizando as funções curl do PHP. Abaixo deixo uma breve descrição do cenário antes de passar ao código. O Script é executado via linha de comando e é responsável pela importação para banco de dados local de informações vindas de um web api. A classe responsável pela consulta a do web api executa três etapas: Requisição de um token oAuth da Azure, esta requisição está funcionando perfeitamente, este token é armazenado em cache e renovado de tempos em tempos sem maiores problemas É realizada uma consulta ao API que retorna um json contendo alguns objetos O array retornado pelo item 2 é percorrido e utilizado para consultar outro método do API, que retorna outro json. Enfim, espero que tenha conseguido ser claro no cenário, infelizmente não posso passar muitos detalhes sobre o API em questão =/ Agora o código, estou usando para o acesso ao API as funções de curl do PHP, como mencionei antes, o token funciona perfeitamente, o problema maior está nas etapas 2 e 3, algumas vezes o retorno da etapa 2 vem vazio, outras o da etapa 3, nunca é gerado erro nem no curl_error, nem no curl_errno e nem no curl_info (Incluso neste o código HTTP vem como 200). <?php namespace RestClient\Service; /** * Cliente abstrato de acesso ao webservice REST * Este cliente é responsável por gerar o token para uso * com os demais clientes. * * @author Rodrigo Teixeira Andreotti <ro.andriotti@gmail.com> */ abstract class AbstractClient { private $tokenUrl; private $clientId; private $secret; private $serviceUrl; private $resourceId; private $tenantId; private $apiKey; private $cache; /** * Recebe em seu construtor uma instância da * aplicação rodando e uma do handler de cache * * @param \Core\Application $app * @param \Core\Cache\Cache $cache */ public function __construct(\Core\Application $app, \Core\Cache\Cache $cache) { $this->tokenUrl = $app->getConfig('api_token_url'); $this->clientId = $app->getConfig('api_clientId'); $this->secret = $app->getConfig('api_secret'); $this->serviceUrl = $app->getConfig('api_service_url'); $this->tenantId = $app->getConfig('api_tenantId'); $this->apiKey = $app->getConfig('api_key'); $this->resourceId = $app->getConfig('api_resourceId'); $this->cache = $cache; $this->loadToken(); } /** * Verifica se existe um token válido em cache, * caso haja o carrega, se não gera um novo token no webservice, * o salva em cache e o retorna para uso pelo serviço. * * @uses AbstractClient::requestToken() * * @return string Token gerado / armazenado */ private function loadToken() { $cache = $this->cache; $token = $cache->readCache('api_token'); if (!$token) { $tokenData = $this->requestToken(); $cache->saveCache('api_token', $tokenData->access_token, 45); // <-- Converte o tempo do token para minutos $token = $tokenData->access_token; } return $token; } /** * Requisita ao webservice o token de acesso * * @return \stdClass Contém o json decodificado com as informações do token */ private function requestToken() { $ch = curl_init($this->tokenUrl . $this->tenantId . '/oauth2/token'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'grant_type' => 'client_credentials', 'resource' => $this->resourceId, 'client_id' => $this->clientId, 'client_secret' => $this->secret )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = json_decode(curl_exec($ch)); curl_close($ch); return $data; } /** * Realiza a consulta ao webserice * * @uses AbstractClient::buildUrlParams() * * @param string $method Método REST que será consultado * @param array $params Paramentros adicionais que serão chamados * * @return \stdClass Retorno do json decodificado */ protected function callService($method, $params = null) { $ch = curl_init($this->serviceUrl . $method . ($params ? $this->buildUrlParams($params) : '')); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE); // Linhas abaixo necessárias para usar o cUrl com windows sem certificado //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt_array($ch, array( CURLOPT_HTTPGET => TRUE, CURLOPT_RETURNTRANSFER => 1, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $this->loadToken(), 'X-Api-Key: ' . $this->apiKey, ) )); $response = curl_exec($ch); $httpCode = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE)); if ($httpCode != 200) { return $httpCode; } $data = json_decode($response); curl_close($ch); return $data; } /** * Constrói os parâmetros em formato de URL * * @param array $params * @return string Parametros de URL formatados */ private function buildUrlParams($params) { $urlParams = ''; if (count($params)) { $urlParams .= '?'; $i = 0; foreach ($params as $key => $param) { $urlParams .= (($i == 0) ? '' : '&'); $urlParams .= $key . '=' . $param; $i++; } } return $urlParams; } } Como eu estou utilizando uma solução própria para o cache, segue minha classe também: <?php namespace Core\Cache; /** * Sistema de cache * * @author Rodrigo Teixeira Andreotti <ro.andriotti@gmail.com> */ class Cache { /** * * @var integer Tempo para o cache em minutos */ private $time = 60; /** * * @var string Local onde o cache será salvo */ private $local; /** * Inicializa a classe e define o local onde o cache será armazenado * @uses Cache::setLocal() * @param string $local */ public function __construct($local) { $this->setLocal($local); } /** * Define o local onde o cache será salvo * @param string $local * @return $this */ private function setLocal($local) { if (!file_exists($local)){ trigger_error('Diretório de cache não encontrado', E_USER_ERROR); } elseif(!is_dir($local)) { trigger_error('Caminho para diretório de cache não aponta para um diretório', E_USER_ERROR); } elseif(!is_writable($local)){ trigger_error('Diretório de cache inacessível', E_USER_ERROR); } else { $this->local = $local; } return $this; } /** * Gera o local onde o arquivo será salvo * @param string $key * @return string */ private function generateFileLocation($key) { return $this->local . DIRECTORY_SEPARATOR . sha1($key) . '.tmp'; } /** * * Cria o arquivo de cache * * @uses Cache::generateFileLocation() * * @param string $key * @param mixed $content * * @return boolean */ private function generateCacheFile($key, $content) { $file = $this->generateFileLocation($key); return file_put_contents($file, $content) || trigger_error('Não foi possível criar o arquivo de cache', E_USER_ERROR); } /** * * Salva um valor em cache * * @uses Cache::generateCacheFiles * * @param string $key * @param mixed $content * @param integer $time Tempo em minutos * * @return boolean */ public function saveCache($key, $content, $time = null) { $time = strtotime(($time ? $time : $this->time) . ' minutes'); $content = serialize(array( 'expira' => $time, 'content' => $content )); return $this->generateCacheFile($key, $content); } /** * Recupera um valor salvo no cache * * @uses Cache::generateFileLocation() * * @param string $key * * @return mixed Valor do cache salvo ou null */ public function readCache($key) { $file = $this->generateFileLocation($key); if (is_file($file) && is_readable($file)) { $cache = unserialize(file_get_contents($file)); if ($cache['expira'] > time()) { return $cache['content']; } else { unlink($file); } } return null; } } Abaixo deixo também um print do var_dump do curl_info em uma das vezes que o problema ocorre. Geralmente tem uma ordem específica para ocorrer o problema, na primeira tentativa o item 2 descrito acima não funciona, na segunda tentativa é o item 3 que não funciona e na terceira tentativa funciona tudo certo. kkk Desde já deixo meu agradecimento pelo tempo e ajuda dos colegas.
  9. RodriAndreotti

    Revenda de Hospedagem x Google Cloud Compute

    Cara... e é impressionante, os sites estão muito mais rápidos para abrir, pois não estou com mais 1457 sites hospedados no mesmo server, somando isso a velocidade dos ssds para leitura, fora a liberdade que tenho para ajustar o server do meu jeito, sem ficar dependendo de suporte... kkk Valeu mesmo irmão, precisando de algo de minha parte estou a disposição!
  10. RodriAndreotti

    Revenda de Hospedagem x Google Cloud Compute

    Desenterrando o tópico só para agradecer o @Williams Duarte, fui de Vultr mesmo, até o momento não me arrependi em nada, servidor rodando a um mês e meio liso com 90 GB SSD, os poucos milisegundos que perco no ping eu ganho em leitura do HD. Cconfigurei um CentOS com ISPConfig nele, tenho que aparar algumas arestas que estão dando uns problemas no meu smtp ainda, mas é coisa de DNS reverso, ainda vou ter que ver como fazer no caso de um host compartilhado mas como 99% dos meus clientes utilizam serviços externos (Live, GSuite ou Zoho) então não chega a ser um problema. Aproveito para deixar um micro review: Na hora que se configura o server, eles já dão várias opções de SO pré configurados, para usar, em menos de 5 minutos você tem um SO pronto para configurar, tem um terminal próprio deles no painel para acesso ao server, ou pode-se fazer via SSH também. Eles tem um recurso chamado block-storage, onde é possível contratar um segundo HD para colocar no server, eu fiz isso para caso dê algum pepino no SO meus dados estão em um HD separado. O único porém é que este recurso só está disponível para o data center de Nova Yorque. Este recurso de block-storage, temporariamente eles estão fornecendo até 50GB na vascaína (na faixa... rs), porém se for acima disso o valor é baixo, 100 GB sai 10 trumps por mês. A cobrança deles é meio estranha, o server que contratei custa 10 Trumps por mês, porém o mês contabilizado deles é de 28 dias, o restante do mês é cobrado em horas, as 48 ou 72 horas adicionais dá menos de 3 dólares. Pra finalizar, o suporte dos caras é de dar vergonha nas empresas nacionais, nunca fiquei mais do que 5 minutos esperando resposta de um ticket. Novamente, Obrigado ao @Williams Duarte pela indicação! Abraços a todos!
  11. RodriAndreotti

    SQL Injection

    Imagina, estamos aqui para tentar ajudar também! E, pessoalmente, fico feliz que você se interesse em desenvolver uma solução segura, coisa que muito "programador" não dá muita importância. Abraços, e boa sorte em seus estudos, e lembre-se, o manual do PHP é seu melhor amigo nestes casos ;-)
  12. RodriAndreotti

    SQL Injection

    Ah... o pequeno bobby tables... kkk
  13. RodriAndreotti

    SQL Injection

    Cara... não exponha suas consultas desta forma... você deve ocultar sua tecnologia ao máximo do usuário final. Mas vamos lá... tentarei te ajudar a proteger um pouco seu sistema. 1º - Evite passar nomes de campos e/ou querys sql de forma visível, passe do html para o PHP somente os valores que estes campos irão receber (mesmo em buscas) - do jeito que seu código está eu poderia simplesmente fazer isso: $("#tipo").val() + "' UNION ALL SELECT * FROM USER --" Pois sei que você está concatenando sua consulta com com estas informações sem filtra-las. 2º - Sempre filtre seus posts ou gets do lado do PHP com filter_input, ou faça uma validação ou uma sanitização do mesmo, dá uma olhada na documentação do filter_input no site do php. 3º - User prepared statement, assim sua consulta será enviada para o banco de dados antes das variáveis que ela recebe, então se receber algo malicioso nas variáveis que passou pela sua filtragem do PHP o máximo que vai ocorrer é um erro, mas não irá expor nada do seu sistema. Espero ter ajudado de alguma forma. Abs.
  14. RodriAndreotti

    Erro ao enviar formulário via POST

    Só não concordo com o item 4... a validação de formulários deve ser feita sempre no lado servidor, javascript pode ser desativado, para a validação do form recomendo o filter_input. Agora com relação ao form, você não fechou a tag form após o botão submit, pode ser por isso, outro detalhe, esta página está sendo usada como include? se não, você precisa dos elementos html e body, se não o post não vai mesmo.
  15. RodriAndreotti

    Revenda de Hospedagem x Google Cloud Compute

    Pois é, Banania sempre atrasada na tecnologia.... Valeu novamente @Williams Duarte, vou dar uma pescoçada no vultr. Abraços a todos,
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.