Rss

  • youtube
  • linkedin
  • google

Archives for : PHP

Codigo de validação de CPF para PHP

O código abaixo é de uma função em PHP otimizada para ter o menor numero de complexidade ciclomática que consegui baseado na explicação presente no artigo Algoritimo de validação de CPF brasileiro – Cadastro de Pessoa Física. Ele tem uma ligeira alteração no momento do cálculo do segundo digitido verificador. Ao invés de começar pelo segundo algarismo, o codigo começa pelo primeiro e usa o valor 11 como multiplicador. Outra alteração visivel é que para evitar a necessidade de comparação para saber se estamos no nono e decimo digitos, atribuo o valor zero ao ultimo elemento (indice 10) para reduzir mais uma comparação.

O algoritmo utilizado é o método 1 explicado no artigo citado anteriormente e há um pequeno truque para evitar a comparação com o resto igual a 10 que é fazer o módulo de 10 do resto.

   // Codigo que valida um CPF informado quanto a validade de seus dígitos verificadores.

   /**
     * 
     * Verifica se um CPF é válido
     * @author Marcos Regis <marcos@marcosregis.com>
     * @param  string $cpf
     * @return bool
     */
    function validar(string $cpf): bool
    {
        if (strlen($cpf) != 11) {
            return false;
        }
        $elementos = (array)str_split($cpf);
        $elementos[10] = 0; // Reduz uma comparação no calculo de $somaB
        $somaA = 0;
        $somaB = 0;
        foreach ($elementos as $indice => $elemento) {
            $multiplicador = count($elementos) - $indice;
            $somaA += (int)$elemento * (int)($multiplicador > 2 ? $multiplicador - 1 : 0);
            $somaB += (int)$elemento * (int)$multiplicador;
        }

        $moduloA = (($somaA * 10) % 11) % 10;
        $moduloB = (($somaB * 10) % 11) % 10;

        return preg_replace('#\d{9}(\d{2})$#', '$1', $cpf) == $moduloA . $moduloB;
    }

Você pode testar esse código aqui.

Docker em Ubuntu. Service nginx failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder(;)/startup.sh: no such file or directory

Docker em Ubuntu

Às vezes, ao usar Laradock, este erro ocorre depois de tentar uma reconstrução de container com no such file or directory mensagem em docker-compose up -d –build nginx comando.

Não está claro para mim qual é a questão real, mas executando o comando com sudo, podemos executá-lo com sucesso.

Seems that the regular user need access rights to directory /var/lib/docker/tmp/ but do not have. So, running with sudo the trouble is bypassed and the build can finished normally.

Depois de construir containers com sudo, é possível descarregá-lo e recarregar sem sudo.

DataTables + HTML 5 Botões de exportação + Laravel-Mix (Webpack)

Nos últimos dias, Eu experimentei um problema ao tentar usar DataTables e Bootstrap 4 com suporte para exportar os resultados para Excel e PDF usando Laravel-Mix. Após horas e horas tentando colocar todos os scripts para trabalharem juntos, Eu finalmente consegui. Então, decidi escrever este pequeno Como Fazer para aqueles com o mesmo tipo de problemas.



Continue lendo >>

Vinculação de vários valores em instrução de SQL com PDO (PDOStatement)

Às vezes temos de procurar um único valor através de várias colunas ao criar instruções SQL.

Suponha a tabela abaixo

  • [ENTITY_ONE]
    • ID
    • COLUMN_A
    • COLUMN_B
    • COLUMN_C
    • COLUMN_D
    • COLUMN_E

Se precisamos procurar um único valor nas colunas B,D e E Vamos precisar usar a seguinte instrução

SELECIONE A ID, COLUMN_A,(...COLUNAS...), COLUMN_E de ENTITY_ONE onde COLUMN_B como '% search_value %' ou COLUMN_D como '% search_value %' ou COLUMN_E como '% search_value %';

No código PHP podemos fazer

