RSS

  • YouTube
  • LinkedIn
  • Google

Archivos de la : Desarrollo

Código de validación CPF para Javascript

O código abaixo é de uma função em Javascript otimizada para ter o menor numero de Complejidad ciclomática líneas que obtuve basadas en 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 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.

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);
}

Puede probar este código aquí.

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

Algoritimo de validação de CPF brasileiro –; Registro Individual

En este artículo explicaré paso a paso en la transformación de un algoritmo para verificar la validez de un CPF a código en PHP.

Si ya conoces el algoritmo y quieres ir directamente a los códigos disponibles, Haga clic aquí.

Pero, ¿qué es el CPF??

CPF es el acrónimo de Registro Individual. Es una serie de documentos brasileños actualmente administrados y emitidos por el Servicio de Impuestos Internos. Todo brasileño tiene derecho a (o deber) Para tener uno y solo con él es posible tener acceso a servicios bancarios, Inscribirse en cursos públicos de pregrado, Asumir el cargo a través de licitación pública, tienen tarjeta de crédito, entre otros ejemplos.

Composición de la ACB

La ACB está compuesta por: once dígitos, y el Últimos tres dígitos tienen significados que explicaremos a continuación.

El noveno dígito, Lectura de izquierda a derecha, indica el Región Fiscal dónde se expidió. Hay diez regiones para los dígitos de cero a nueve, como se muestra en la tabla siguiente..

1 –Df, Ir, Sra., MT y TO
2 –Corriente alterna, AM, Ap, Papá, RO y RR
3 –EC, MA y PI
4 –AL, Pb, Pei, Rn
5 - BA y SE
6 –Mg
7 - ES y RJ
8 –Sp
9 - PR y SC
0 - RS

Los primeros ocho dígitos son el número base.

Los dos últimos dígitos son los dígitos de pago.

Estos dígitos se generan a partir de cálculos de los primeros nueve dígitos de acuerdo con las siguientes reglas::

Comprobador de primer dígito

Para el primer dígito, Tomamos el 8 primeros dígitos y multiplicar cada uno de ellos por un número iniciado en 10 y la medida en que estamos avanzando hacia la derecha, disminuimos en 1 este multiplicador y sumamos todos los resultados.

Para una mejor comprensión, Tomar 123.456.789-XY como ejemplo de CPF para tener el dígito XY intencionado.

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
Agregar 10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 Have 210.

Ahora, Con el total obtenido tenemos dos formas de llegar al verificador de dígitos.

Método 1

Multiplicar 210 por 10, Dividimos por 11 y nos llevamos el resto.

Entonces tenemos: 210 x 10 = 2.100

2.100 / 11 = 190 con descanso 10.

Si el resto es 10 El dígito de control es cero, de lo contrario, El resto es el dígito del verificador.

En nuestro caso, como el resto es igual a 10 El primer dígito será 0 (cero).

Método 2

Obtenemos el resto de la 210 por 11.

Entonces tenemos: 210 / 11 es igual a 19 con descanso 1.

Aquí tenemos una regla para cuando el resto es 0 (cero) o 1 (Uno). Cuando esto sucede, el dígito de control es cero, de lo contrario restamos el resto de 11 Para obtener el dígito del verificador.

Para nuestro caso, como tenemos descanso 1, Nuestro primer verificador de dígitos será 0 (cero).

Comprobador de segundos dígitos

Para obtener el comprobador de segundos dígitos, Agregamos el primer verificador de dígitos al 9 dígitos iniciales y volvemos a hacer el mismo proceso hecho para el primer dígito, con la diferencia de que ahora partimos del segundo dígito.

Nuestro CPF ya tiene el valor 123.456.789-0X y las operaciones necesarias están a continuación.
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
Agregar 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 Have 244.

Ahora, Con el total obtenido debemos utilizar una de las dos formas ya explicadas para llegar al dígito de control.

Método 1

Multiplicar 244 por 10, Dividimos por 11 y nos llevamos el resto.

Entonces tenemos: 244 x 10 = 2.440

2.440 / 11 = 221 con descanso 9.

Si el resto es 10 El dígito de control es cero, de lo contrario, El resto es el dígito verificador y en nuestro caso tenemos 9 como verificador de segundos dígitos.

Método 2

Obtenemos el resto de la 244 por 11.

Entonces tenemos: 244 / 11 es igual a 22 con descanso 2.

Recordando que tenemos una regla para cuando el resto es 0 (cero) o 1 (Uno) El dígito de control es cero.

Si es mayor que 1 Resta este valor de 11 Para obtener el dígito del verificador.

Para nuestro caso, Have 11 ; 2 = 9 como nuestro verificador de segundos dígitos que es el mismo valor obtenido en el método 1.

CPF tiene un límite para emitir?

