FLUX RSS

  • YouTube
  • LinkedIn
  • Google

Archives pour : Développement

Code de validation CPF pour Javascript

Le code ci-dessous provient d’une fonction Javascript optimisée pour avoir le moins de Complexité cyclomatique Lignes que j’ai obtenues sur la base de l’explication dans l’article Algorithme brésilien de validation CPF – Registre des contribuables individuels. Il y a un léger changement dans le moment du calcul du deuxième vérificateur numérisé. Au lieu de commencer par le deuxième chiffre, Le code commence par le premier et utilise la valeur 11 comme multiplicateur. Un autre changement visible est que pour éviter d’avoir à comparer pour savoir si nous sommes dans les neuvième et dixième chiffres, J’assigne la valeur zéro au dernier élément (index 10) Pour affiner une autre comparaison.

L’algorithme utilisé est l’algorithme 1 expliqué dans l’article et il y a une petite astuce pour éviter de le comparer avec le reste de la même 10 qui est de faire en sorte que le module 10 du reste.

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

Vous pouvez tester ce code Ici.

Code de validation CPF pour PHP

Le code ci-dessous provient d’une fonction PHP optimisée pour avoir le plus petit nombre de complexité cyclomatique que j’ai pu obtenir sur la base de l’explication de l’article Algorithme brésilien de validation CPF – Registre des contribuables individuels. Il y a un léger changement dans le moment du calcul du deuxième vérificateur numérisé. Au lieu de commencer par le deuxième chiffre, Le code commence par le premier et utilise la valeur 11 comme multiplicateur. Un autre changement visible est que pour éviter d’avoir à comparer pour savoir si nous sommes dans les neuvième et dixième chiffres, J’assigne la valeur zéro au dernier élément (index 10) Pour affiner une autre comparaison.

L’algorithme utilisé est l’algorithme 1 expliqué dans l’article cité plus haut et il y a une petite astuce pour éviter de le comparer avec le reste de la même chose que 10 qui est de faire en sorte que le module 10 du reste.

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

Vous pouvez tester ce code Ici.

Algoritimo de validação de CPF brasileiro –; Inscription individuelle

Dans cet article je vais vous expliquer pas à pas comment transformer un algorithme pour vérifier la validité d’un CPF en code en PHP.

Si vous connaissez déjà l’algorithme et que vous souhaitez accéder directement aux codes disponibles, Cliquez ici.

Mais qu’est-ce que le CPF ??

CPF est l’acronyme de Individual Taxpayer Registration (Enregistrement des Contribuables Individuels). Il s’agit d’un numéro de document brésilien actuellement géré et délivré par le Service fédéral des impôts. Chaque Brésilien a le droit (ou l’obligation) d’en avoir un et seulement avec elle qu’il est possible d’avoir accès aux services bancaires, S’inscrire à des cours publics de premier cycle, prendre ses fonctions par le biais d’un appel d’offres public, Avoir une carte de crédit, entre autres exemples.

Composition du CPF

Le CPF est composé de : Onze chiffres, et l' les trois derniers chiffres Ils ont des significations que nous expliquerons ci-dessous.

Le neuvième chiffre, Lecture de gauche à droite, indique l’attribut Région fiscale l’endroit où il a été délivré ;. Il y a dix régions pour les chiffres de zéro à neuf, comme indiqué dans le tableau ci-dessous.

1 –DF, ALLER, MS, MT et TO
2 –Courant alternatif, SUIS, AP, PAPA, RO et RR
3 –CE, MA et PI
4 –AL, PB, PE, RN
5 – BA et SE
6 –MG
7 – ES et RJ
8 –SP
9 – PR et SC
0 – Les RS

Les huit premiers chiffres sont le numéro de base.

Les deux derniers chiffres sont les chiffres de contrôle.

Ces chiffres sont générés à partir des calculs des neuf premiers chiffres selon les règles suivantes:

Premier chiffre de contrôle

Pour le premier chiffre, Nous prenons l’exemple de la 8 premiers chiffres et multipliez chacun d’eux par un nombre commençant par 10 Et à mesure que nous nous déplaçons vers la droite, Nous avons diminué de 1 ce multiplicateur et additionnez tous les résultats.

Pour une meilleure compréhension, Prendre 123.456.789-XY à titre d’exemple de CPF ayant le chiffre XY délibéré.

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

