Rss

  • youtube
  • linkedin
  • google

Archives for : Desenvolvimento

Codigo de validação de CPF para Javascript

O código abaixo é de uma função em Javascript otimizada para ter o menor numero de complexidade ciclomática linhas 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 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.

const validarCpf = (cpf) => {
  if (cpf.length !== 11) { // Supõe-se já vir filtrado o valor
    return false;
  }
  let elementos = cpf.split(''); // convertendo a string em array
  elementos[10] = 0; // Forçando ao valor da ultima multiplicacao ser zero
  let somaA = 0;
  let somaB = 0;

  elementos.reduce(function(i, valor, indice) {
    let multiplicador = 11 - indice;
    somaB += (valor * multiplicador);
    somaA += (valor * (multiplicador > 2 ? multiplicador - 1 : 0));
  }, somaA);
  let moduloA = ((somaA * 10) % 11) % 10;
  let moduloB = ((somaB * 10) % 11) % 10;
  return cpf.replace(/\d{9}(\d{2})$/g, '$1') == ("" + moduloA + moduloB);
}

Você pode testar esse código aqui.

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.

Algoritimo de validação de CPF brasileiro –; Cadastro de Pessoa Física

Neste artigo explicarei passo a passo na transformação de um algorítimo de verificação da validade de um CPF para código em PHP.

Se você já conhece o algorítmo e quer ir direto aos códigos disponíveis, clique aqui.

Mas o que é o CPF?

CPF é o acrônimo para Cadastro de Pessoa Física. Ele é um número de documento brasileiro atualmente gerenciado e emitido pela Receita Federal. Todo brasileiro tem o direito (ou o dever) de ter um e somente com ele é possível ter acesso a serviços bancários, matricular-se em cursos de graduação públicos, assumir cargo através de concurso público, ter cartão de crédito, entre outros exemplos.

Composição do CPF

O CPF é composto de onze algarismos, sendo que os ultimos três algarismos possuem significados que explicaremos a seguir.

O nono dígito, lendo da esquerda para a direita, indica a Região Fiscal onde ele foi emitido. Há dez regiões para os algarismo de zero a nove conforme tabela abaixo.

1 – DF, GO, MS, MT e TO
2 – AC, AM, AP, PA, RO e RR
3 – CE, MA e PI
4 – AL, PB, PE, RN
5 – BA e SE
6 – MG
7 – ES e RJ
8 – SP
9 – PR e SC
0 – RS

Os primeiro oito algarismos são o numero base.

Os ultimos dois algarismo são os dígitos verificadores.

Esses dígitos são gerados a partir de cálculos dos nove primeiros algarismos de acordo com a seguintes regras:

Primeiro Dígito verificador

Para o primeiro dígito, pegamos os 8 primeiros algarismos e multiplicamos cada um deles por um número iniciado em 10 e a medida em que vamos avançando para a direita, diminuimos em 1 esse multiplicador e somamos todos os resultados.

Para melhor entendimento, tomemos 123.456.789-XY como exemplo de CPF a ter o digito XY calculado.

1 x 10 = 10
2 x 9 = 18
3 x 8 = 24
4 x 7 = 28
5 x 6 = 30
6 x 5 = 30
7 x 4 = 28
8 x 3 = 24
9 x 2 = 18
Somando 10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 temos 210.

Agora, com o total obtido temos duas forma de chegar ao digito verificador.

Método 1

Multiplicamos 210 por 10, dividimos por 11 e pegamos o resto.

Temos então: 210 x 10 = 2.100

2.100 / 11 = 190 com resto 10.

Se o resto for 10 o dígito verificador é zero, do contrário, o resto é o dígito verificador.

No nosso caso, como o resto é igual a 10 o primeiro dígito será 0 (zero).

Método 2

Obtemos o resto da divisão de 210 por 11.

Temos então: 210 / 11 é igual a 19 com resto 1.