Teóricamente, podemos tener hasta 10^8 o 100.000.000 (Cien millones) Combinaciones posibles para cada región. En la práctica tenemos un poco menos debido al no uso de dígitos repetidos, por ejemplo. Aunque parece un número bastante grande, Debería ser renovado en algún momento, ya que no se puede reutilizar incluso cuando una persona muere.

Suponiendo que ya existan en la región 8 (estancia en São Paulo) aproximadamente 40 millones de CPF emitidos (No pude obtener datos confiables en 2022 Así que estoy usando un número aproximado de la población residente que es de 44,5 millones de personas), quedaría aproximadamente 60 millones de CPF disponibles. Con la tasa de crecimiento actual de los CPF (año de 2022) en aproximadamente 600 mil al año, El sistema debe mantenerse justo por debajo de 100 años.

Venimos aquí al final de la explicación y el ejemplo sobre la composición de la ACB. Nuestra muestra CPF fue 123.456.789-09. A continuación tenemos algunos ejemplos de códigos tanto para generar los dígitos de checkout, cuánto validarlos.

Códigos

Versión PHP.

Versión JavaScript.

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

Utilizando jQueryMask Plugin para formato de fechas en diferentes patrones

jQuery Plugin de máscara es una gran librería de Javascript para campos del formato para la presentación de o para forzar una entrada adecuadamente por los usuarios.

Aquí, Se muestra cómo hacer frente a la entrada o un elemento HTML para mostrar las fechas cuando la fecha de la fuente tiene un formato diferente del elemento de destino.

Ejemplo:

  • Tenemos una fecha y hora con Año-mes-día hora:Minutos:Segundos y tiene que mostrar sólo el Día de mes de año parte.
  • Tenemos da fecha de Año-mes-día y necesidad de dar formato a Día/mes/año.

jQueryMask es muy fácil de usar. No necesita mucho para enmascarar todo lo que necesites. Echa un vistazo a los ejemplos en su sitio de Internet.

Si necesita dar formato a un campo de fecha simple (incluso en un elemento input no), sólo tiene que utilizar el código siguiente.

jQuery('[datos de papel ="fecha"]).máscara("TC99/M9/D9", {
        marcador de posición: "____/__/__",
        traducción: {
            "D": {patrón de: /[0-3]/, opcional: falso, recursiva: true},
            "M": {patrón de: /[01]/, opcional: falso, recursiva: true},
            "T": {patrón de: /[12]/, opcional: falso, recursiva: true},
            "(C)": {patrón de: /[09]/, opcional: falso, recursiva: true}
        }
    });

El código anterior puede enmascarar y validar previamente las fechas en DÍA DE MES DE AÑO formato.

Con una entrada como

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

cambiar su valor a 2018/06/11.

Si intenta escribir otra fecha (después de borrar, Claro) usted no puede comenzar con un número diferente de 1 o 2. Esta razón es que nuestra máscara tiene una traducción a hacer al permitir caracteres. Si el patrón no coincide con, se borra el char.

The meaning of “;TC99/M9/D9; la máscara es:

  • Debe comenzar con 1 o 2 (Traducción de T: /[12]/ ; Formato personalizado)
  • Debe tener número de 0 o 9 (Traducción C: /[09]/ ; Formato personalizado)
  • Debe tener un número (cualquier) (Traducción 9 ; Formato de base de MaskPlugin)
  • Debe tener un número (cualquier) (Traducción 9 ; Formato de base de MaskPlugin)
  • Una barra se agregará en automático ( / )
  • Debe tener número de 0 o 1 (Traducción de M: /[01]/ ; Formato personalizado)
  • Debe tener un número (cualquier) (Traducción 9: Formato de base de MaskPlugin)
  • Una barra se agregará en automático ( / )
  • Debe tener número de 0, 1, 2 o 3 (Traducción D: /[0-3]/ ; Formato personalizado)
  • Debe tener un número (cualquier) (Traducción 9: Formato de base de MaskPlugin)

Claro, no hay ninguna validación real. You can type “;2999/19/39; y esto no es una fecha válida, pero está casi listo.

Por lo tanto, formatear de otra manera, cambiar orden de parámetro de máscara.

Pero, Si la fecha de la fuente en un diverso patrón, como día/mes/año, la máscara no funcionan. The date output for “;06/11/2018 15:40; will be weird “;1018/15/0;.

Para manejar fecha diferentes formatos se necesitará más que sencilla mascarilla. Necesitamos una función.