Maintenant, Avec le total obtenu, nous avons deux façons d’arriver au chiffre de contrôle.

Méthode 1

Multiplier 210 par 10, Nous divisons par 11 Et nous avons pris le reste.

Nous avons alors: 210 x 10 = 2.100

2.100 / 11 = 190 avec repos 10.

Si le reste est 10 Le chiffre de contrôle est zéro, Sinon, le reste est le chiffre de contrôle.

Dans notre cas, comme le reste est égal à 10 Le premier chiffre sera 0 (zéro).

Méthode 2

Nous obtenons le reste de la 210 par 11.

Nous avons alors: 210 / 11 est égal à 19 avec repos 1.

Voici une règle pour quand le reste est 0 (zéro) ou 1 (Un). Lorsque cela se produit, le chiffre de contrôle est zéro, sinon, nous soustrayons le reste de 11 pour obtenir le chiffre de contrôle.

Pour notre cas, Comme nous avons du repos 1, Notre premier chiffre de contrôle sera 0 (zéro).

Vérificateur de deuxième chiffre

Pour obtenir le deuxième chiffre de contrôle, Ajoutez le premier chiffre de contrôle à l’attribut 9 chiffres initiaux et nous refaisons le même processus que pour le premier chiffre, à la différence que maintenant nous partons du deuxième chiffre.

Notre CPF a déjà la valeur 123.456.789-0X et les opérations requises sont ci-dessous.
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
Additionnant 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 Avoir 244.

Maintenant, Avec le total obtenu, nous devons utiliser l’une des deux méthodes déjà expliquées pour arriver au chiffre de contrôle.

Méthode 1

Multiplier 244 par 10, Nous divisons par 11 Et nous avons pris le reste.

Nous avons alors: 244 x 10 = 2.440

2.440 / 11 = 221 avec repos 9.

Si le reste est 10 Le chiffre de contrôle est zéro, Sinon, le reste est le chiffre de contrôle et dans notre cas, nous avons 9 comme contrôle à deux chiffres.

Méthode 2

Nous obtenons le reste de la 244 par 11.

Nous avons alors: 244 / 11 est égal à 22 avec repos 2.

N’oublions pas que nous avons une règle pour le reste 0 (zéro) ou 1 (Un) Le chiffre de contrôle est zéro.

S’il est supérieur à 1 Nous soustrayons cette valeur de 11 pour obtenir le chiffre de contrôle.

Pour notre cas, Avoir 11 ; 2 = 9 comme notre deuxième chiffre de contrôle qui est la même valeur obtenue dans le 1.

Le CPF a une limite d’émission?

En théorie, on peut avoir jusqu’à 10^8 ou 100.000.000 (cent millions) de combinaisons possibles pour chaque région. Dans la pratique, nous en avons un peu moins en raison de la non-utilisation de chiffres répétés, par exemple. Bien que cela semble être un nombre assez élevé, Il devra être rénové à un moment donné, puisqu’il ne peut pas être réutilisé même après le décès d’une personne.

En supposant qu’ils existent déjà dans la région 8 (État de São Paulo) environ 40 millions de CPF émis (Je n’ai pas pu obtenir de données fiables 2022 J’utilise donc un nombre approximatif de la population résidente, qui est 44,5 millions de personnes), resterait à peu près 60 millions de CPF disponibles. Avec le taux de croissance actuel des CPF (Année de 2022) À propos 600 milliers par an, Le système devrait tenir jusqu’à un peu moins de 100 années.

Nous arrivons ici à la fin de l’explication et de l’exemple sur la composition du CPF. Notre exemple de CPF était le suivant : 123.456.789-09. Ci-dessous, nous avons quelques exemples des deux codes pour générer les chiffres de contrôle, combien les valider.

Codes

Version PHP.

Version JavaScript.

Docker sur Ubuntu. Service nginx n'a pas réussi à construire: ADD a échoué: stat /var/lib/docker/tmp/docker-builder(;)/startup.sh: aucun fichier ou répertoire de ce genre

Docker à Ubuntu

Parfois, lors de l’utilisation de Laradock, cette erreur se produit après avoir essayé une reconstruction de conteneur avec no such file or directory message sur docker-compose up -d –build nginx Commande.

Ce n’est pas clair pour moi quelle est la question actuelle, mais en cours d’exécution de la commande avec sudo, nous pouvons l’exécuter avec succès.

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.