$q = '% search_value %';
$SQL = "SELECIONE * DE ENTITY_ONE onde COLUMN_B como '$q' ou COLUMN_D como '$q' ou COLUMN_E como '$q'; 
$DOP = novo DOP($DSN, $usuário, $passar); 
$stmt = $pdo->;consulta($SQL);

Bem, this can work but we know that isn’;a melhor abordagem. Nós precisamos usar valores de ligação para evitar a injeção SQL e outras coisas maliciosas.

Então, o código pode ser modificado para

$q = '% search_value %'; 
$SQL = "SELECIONE * DE ENTITY_ONE ONDE COLUMN_B COMO ? OU COLUMN_D COMO ? OU COLUMN_E COMO ?; 
$args = [$q, $q, $q]; // Precisamos de uma entrada para cada "?" na instrução $pdo = novo DOP($DSN, $usuário, $passar); 
$stmt = $pdo->;Prepare-se($SQL);
$stmt->;executar($args);

Muito melhor, Mas, Quando estiver criando instruções de SQL complexas, things can be confusing with lots of arguments and don’;esqueça: A ORDEM IMPORTA.

Felizmente PDO pode vincular os valores em ordem diferente quando usando ligações nomeadas.

$q = '% search_value %'; 
$SQL = "SELECIONE * DE ENTITY_ONE ONDE COLUMN_B COMO :first_arg ou COLUMN_D como :second_arg ou COLUMN_E como :third_arg; 

$DOP = novo DOP($DSN, $usuário, $passar); 
$stmt = $pdo->;Prepare-se($SQL); 
// Uma maneira de $args = [':first_arg' =>; $q, ':third_arg' =>;$q, ':second_arg' =>; $q]; // Precisamos de uma entrada para cada ":nome" on instruction 
$stmt->;executar($args); 
// Another way
$stmt->;bindValue(':third_arg'. $q);
$stmt->;bindValue(':first_arg', $q); 
$stmt->;bindValue(':second_arg', $q);

$stmt->;executar(); 

Hmm, seems that this isn’;bom o suficiente. Só mudamos o uso de 1-espaço reservado indexado para um :espaço reservado nomeado. There’;ganho além do código ficar mais legível e a possibilidade de ligar em qualquer ordem.

Sim, Mas agora podemos fazer a melhor abordagem possível ao usar um termo de pesquisa único em várias colunas. Podemos usar apenas um bind para um ou mais :named placeholders ‘;porque o PDO é esperto e inteligente. Olha nosso código final aqui.

$q = '% search_value %'; 
$SQL = "SELECIONE * DE ENTITY_ONE ONDE COLUMN_B COMO :unique_arg ou COLUMN_D como :unique_arg ou COLUMN_E como :unique_arg; 
$DOP = novo DOP($DSN, $usuário, $passar); 
$stmt = $pdo->;Prepare-se($SQL); 
// Uma maneira de $args = [':unique_arg' =>; $q]; // Podemos vincular todos :name with only one term 
$stmt->;executar($args); 
// Another way 
$stmt->;bindValue(':unique_arg', $q); 
$stmt->;executar(); 

Pode economizar um monte de digitação quando escrevendo muitas instruções SQL, usando o mesmo argumento.

Renomeando arquivos usando lista de 0 a Z

Hoje eu estava programando alguns scripts e encontrei um pequeno problema de usar um padrão definido.

O padrão é criar arquivos onde a sequência inicia em 0 (zero) e não pode ser repetido até Z.

Exemplo:

myfile0.ext, myfile1.ext, myfile2.ext, (...), myfile9.ext, myfileA.ext, myfileB.txt, (...), myfileZ.txt

Bem, Isto não é um grande problema, então eu uso esse código.

// Filename
$seq = $last_used_seq = '';
$seqs = array_merge(range('0','9'), range('A', 'Z'));]
$l = 1;
while (!in_array($seq, $seqs)) {
    $seq = chr(ord($last_used_seq) + $l++);
}

Mas

