RSS

  • YouTube
  • LinkedIn
  • Google

Archivos de la : PHP

Código de validación CPF para PHP

El siguiente código es una función PHP optimizada para tener el menor número de complejidad ciclomática que pude según la explicación presente en el artículo. Método brasileño de validación de la ACB - Registro individual. Tiene un ligero cambio en el momento del cálculo del segundo probador digitalizado. En lugar de comenzar con el segundo dígito, El código comienza con el primero y utiliza el valor 11 como multiplicador. Otro cambio notable es que para evitar la necesidad de comparación saber si estamos en el noveno dígito y decimo, Asigno el valor cero al último elemento (índice 10) para reducir una comparación más.

El algoritmo utilizado es el 1 explicado en el artículo citado anteriormente y hay un pequeño truco para evitar comparar con el resto igual a 10 que es hacer el módulo 10 del 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;
    }

Puede probar este código aquí.

Docker en Ubuntu. Service nginx no pudo construir: Error de ADD: stat /var/lib/docker/tmp/docker-builder(;)/startup.sh: ningún archivo o directorio de este tipo

Docker en Ubuntu

A veces, al usar Laradock, este error se produce después de intentar una reconstrucción de contenedor con no such file or directory mensaje en docker-compose up -d –build nginx Comando.

No está claro para mí cuál es el problema real, pero ejecutar el comando con sudo, podemos ejecutarlo con éxito.

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.

Después de construir contenedores con sudo, es posible descargarlo y recargar sin sudo.

DataTables + HTML 5 Exportación de botones + Laravel-Mix (WebPack)

En los últimos días, He experimentado un problema tratando de usar DataTables y Manos a la obra 4 con soporte para exportar los resultados Excel y PDF utilizando Laravel-Mix. Después de horas y horas tratando de poner todos los scripts para trabajar juntos, Por fin gano. Por lo tanto, Me decido a escribir este Cómo para aquellos con el mismo tipo de problemas.



Continuar leyendo >>

Enlace varios valores en la instrucción SQL de PDO (PDOStatement)

A veces necesitamos buscar un valor único a través de varias columnas al crear instrucciones SQL.

Supongamos la siguiente tabla

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

Si necesitamos buscar un valor en columnas B,D y E necesario utilizaremos la siguiente instrucción

SELECCIONAR ID, COLUMN_A,(...Columnas..), COLUMN_E 
FROM ENTITY_ONE WHERE COLUMN_B LIKE '%search_value%' OR COLUMN_D LIKE '%search_value%' OR COLUMN_E LIKE '%search_value%';

Código PHP que podemos hacer

$q ' '%search_value%';
$sql ? "Seleccione * DESDE ENTITY_ONE DONDE COLUMN_B COMO '$q' O COLUMN_D COMO '$q' O COLUMN_E COMO '$q'; 
$pdo - nueva DOP($Dsn, $Usuario, $Pasar); 
$stmt = $pdo->;Consulta($Sql);

Bien, this can work but we know that isn’;t el mejor enfoque. Necesitamos utilizamos valores vinculantes para evitar SQL injection y otras golosinas que.

Por lo tanto, el código puede ser modificado a

$q ' '%search_value%'; 
$sql ? "Seleccione * DE ENTITY_ONE DONDE COLUMN_B COMO ? O COLUMN_D COMO ? O COLUMN_E COMO ?; 
$args ? [$Q, $Q, $Q]; // Necesitamos una entrada para cada "?" on instruction
$pdo = new PDO($Dsn, $Usuario, $Pasar); 
$stmt = $pdo->;Preparar($Sql);
$stmt->;Ejecutar($Args);

Mucho mejor, pero, al generar instrucciones SQL complejas, things can be confusing with lots of arguments and don’;no se olvide: ASUNTOS DE ORDEN.

Felizmente PDO puede enlazar valores en orden diferente cuando usando el nombre enlaces.

$q ' '%search_value%'; 
$sql ? "Seleccione * DE ENTITY_ONE DONDE COLUMN_B COMO :first_arg o COLUMN_D COMO :second_arg o COLUMN_E COMO :third_arg; 

$pdo - nueva DOP($Dsn, $Usuario, $Pasar); 
$stmt = $pdo->;Preparar($Sql); 
// One way
$args = [':first_arg' =>; $Q, ':third_arg' =>;$Q, ':second_arg' =>; $Q]; // Necesitamos una entrada para cada ":Nombre" on instruction 
$stmt->;Ejecutar($Args); 
// Another way
$stmt->;bindValue(':third_arg'. $Q);
$stmt->;bindValue(':first_arg', $Q); 
$stmt->;bindValue(':second_arg', $Q);

$stmt->;Ejecutar(); 

Hmm, seems that this isn’;t bueno. Sólo cambiamos el uso de 1-marcador de posición indexada a un :marcador de posición nombre. There’;s ningún beneficio más allá del código legible y la posibilidad de enlazar en cualquier orden.