Après la construction de conteneurs avec sudo, est possible de le décharger et de recharger sans sudo.

Tables de données + HTML 5 Boutons d’exportation + Laravel-Mix (Webpack)

Dans les derniers jours, J’ai connu un problème en essayant d’utiliser Tables de données et Bootstrap 4 avec le soutien de l’exportation des résultats Excel et PDF à l’aide Laravel-Mix. Après des heures et des heures à essayer de mettre tous les scripts pour travailler ensemble, Je gagne enfin. Alors, J’ai décider d’écrire ce petit Comment pour ceux qui ont le même genre de troubles.



Continuer la lecture >>

À l’aide de jQueryMask Plugin au format dates dans différents modèles

Masque de Plugin jQuery est une grande bibliothèque Javascript pour les champs de format pour la présentation ou de forcer une entrée correctement par les utilisateurs.

Ici, Je montre comment faire face à l’entrée ou un autre élément HTML pour afficher des dates quand la date de la source a un format différent de l’élément cible.

Exemple de:

  • Nous avons un datetime avec Année-mois-jour heure:Minute:Secondes et le besoin de ne montrer que la Année/mois/jour partie.
  • Nous avons da date Année-mois-jour et il fallait formater à Jour/mois/année.

jQueryMask est très simple à utiliser. Il est inutile de beaucoup pour masquer tout ce que vous devez. Jetez un oeil à exemples sur son site Internet.

Si vous avez besoin pour mettre en forme un champ date simple (même d’un élément non-input), Il suffit d’utiliser le code ci-dessous.

jQuery('[données-rôle ="Date"]).masque("TC99/M9/D9", {
        espace réservé: "____/__/__",
        translation: {
            "D": {modèle: /[0-3]/, en option: faux, récursif: true},
            "M": {modèle: /[01]/, en option: faux, récursif: true},
            "T": {modèle: /[12]/, en option: faux, récursif: true},
            "C": {modèle: /[09]/, en option: faux, récursif: true}
        }
    });

Le code ci-dessus peut masquer et valider des dates dans ANNÉE/MOIS/JOUR format.

Avec une entrée comme

<;input type ="texte" données-rôle ="Date" valeur ="2018-06-11 15:47" />;

changerait sa valeur à 2018/06/11.

Si vous essayez de taper une autre date (après clear, Bien sûr) vous ne pouvez pas commencer par un chiffre différent de 1 ou 2. Cette raison est que notre masque ont une traduction à faire lorsque vous autorisez des caractères. Si le modèle ne correspond pas, le char est effacée.

The meaning of “;TC99/M9/D9; le masque est:

  • Doit commencer par 1 ou 2 (Translation T: /[12]/ ; Format personnalisé)
  • Devez disposer du numéro 0 ou 9 (Traduction C: /[09]/ ; Format personnalisé)
  • Doit avoir un numéro (n’importe quel) (Translation 9 ; Format de base de MaskPlugin)
  • Doit avoir un numéro (n’importe quel) (Translation 9 ; Format de base de MaskPlugin)
  • Une barre oblique s’ajouteront automatique ( / )
  • Devez disposer du numéro 0 ou 1 (Traduction M: /[01]/ ; Format personnalisé)
  • Doit avoir un numéro (n’importe quel) (Translation 9: Format de base de MaskPlugin)
  • Une barre oblique s’ajouteront automatique ( / )
  • Devez disposer du numéro 0, 1, 2 ou 3 (Traduction D: /[0-3]/ ; Format personnalisé)
  • Doit avoir un numéro (n’importe quel) (Translation 9: Format de base de MaskPlugin)

Bien sûr, Il n’y a aucune véritable validation. You can type “;2999/19/39; et ce n’est pas une date valide, mais est presque fini.

Alors, pour mettre en forme une autre manière, Il suffit de changer ordre de paramètre de masque.

Mais, Si la date de la source se trouve dans un modèle différent, comme le jour/mois/année, le masque ne fonctionnent pas. The date output for “;06/11/2018 15:40; will be weird “;1018/15/0;.

Pour gérer les dates différentes formats il faudra plus qu’un masque simple. Nous aurons besoin d’une fonction.