Aqui temos uma regra para quando o resto for 0 (zero) ou 1 (um). Quando isso acontece o dígito verificador é zero, do contrário subtraimos o resto de 11 para obter o dígito verificador.

Para o nosso caso, como temos resto 1, o nosso primeiro dígito verificador será 0 (zero).

Segundo dígito verificador

Para obter o segundo dígito verificador, acrescentamos o primeiro dígito verificador aos 9 algarismos iniciais e fazemos novamente o mesmo processo feito para o primeiro dígito, com a diferença de que agora iniciamos a partir do segundo dígito.

Nosso CPF já está com o valor 123.456.789-0X e as operações necessárias estão abaixo.
2 x 10 = 20
3 x 9 = 27
4 x 8 = 32
5 x 7 = 35
6 x 6 = 36
7 x 5 = 35
8 x 4 = 32
9 x 3 = 27
0 x 2 = 0
Somando 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 temos 244.

Agora, com o total obtido devemos usar uma das duas formas já explicadas para chegar ao dígito verificador.

Método 1

Multiplicamos 244 por 10, dividimos por 11 e pegamos o resto.

Temos então: 244 x 10 = 2.440

2.440 / 11 = 221 com resto 9.

Se o resto for 10 o dígito verificador é zero, do contrário, o resto é o dígito verificador e no nosso caso temos 9 como segundo dígito verificador.

Método 2

Obtemos o resto da divisão de 244 por 11.

Temos então: 244 / 11 é igual a 22 com resto 2.

Lembrando que temos uma regra para quando o resto for 0 (zero) ou 1 (um) o dígito verificador é zero.

Caso seja maior que 1 subtraimos esse valor de 11 para obter o dígito verificador.

Para o nosso caso, temos 11 ; 2 = 9 como nosso segundo dígito verificador que é o mesmo valor obtido no método 1.

CPF tem um limite para emissão?

Na teoria, podemos ter até 10^8 ou 100.000.000 (cem milhões) de combinações possíveis para cada região. Na prática temos um pouco menos devido ao não uso de algarismos repetidos, por exemplo. Embora pareça um número bem grande, ele deverá ser remodelado em algum momento, já que não pode ser reutilizado mesmo quando uma pessoa falece.

Supondo que já existam na região 8 (estadao de São Paulo) cerca de 40 milhões de CPFs emitidos (não consegui dados fidedignos em 2022 por isso estou usando um número aproximado da população residente que é de 44,5 milhões de pessoas), restariam aproximadamente 60 milhões de CPFs disponíveis. Com a atual taxa de crescimento de CPFs (ano de 2022) em cerca de 600 mil por ano, o sistema deve aguentar pouco menos de 100 anos.

Chegamos aqui ao final da explicação e do exemplo sobre a composição do CPF. O nosso CPF de exemplo ficou como 123.456.789-09. Abaixo temos alguns exemplos de códigos tanto para gerar os dígitos verificadores, quanto para validá-los.

Códigos

Versão PHP.

Versão Javascript.

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 >>

Usando jQueryMask Plugin para formatar datas em diferentes padrões

jQuery Mask Plugin é uma grande biblioteca de Javascript para formatar campos para apresentação e/ou para forçar uma entrada corretamente pelos utilizadores.

Aqui, Eu Mostro como lidar com INPUT ou outro elemento HTML para exibir datas quando a data de origem tem um formato diferente do elemento de destino.

Exemplo:

  • Temos um data-hora com Ano-mês-dia hora:Minuto:Segundos e é preciso mostrar apenas o fragmento Ano/Mês/Dia (sem hora:minuto:segundo).
  • Temos da data em Ano-mês-dia e é preciso formatar para Dia/mês/ano.

jQueryMask é muito simples de usar. Ele não precisa muito para mascarar o que você precisar. Veja exemplos em seu site.

Se você precisa formatar um campo de data simples (mesmo em um elemento não INPUT), Basta usar o código abaixo.