Sí, pero ahora podemos hacer la mejor aproximación cuando se utiliza un término de búsqueda única en varias columnas. Podemos utilizar solamente un lazo a uno o más :named placeholders ’;causa PDO es inteligente y listo. Mira aquí nuestro código final.

$q ' '%search_value%'; 
$sql ? "Seleccione * DE ENTITY_ONE DONDE COLUMN_B COMO :unique_arg o COLUMN_D COMO :unique_arg o COLUMN_E COMO :unique_arg; 
$pdo - nueva DOP($Dsn, $Usuario, $Pasar); 
$stmt = $pdo->;Preparar($Sql); 
// One way 
$args = [':unique_arg' =>; $Q]; // Podemos atar a todos :name with only one term 
$stmt->;Ejecutar($Args); 
// Another way 
$stmt->;bindValue(':unique_arg', $Q); 
$stmt->;Ejecutar(); 

Puede ahorrar un montón de escribir al escribir muchas instrucciones SQL utilizando el mismo argumento.

Nombres de archivos con lista de 0 a la Z

Hoy fue la codificación algunos scripts y encontró un pequeño problema con un patrón definido.

El patrón es crear archivos donde la secuencia se inicia en 0 (cero) y no puede repetirse hasta Z.

Ejemplo:

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

Bien, Esto no es un gran problema por lo utilizar este 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++);
}

Pero

$Seq

no dio el valor esperado de 0 (cero) en la primera carrera. En su lugar, fue en blanco.

Depuración de las variables, He visto que la while nunca se evalúa a true. Intentar reproducir en la línea de comandos vi

in_array($Seq, $seqs);

siempre volver true. Intenté utilizar “”, “R” y no importa qué valor, volviendo todavía true.

Por lo tanto cambiar para utilizar 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 es correcto, ;0; no es estrictamente igual a 0. El Chr función de retorno string y

rango('0', '9')

crea un array con integer valores.

Por lo tanto, Cambié el enfoque para evaluar todos los valores con STRICT, porque me gustaría crear un código limpio y sin ninguna otras funciones para utilizar.

This is the final code that I’;uso de m:

// Inicial de valores $seq = '';
$seqs = array_merge(rango(Ord('0'),Ord('9')), rango(Ord('A'), Ord('Z')));
$seqs = array_map('chr', $seqs);
$l = 1;
al mismo tiempo (!in_array($Seq, $seqs, true)) {
    $SEQ = chr(Ord($Infos['last_seq']) + $l ++);
}

// Nombres de archivos foreach ($itens_for_files as $key =>; $itens) {
    // ... Y otro para llenar el archivo $seq = chr(Ord($Seq) + 1);
    al mismo tiempo (!in_array($Seq, $seqs, true)) {
    $SEQ = chr(Ord($Seq) + 1);
    $FILENAME = 'miarchivo' . $Seq . ".ext";
    // ...
}

Cómo se puede ver, He cambiado el $seqs initial values from ‘;0; a su ASCII el código y volver a su valor que me dio un array con todos los valores de string tipo.

Nos vemos!

Error de comparación PHP

Hoy, Estaba escribiendo un script en PHP para ser utilizado en la línea de comandos cuando me topé con un comportamiento inesperado (por lo menos de mi parte).
El script debe recibir tres argumentos, la última de ellas una lista que contiene uno o más códigos numéricos.
Tratando de validar este último argumento fue conseguir un resultado diferente lo imaginado.
Ver el fragmento de código que estaba usando:

// Test.php si (php_sapi_name() == 'cli') {
    $di = isset($argv[1]) ? $argv[1] : fecha('Y-m-d'); // Inicial de fecha $df = isset($argv[2]) ? $argv[2] : fecha('Y-m-d'); // Fecha límite $prods = isset($argv[3]) ? explotar(',', $argv[3]) : arreglo de discos(); // Lista de códigos

    ##### Validación de
    // Inicial de fecha si ($di != fecha('Y-m-d', strtotime($di))) {
        Eco "\n";
        Eco "ERROR! FECHA de inicio no válido!\n";
        salida;
    }
    // Final fecha si ($DF != fecha('Y-m-d', strtotime($DF))) {
        Eco "\n";
        Eco "ERRO! FECHA FINAL no válido!\n";
        salida;    
    }

    // Si los códigos (Conde($puntas de prueba) >; 0) {
        foreach ($sondas como $prod) {
            If ($Prod != (int)$Prod) {
                Eco "\n";
                Eco "ERROR! El código de " . $Prod . " no es válido!\n" ;
                salida;
            }
        }
    }
    Eco "HECHO!";
}

Continuar leyendo >>

Conversión de xor, SHR y shl de Delphi para PHP

Yo estoy migrando un software hecho en Delphi para PHP y me encontré con un problema en un jodido Función de cifrado bendito.

Sufrí un poco tratar de reescribir la función hace a la complejidad del código y con las diferencias en los resultados.

La función hace uso de operadores XOR y SHR en la versión de Delphi. El SHR fue relativamente fácil gracias a la experiencia con operadores bit a bit y como documentación de Delfos dice que el operador tira de bits a la derecha

Continuar leyendo >>