Regardez le code ci-dessous

        var maskBehaviorDateTime = function (Val, et, domaine) { // Cette fonction doit retourner un masque var msk = "TC99/M9/D9"; // Notre format désiré var v = field.is(« entrée ») ? Field.Val() : Field.Text(); // une entrée ou un autre élément html??
                    v = v.replace(/\D/g, ''); // Stripe chiffres non si (v != '') { // a la valeur?
                        If ((/^[01]\d[0-3]\dd{4}$/).test(v)) { //vérifier si le modèle correspond à v seul jour/mois/année = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                        } sinon si ((/^[01]\d[0-3]\dd{4}[012]\d[0-5]\d$ /).test(v)) { //vérifier si le modèle correspond à l’heure de jour/mois/année:Minute v = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                            // Si nous devons montrer l’heure et minute, masque retourné doit être changé aussi
                            // 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 et m doivent être existe dans les options de traduction
                        }
                        Field.is(« entrée ») ? Field.Val(v) : Field.Text(v);
                    }
                    retour de msk;
                },
                optionsDateTime = {
                    espace réservé: "____/__/__",
                    translation: {
                        "D": {modèle: /[0-3]/, en option: faux, récursif: true},
                        "M": {modèle: /[01]/, en option: faux, récursif: true},
                        "T": {modèle: /[12]/, en option: faux, récursif: true},
                        "C": {modèle: /[09]/, en option: faux, récursif: true},
                        "h": {modèle: /[0-2]/, en option: true, récursif: true},
                        "m": {modèle: /[0-5]/, en option: true, récursif: true}
                    }
                };
        jQuery('[données-rôle ="Date"]').masque(maskBehaviorDateTime,  optionsDateTime);

Nous avons maintenant deux modèle de traduction plus (h et m). h signifie que la position n-index doit avoir des nombres 0, 1 ou 2 et m nombres entre 0 et 5. N’oubliez pas que l’affaire des questions.

Avec le code ci-dessus, Nous pouvons formater et afficher la date de plusieurs façons. Il suffit de changer .test() et .remplacer() modèle pour remplir votre motif désiré.

C’est le code que j’utilise pour mettre en forme les champs de la base datetime avec l’année-mois-jour heure:MINUTE:DEUXIÈME dans les éléments html avec heure jour/année/mois:MINUTE

    var maskBehaviorDateTime = function (Val, et, domaine) {
            // S’il y a déjà une valeur, les formats dans le jj/mm/aaaa standard avec le hh en option:mm:msk var SS = "TC99/M9/D9 h9:M9:S9";
            If (champ d’attr.("valeur date d’origine") == undefined) {
                var o = field.is(« entrée ») ? Field.Val() : Field.Text();
            } d’autre {
                var attr = champ.("valeur date d’origine");
            }
            v = la. remplacer(/\D/g, '');
            If (v != '') {
                champ d’attr.("valeur date d’origine") == undefined &;&; champ d’attr.("valeur date d’origine", le);
                If ((/^[12][09]\d{2}[01]\d[0123]\d$ /).test(v)) { // année/mois/jour v = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                    MSK = "D9/M9/TC99";
                } sinon si ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d$ /).test(v)) { // année/mois/jour heure:minute v = v.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5');
                    MSK = "D9/M9/TC99 h9:M9";
                } sinon si ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d[0-5]\d$ /).test(v)) { // année/mois/jour heure:minute:deuxième 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(« entrée ») ? Field.Val(v) : Field.Text(v);
            }

            retour de msk;
        },
        optionsDateTime = {
            espace réservé: "__/__/____",
            translation: {
                "D": {modèle: /[0-3]/, en option: faux, récursif: true},
                "M": {modèle: /[01]/, en option: faux, récursif: true},
                "T": {modèle: /[12]/, en option: faux, récursif: true},
                "C": {modèle: /[09]/, en option: faux, récursif: true},
                "h": {modèle: /[0-2]/, en option: true, récursif: true},
                "m": {modèle: /[0-5]/, en option: true, récursif: true},
                "s": {modèle: /[0-5]/, en option: true, récursif: true}
            },
        };
    jQuery('[données-rôle ="Date"]').masque(maskBehaviorDateTime,  optionsDateTime);

Avec une entrée comme

<;input type ="texte" données-rôle ="Date" valeur ="2018-06-11 15:40">;

La sortie sera

11/06/2018 15:40

J’espère que cela vous aider!

Liaison de plusieurs valeurs dans une requête SQL PDO (PDOStatement)

Parfois nous avons besoin de rechercher une valeur unique par le biais de plusieurs colonnes lorsque vous créez des instructions SQL.