jQuery('[dados-papel ="Data"]).máscara("TC99/M9/D9", {
        espaço reservado: "____/__/__",
        Tradução: {
            "D": {padrão: /[0-3]/, opcional: falso, recursiva: true},
            "M": {padrão: /[01]/, opcional: falso, recursiva: true},
            "T": {padrão: /[12]/, opcional: falso, recursiva: true},
            "C": {padrão: /[09]/, opcional: falso, recursiva: true}
        }
    });

O código acima pode mascarar e pre-validar datas no formato ANO/MÊS/DIA ..

Com um INPUT como

<;tipo de entrada ="texto" dados-papel ="Data" valor ="2018-06-11 15:47" />;

teria alterado seu valor para 2018/06/11.

Se você tentar digitar outra data (depois de limpar, é claro) Você não pode começar com um número diferente de 1 ou 2. Por esta razão é que a nossa máscara tem um translation para ser feito quando permitindo caracteres. Se não coincide com o padrão, o caractere é apagado.

The meaning of “;TC99/M9/D9; é:

  • Deve começar com 1 ou 2 (Tradução T: /[12]/ ; Formato personalizado)
  • Deve ter número 0 ou 9 (Tradução de C: /[09]/ ; Formato personalizado)
  • Deve ter um número (qualquer) (Tradução 9 ; Formato do Core MaskPlugin)
  • Deve ter um número (qualquer) (Tradução 9 ; Formato do Core MaskPlugin)
  • Uma barra será adicionada automaticamente ( / )
  • Deve ter número 0 ou 1 (Tradução M: /[01]/ ; Formato personalizado)
  • Deve ter um número (qualquer) (Tradução 9: Formato do Core MaskPlugin)
  • Uma barra será adicionada automaticamente ( / )
  • Deve ter número 0, 1, 2 ou 3 (Tradução D: /[0-3]/ ; Formato personalizado)
  • Deve ter um número (qualquer) (Tradução 9: Formato do Core MaskPlugin)

É claro, Não há nenhuma validação real. You can type “;2999/19/39; e isto não é uma data válida, Mas está quase pronto.

Então, para Formatar de outra maneira, Basta alterar a ordem de parâmetro de máscara.

Mas, se a data de origem estiver em um padrão diferente, como dia/mês/ano, a máscara não funciona. The date output for “;06/11/2018 15:40; will be weird “;1018/15/0;.

Para manipular data diferente formatos serão necessários mais do que simples máscara. Vamos precisar de uma função.

Veja o código abaixo

        var maskBehaviorDateTime = função (Val, e, campo) { // Esta função deve retornar uma máscara var msk = "TC99/M9/D9"; // Nosso formato desejado var v = field.is('entrada') ? Field.Val() : Field.Text(); // é uma entrada ou outro elemento html??
                    v = v.replace(/\D/g, ''); // listra de dígitos não se (v != '') { // tem valor?
                        se ((/^[01]\d[0-3]\dd{4}$/).teste(v)) { //testar se o padrão corresponde a v único dia/mês/ano = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                        } senão se ((/^[01]\d[0-3]\dd{4}[012]\d[0-5]\d$ /).teste(v)) { //teste se o padrão corresponde a hora do dia/mês/ano:Minuto v = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                            // Se nós precisamos mostrar a hora e minuto, máscara retornada deve ser também mudou
                            // v = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5');
                            // MSK = ' TC99/M9/D9 h9:M9'; // h e m devem ser existe em opções de tradução
                        }
                        Field.is('entrada') ? Field.Val(v) : Field.Text(v);
                    }
                    retornar a msk;
                },
                optionsDateTime = {
                    espaço reservado: "____/__/__",
                    Tradução: {
                        "D": {padrão: /[0-3]/, opcional: falso, recursiva: true},
                        "M": {padrão: /[01]/, opcional: falso, recursiva: true},
                        "T": {padrão: /[12]/, opcional: falso, recursiva: true},
                        "C": {padrão: /[09]/, opcional: falso, recursiva: true},
                        "h": {padrão: /[0-2]/, opcional: true, recursiva: true},
                        "m": {padrão: /[0-5]/, opcional: true, recursiva: true}
                    }
                };
        jQuery('[dados-papel ="Data"]').máscara(maskBehaviorDateTime,  optionsDateTime);