$Seq

Não deu o valor esperado de 0 (zero) na primeira execução. Em vez disso, estava em branco.

As variáveis de depuração, Eu vi que o while Nunca é avaliada como true. A tentativa de reproduzir na linha de comando que vi

in_array($Seq, $PDCs);

sempre retornar true. Eu tentei usar “”, “R” e não importa qual o valor que eu usei, ainda retornando true.

Então eu mudar para usar STRICT argumento para in_array to true and works for ‘;A’; through ‘;Z’;, but not for ‘;0; through ‘;9;.

while (!in_array($seq, $seqs, true)) {
    $seq = chr(ord($last_used_seq) + $l++);
}

Damn…; PHP é certo, ;0; Não é estritamente iguais para 0. O Chr função de retorno string e

gama('0', '9')

Cria um array com integer valores.

Então, Eu mudei a abordagem para avaliar todos os valores com STRICT, Porque eu gostaria de criar um código limpo sem nenhuma outras funções para ser usado.

This is the final code that I’;usando o m:

// $seq de valores iniciais = ';
$PDCs = array_merge(gama(Ord('0'),Ord('9')), gama(Ord('A'), Ord('Z')));
$PDCs = array_map(«chr», $PDCs);
$l = 1;
ao mesmo tempo (!in_array($Seq, $PDCs, true)) {
    $Seq = chr(Ord($infos['last_seq']) + $l + +);
}

// Nomes de arquivo foreach ($itens_for_files as $key =>; $itens) {
    // ... Mais códigos para preencher o arquivo $seq = chr(Ord($Seq) + 1);
    ao mesmo tempo (!in_array($Seq, $PDCs, true)) {
    $Seq = chr(Ord($Seq) + 1);
    $FileName = 'myfile' . $Seq . 'ext';
    // ...
}

Como você pode ver, Eu mudei o $seqs initial values from ‘;0; para seu ASCII código e voltar ao seu valor que me deu um array com todos os valores em string type.

Até mais!

Erro em Comparação PHP

Hoje, Eu estava escrevendo um script em PHP para ser usado na linha de comando, quando me deparei com um comportamento inesperado (pelo menos da minha parte).
O script deve receber três argumentos, o último de uma lista que contém um ou mais códigos numéricos.
Tentando validar este último argumento obtive um resultado diferente do esperado.
Veja o trecho de código que eu estava usando.:

// Test. php se (php_sapi_name() = = 'cli') {
    $di = isset($argv[1]) ? $argv[1] : Data('Y-m-d'); // Inicial data $df = isset($argv[2]) ? $argv[2] : Data('Y-m-d'); // Data final $prods = isset($argv[3]) ? explodir(',', $argv[3]) : matriz(); // Lista de códigos

    ##### Validando
    // Inicial data se ($di != Data('Y-m-d', strtotime($di))) {
        Eco "\n";
        Eco "ERRO! DATA inicial inválida!\n";
        saída;
    }
    // Final data se ($DF != Data('Y-m-d', strtotime($DF))) {
        Eco "\n";
        Eco "ERRO! Data FINAL inválida!\n";
        saída;    
    }

    // Códigos se (contagem($Aguilhões) >; 0) {
        foreach ($agulhadas como $prod) {
            se ($prod != (int)$prod) {
                Eco "\n";
                Eco "ERRO! O código " . $prod . " é inválido!\n" ;
                saída;
            }
        }
    }
    Eco "FEITO!";
}

Continue lendo >>

Convertendo xor, shr e shl de Delphi para PHP

Estou migrando um software feito em Delphi para PHP e me deparei com um problema em uma maldita bendita função de criptografia.

Sofri um bocado tentando reescrever a função não pela complexidade do código e sim com as diferenças nos resultados.

A função faz uso dos operadores XOR e SHR na versão Delphi. O SHR foi relativamente fácil graças a experiência com operadores bit a bit e como a documentação do Delphi diz que o operador retira bits à direita

Continue lendo >>