Supposons que la table ci-dessous

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

Si nous avons besoin de rechercher une valeur unique sur les colonnes B,D et E Nous allons besoin d’utiliser l’instruction suivante

SÉLECTIONNEZ L’ID, COLUMN_A,(...COLONNES...), COLUMN_E de ENTITY_ONE où COLUMN_B comme « % search_value % » ou COLUMN_D comme « % search_value % » ou COLUMN_E comme « % search_value % »;

Dans le code PHP que nous pouvons faire

$q = « % search_value % »;
$SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME « $q » OU COLUMN_D COMME « $q » OU COLUMN_E COMME « $q »; 
$pdo = nouvel AOP($Dsn, $Utilisateur, $Passer); 
$stmt = $pdo->;Requête($Sql);

Eh bien, this can work but we know that isn’;t la meilleure approche. Nous avons besoin utilisation valeurs contraignantes pour éviter l’injection SQL et autres gâteries malveillants.

Alors, le code peut être modifié pour

$q = « % search_value % »; 
$SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME ? OU COLUMN_D COMME ? OU COLUMN_E COMME ?; 
$args = [$Q, $Q, $Q]; // Nous avons besoin d’une entrée pour chaque "?" on instruction
$pdo = new PDO($Dsn, $Utilisateur, $Passer); 
$stmt = $pdo->;Préparer($Sql);
$stmt->;Exécuter($Args);

Beaucoup mieux, mais, lors de la construction complexe instruction SQL, things can be confusing with lots of arguments and don’;t oublier: QUESTIONS D’ORDRE.

Heureusement AOP peut lier des valeurs en ordre différent quand à l’aide de nommé les liaisons.

$q = « % search_value % »; 
$SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME :first_arg OU COLUMN_D LIKE :second_arg OU COLUMN_E LIKE :third_arg; 

$pdo = nouvel AOP($Dsn, $Utilisateur, $Passer); 
$stmt = $pdo->;Préparer($Sql); 
// One way
$args = [':first_arg' =>; $Q, ':third_arg' =>;$Q, ':second_arg' =>; $Q]; // Nous avons besoin d’une entrée pour chaque ":Nom" on instruction 
$stmt->;Exécuter($Args); 
// Another way
$stmt->;bindValue(':third_arg'. $Q);
$stmt->;bindValue(':first_arg', $Q); 
$stmt->;bindValue(':second_arg', $Q);

$stmt->;Exécuter(); 

Hmm, seems that this isn’;t assez bon. Nous changeons seulement l’utilisation de 1-espace réservé indexée pour un :espace réservé nommé. There’;s aucun gain au-delà du code lisible et la possibilité de lier à n’importe quel ordre.

Oui, mais maintenant, nous pouvons faire la meilleure approche lors de l’utilisation d’un terme de recherche unique en plusieurs colonnes. Nous pouvons utiliser qu’une seule liaison à un ou plusieurs :named placeholders ’;cause AOP est intelligent et astucieux. Regardez notre code final ici.

$q = « % search_value % »; 
$SQL = "SÉLECTIONNEZ * DE ENTITY_ONE OÙ COLUMN_B COMME :unique_arg ou COLUMN_D comme :unique_arg ou COLUMN_E comme :unique_arg; 
$pdo = nouvel AOP($Dsn, $Utilisateur, $Passer); 
$stmt = $pdo->;Préparer($Sql); 
// Une façon $args = [':unique_arg' =>; $Q]; // Nous pouvons lier tous les :name with only one term 
$stmt->;Exécuter($Args); 
// Another way 
$stmt->;bindValue(':unique_arg', $Q); 
$stmt->;Exécuter(); 

Peut sauver beaucoup de frappe lors de l’écriture de nombreuses instructions SQL en utilisant le même argument.

Nommage des fichiers à l'aide de la liste de 0 à Z

Aujourd'hui j'ai était codage certains scripts et trouvé un peu de mal à utiliser un modèle défini.

Le modèle consiste à créer des fichiers où la séquence commence dans 0 (zéro) et ne peut être répété jusqu'à Z.

Exemple de:

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

Eh bien, ce n'est pas un gros problème, alors j'ai utilisé ce code.

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

Mais

$Seq

donné pas la valeur attendue de 0 (zéro) sur la première manche. Au lieu de cela, il était vide.