Agora temos mais dois Translation Pattern (h e m). h significa que a posição n-índice deverá ter números 0, 1 ou 2 e m números entre 0 e 5. Tenha em mente que o CASO importa.

Com o código acima, Podemos Formatar e mostrar data de várias maneiras. Apenas mude .teste() e .Substitua() padrão para preencher seu padrão desejado.

Este é o código que estou usando para formatar os campos datetime do banco de dados com ANO-MÊS-DIA HORA:MINUTO:SEGUNDO em elementos html com dia/mês/ano hora:MINUTO

    var maskBehaviorDateTime = função (Val, e, campo) {
            // Caso já exista um valor, o formata no padrão dd/mm/yyyy com o opcional hh:mm:SS var msk = "TC99/M9/D9 h9:M9:S9";
            se (field.attr("data-original-value") == undefined) {
                var o = field.is('entrada') ? Field.Val() : Field.Text();
            } else {
                var o = field.attr("data-original-value");
            }
            v = o.replace(/\D/g, '');
            se (v != '') {
                field.attr("data-original-value") == undefined &;&; field.attr("data-original-value", o);
                se ((/^[12][09]\d{2}[01]\d[0123]\d$ /).teste(v)) { // ano/mês/dia v = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                    MSK = "D9/M9/TC99";
                } else  if ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d$ /).teste(v)) { // ano/mês/dia/hora:minuto v = v.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5');
                    MSK = "D9/M9/TC99 h9:M9";
                } senão se ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d[0-5]\d$ /).teste(v)) { // ano/mês/dia/hora:minuto:segundo v = v.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5:$6');
                    MSK = "D9/M9/TC99 h9:M9:S9";
                }
                Field.is('entrada') ? Field.Val(v) : Field.Text(v);
            }

            retornar a msk;
        },
        optionsDateTime = {
            espaço reservado: "__/__/____",
            Tradução: {
                "D": {padrão: /[0-3]/, opcional: falso, recursiva: true},
                "M": {padrão: /[01]/, opcional: falso, recursiva: true},
                "T": {padrão: /[12]/, opcional: falso, recursiva: true},
                "C": {padrão: /[09]/, opcional: falso, recursiva: true},
                "h": {padrão: /[0-2]/, opcional: true, recursiva: true},
                "m": {padrão: /[0-5]/, opcional: true, recursiva: true},
                "s": {padrão: /[0-5]/, opcional: true, recursiva: true}
            },
        };
    jQuery('[dados-papel ="Data"]').máscara(maskBehaviorDateTime,  optionsDateTime);

Com um INPUT como

<;tipo de entrada ="texto" dados-papel ="Data" valor ="2018-06-11 15:40">;

Saída será

11/06/2018 15:40

Espero que isto ajude a!

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 >>

jQuery.html() não funciona em Internet Explorer

Recentemente tive problemas com um código javascript que utiliza jQuery e que funcionava em diversos navegadores como o Chrome, o Firefox e algumas versões do Internet Explorer, mas que teimava em não funcionar em Internet Explorer 7 e 8.
Segue o código:

$.post(url,{ options }, 
  function (response) {
     $('#myElement').html(response);
  },
'text');

Após alguns testes percebi que não era um problema do método, pois em outros códigos ele se comportava como o esperado.
Então debugando minuciosamente o código e as respostas do método Ajax percebi um pequeno erro de sintaxe no HTML e foi só o corrigir que o IE 7 exibiu corretamente a resposta.
Segue então a dica, caso tenha problemas com o método jQuery.html(), verifique antes de tudo se o conteúdo a ser escrito no elemento é um código html sem erros, pois a validação do IE 7/8 não permitirá escrever HTML com nenhum erro, por menor que seja.