Ver el código de abajo

        var maskBehaviorDateTime = function (Val, y, campo) { // Esta función debe devolver una máscara var msk = "TC99/M9/D9"; // Nuestro formato deseado var v = field.is('input') ? Field.Val() : Field.Text(); // es una entrada o elemento html otro??
                    v = v.replace(/\D/g, ''); // Si la raya no dígitos (v != '') { // tiene valor?
                        If ((/^[01]\d[0-3]\dd{4}$/).prueba(v)) { //comprobar si el patrón coincide con v sólo mes/día/año = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                        } if else ((/^[01]\d[0-3]\dd{4}[012]\d[0-5]\d$ /).prueba(v)) { //prueba si el patrón coincide con día/mes/año hora:Minuto v = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                            // Si necesitamos Mostrar la hora y minutos, máscara devuelta debe cambiarse también
                            // v = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5');
                            // MSK = ' h9 TC99/M9/D9:M9'; // h y m deben ser existe en opciones de traducción
                        }
                        Field.is('input') ? Field.Val(v) : Field.Text(v);
                    }
                    volver msk;
                },
                optionsDateTime = {
                    marcador de posición: "____/__/__",
                    traducción: {
                        "D": {patrón de: /[0-3]/, opcional: falso, recursiva: true},
                        "M": {patrón de: /[01]/, opcional: falso, recursiva: true},
                        "T": {patrón de: /[12]/, opcional: falso, recursiva: true},
                        "(C)": {patrón de: /[09]/, opcional: falso, recursiva: true},
                        "h": {patrón de: /[0-2]/, opcional: true, recursiva: true},
                        "m": {patrón de: /[0-5]/, opcional: true, recursiva: true}
                    }
                };
        jQuery('[datos de papel ="fecha"]').máscara(maskBehaviorDateTime,  optionsDateTime);

Ahora tenemos dos más patrón de traducción (h y m). h significa que la posición de índice n debe tener números 0, 1 o 2 y m números entre 0 y 5. Tenga en cuenta que caso importa.

Con el código anterior, podemos dar formato y Mostrar fecha en varias formas. solo tienes que cambiar .prueba() y .Vuelva a colocar() patrón para llenar su patrón deseado.

Este es el código que estoy utilizando para dar formato a campos de datetime de la base de datos año-mes-día hora:MINUTOS:En segundo lugar en los elementos html con hora del día, año y mes:MINUTOS

    var maskBehaviorDateTime = function (Val, y, campo) {
            // Si ya existe un valor, los formatos en el dd/mm/aaaa estándar con el hh opcional:mm:SS var msk = "H9 de TC99/M9/D9:M9:S9";
            If (campo de atributos.("valor de la fecha original") == undefined) {
                var o = field.is('input') ? Field.Val() : Field.Text();
            } otra cosa {
                var atributos = campo.("valor de la fecha original");
            }
            v = el. reemplazar(/\D/g, '');
            If (v != '') {
                campo de atributos.("valor de la fecha original") == undefined &;&; campo de atributos.("valor de la fecha original", el);
                If ((/^[12][09]\d{2}[01]\d[0123]\d$ /).prueba(v)) { // día de mes de año v = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                    MSK = "D9/M9/TC99";
                } if else ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d$ /).prueba(v)) { // año/mes/día 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";
                } if else ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d[0-5]\d$ /).prueba(v)) { // año/mes/día hora:minutos:v segundo = 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('input') ? Field.Val(v) : Field.Text(v);
            }

            volver msk;
        },
        optionsDateTime = {
            marcador de posición: "__/__/____",
            traducción: {
                "D": {patrón de: /[0-3]/, opcional: falso, recursiva: true},
                "M": {patrón de: /[01]/, opcional: falso, recursiva: true},
                "T": {patrón de: /[12]/, opcional: falso, recursiva: true},
                "(C)": {patrón de: /[09]/, opcional: falso, recursiva: true},
                "h": {patrón de: /[0-2]/, opcional: true, recursiva: true},
                "m": {patrón de: /[0-5]/, opcional: true, recursiva: true},
                "s": {patrón de: /[0-5]/, opcional: true, recursiva: true}
            },
        };
    jQuery('[datos de papel ="fecha"]').máscara(maskBehaviorDateTime,  optionsDateTime);

Con una entrada como

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

La salida será

11/06/2018 15:40

Esto ayudará a esperanza!

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

jQuery.html() no funciona en Internet Explorer

Recientemente tuve problemas con un código javascript que utiliza jQuery y trabajó en varios navegadores como Cromo, el Firefox y algunas versiones de Internet Explorer, pero que obstinadamente se negaron a trabajar Internet Explorer 7 y 8.
Siga el código:

$.Exponer(URL,{ Opciones }, 
  función (respuesta) {
     $('#myElement').HTML(respuesta);
  },
'texto');

Después de algunas pruebas me di cuenta que había un problema de método, como en otros códigos se comportó como se esperaba.
Así depurar código de fondo y las respuestas del método Ajax se dio cuenta de un error de sintaxis pequeño en el HTML y es solo el fix IE 7 muestra correctamente la respuesta.
A continuación, la punta, Si tienes problemas con el método jQuery.html(), en primer lugar verificar si el contenido en el elemento es un código html sin errores, porque la validación IE 7/8 escribir HTML sin error, No importa lo pequeño.