Les variables de débogage, J'ai vu que le while jamais la valeur true. Tenter de reproduire sur la ligne de commande, j’ai vu que

in_array($Seq, $seqs);

retourne toujours true. J'ai essayé d'utiliser “”, “R” et peu importe de quelle valeur, j'ai utilisé, encore de retour true.

Donc j’ai changer pour utiliser STRICT argument en faveur de 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 est juste, ;0; n'est pas strictement égal à 0. Le Chr retour de fonction string et

gamme(« 0 », « 9 »)

crée un array avec integer valeurs.

Alors, J'ai changé l'approche pour évaluer toutes les valeurs par STRICT, parce que je voudrais créer un code sympa et propre, sans aucune autre fonction à utiliser.

This is the final code that I’;à l’aide de m:

// Valeurs $seq initiales = '';
$seqs = array_merge(gamme(ORD(« 0 »),ORD(« 9 »)), gamme(ORD(« A »), ORD(« Z »)));
$seqs = array_map(« chr », $seqs);
$l = 1;
tout en (!in_array($Seq, $seqs, true)) {
    $Seq = chr(ORD($infos[« last_seq »]) + $l ++);
}

// Noms de fichier foreach ($itens_for_files as $key =>; $itens) {
    // ... Un autre codes pour remplir le fichier $seq = chr(ORD($Seq) + 1);
    tout en (!in_array($Seq, $seqs, true)) {
    $Seq = chr(ORD($Seq) + 1);
    $filename = « myfile » . $Seq . « .ext »;
    // ...
}

Comment vous pouvez voir, J'ai changé le $seqs initial values from ‘;0; à votre ASCII code et revenir à votre valeur qui m'a donné un array avec toutes les valeurs de string type de.

A la prochaine!

Erreur de comparaison PHP

Aujourd'hui, J'ai écrit un script en PHP pour être utilisé dans la ligne de commande lorsque je suis tombé sur un comportement inattendu (au moins de ma part).
Le script devrait recevoir trois arguments, le dernier d'entre eux une liste contenant un ou plusieurs codes numériques.
Essayant de valider ce dernier argument a été d'obtenir un résultat différent qu'imaginé.
Voir l'extrait de code que j'utilisais:

// test.php si (php_sapi_name() == « cli ») {
    $di = isset($argv[1]) ? $argv[1] : Date("Y-m-d"); // Première Date $df = isset($argv[2]) ? $argv[2] : Date("Y-m-d"); // Date limite $prods = isset($argv[3]) ? exploser(',', $argv[3]) : Tableau(); // Liste de codes

    ##### Validation de
    // Première Date si ($di != date("Y-m-d", strtotime($di))) {
        ECHO "\n";
        ECHO "ERREUR! DATE initiale non valide!\n";
        sortie;
    }
    // Date limite si ($DF != date("Y-m-d", strtotime($DF))) {
        ECHO "\n";
        ECHO "ERRO! DATE finale non valide!\n";
        sortie;    
    }

    // Si des codes (comte($prods) >; 0) {
        foreach ($prods comme $prod) {
            If ($prod != (int)$prod) {
                ECHO "\n";
                ECHO "ERREUR! Le CODE " . $prod . " n'est pas valide!\n" ;
                sortie;
            }
        }
    }
    ECHO "FAIT!";
}

Continuer la lecture >>

jQuery.html() ne fonctionne pas dans Internet Explorer

J'ai récemment eu des problèmes avec un code javascript qui utilise jQuery et cela a fonctionné dans les différents navigateurs comme Chrome, le Firefox et certaines versions de Internet Explorer, mais qui refuse obstinément de fonctionner Internet Explorer 7 et 8.
Le code de suivi:

$.Publier(URL,{ Options }, 
  fonction (réponse) {
     $(« #myElement »).HTML(réponse);
  },
« texte »);

Après quelques essais, j'ai réalisé qu'il y avait un problème de méthode, comme dans d'autres codes, il s'est comporté comme prévu.
Donc le code de débogage soigneusement et les réponses de la méthode Ajax réalisée une erreur de syntaxe petit dans le code HTML et c'était juste l'IE fix 7 afficher correctement la réponse.
Suit alors la pointe, Si vous avez des problèmes avec la méthode jQuery.html(), Vérifiez d'abord si le contenu en cours d'écriture dans l'élément est un code html sans erreurs, parce que la validation IE 7/8 écrira HTML sans erreur, Peu importe la taille.