RSS

  • YouTube
  • LinkedIn
  • Google

Archiv nach dem Monat : Desenvolvimento

CPF-Validierungscode für Javascript

O código abaixo é de uma função em Javascript otimizada para ter o menor numero de Zyklomatische Komplexität Zeilen, die ich basierend auf der Erklärung im Artikel erhalten habe Brasilianische CPF-Validierungsmethode - Individuelle Registrierung. Es hat eine leichte Änderung zum Zeitpunkt der Berechnung des zweiten digitalisierten Testers. Anstatt mit der zweiten Ziffer zu beginnen, Der Code beginnt mit dem ersten und verwendet den Wert 11 als Multiplikator. Eine weitere bemerkenswerte Änderung besteht darin, dass wir nicht vergleichen müssen, um zu wissen, ob wir uns in der neunten und decimo Ziffer befinden., Ich weise dem letzten Element den Wert Null zu (Index 10) um einen weiteren Vergleich zu reduzieren.

Der verwendete Algorithmus ist der 1 erklärt im Artikel und es gibt einen kleinen Trick, um zu vermeiden, mit dem Rest gleich zu vergleichen 10 die das Modul machen soll 10 des Restes.

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

Sie können diesen Code testen Hier.

CPF-Validierungscode für PHP

Der folgende Code ist eine PHP-Funktion, die optimiert ist, um die kleinste Anzahl von zyklomatischer Komplexität zu haben, die ich basierend auf der Erklärung im Artikel Brasilianische CPF-Validierungsmethode - Individuelle Registrierung. Es hat eine leichte Änderung zum Zeitpunkt der Berechnung des zweiten digitalisierten Testers. Anstatt mit der zweiten Ziffer zu beginnen, Der Code beginnt mit dem ersten und verwendet den Wert 11 als Multiplikator. Eine weitere bemerkenswerte Änderung besteht darin, dass wir nicht vergleichen müssen, um zu wissen, ob wir uns in der neunten und decimo Ziffer befinden., Ich weise dem letzten Element den Wert Null zu (Index 10) um einen weiteren Vergleich zu reduzieren.

Der verwendete Algorithmus ist der 1 erklärt in dem zuvor zitierten Artikel und es gibt einen kleinen Trick, um zu vermeiden, mit dem Rest gleich zu vergleichen 10 die das Modul machen soll 10 des Restes.

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

Sie können diesen Code testen Hier.

Algoritimo de validação de CPF brasileiro –; Individuelle Anmeldung

In diesem Artikel werde ich Schritt für Schritt die Transformation eines Algorithmus erklären, um die Gültigkeit eines CPF zu Code in PHP zu verifizieren.

Wenn Sie den Algorithmus bereits kennen und direkt zu den verfügbaren Codes gehen möchten, Klicken Sie hier.

Aber was ist die CPF?

CPF ist die Abkürzung für Individual Registration. Es handelt sich um eine Reihe brasilianischer Dokumente, die derzeit vom Internal Revenue Service verwaltet und herausgegeben werden.. Jeder Brasilianer hat das Recht auf (oder Pflicht) Um einen und nur damit zu haben, ist es möglich, Zugang zu Bankdienstleistungen zu haben, Einschreibung in öffentliche Bachelor-Studiengänge, Amtsantritt durch öffentliche Ausschreibung, Kreditkarte haben, u.a. Beispiele.

Zusammensetzung des CPF

Das CPF setzt sich zusammen aus elfstellig, Und die Die letzten drei Ziffern Bedeutungen haben, die wir unten erklären werden.

Die neunte Ziffer, Lesen von links nach rechts, gibt die Steuerregion wo es ausgestellt wurde. Es gibt zehn Regionen für die Ziffern von null bis neun, wie in der folgenden Tabelle gezeigt..

1 –DF, LOS, FRAU, MT und TO
2 –WECHSELSTROM, BIN, AP, PAPA, RO und RR
3 –EG, MA und PI
4 –AL, PB, PE, RN
5 - BA und SE
6 –MG
7 - ES und RJ
8 –SP
9 - PR und SC
0 - RS

Die ersten acht Ziffern sind die Basisnummer.

Die letzten beiden Ziffern sind die Checkout-Ziffern.

Diese Ziffern werden aus Berechnungen der ersten neun Ziffern nach folgenden Regeln generiert:

Erste Ziffernprüfung

Für die erste Ziffer, Wir nahmen die 8 erste Ziffern und multiplizieren Sie jede von ihnen mit einer Zahl, die in 10 und das Ausmaß, in dem wir nach rechts vorrücken, Wir verringern uns in 1 Dieser Multiplikator und wir addieren alle Ergebnisse.

Zum besseren Verständnis, Nehmen 123.456.789-XY als Beispiel für CPF, um die Ziffer zu haben XY absichtlich.

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

Jetzt, Mit der erhaltenen Summe haben wir zwei Möglichkeiten, zum Ziffernprüfer zu gelangen.

Methode 1

Multiplizieren 210 bis 10, Wir teilen durch 11 und wir nahmen den Rest.

Wir haben dann: 210 x 10 = 2.100

2.100 / 11 = 190 mit Ruhe 10.

Wenn der Rest ist 10 Die Prüfziffer ist Null, Andernfalls, Der Rest ist die Prüfziffer.

In unserem Fall, da der Rest gleich ist 10 Die erste Ziffer lautet 0 (0 (null)).

Methode 2

Wir bekommen den Rest der 210 bis 11.

Wir haben dann: 210 / 11 ist gleich 19 mit Ruhe 1.

Hier haben wir eine Regel, wann der Rest ist 0 (0 (null)) oder 1 (Eins). In diesem Fall ist die Prüfziffer 0 (null), Andernfalls ziehen wir den Rest der 11 So erhalten Sie die Prüfziffer.

Für unseren Fall, wie wir Ruhe haben 1, Unser erster Ziffernprüfer ist 0 (0 (null)).

Zweiter Ziffernprüfer

So rufen Sie die Überprüfung der zweiten Ziffer ab, Wir fügen den ersten Ziffernprüfer zum 9 Anfangsziffern und wir machen wieder den gleichen Prozess für die erste Ziffer, mit dem Unterschied, dass wir jetzt von der zweiten Ziffer beginnen.

Unser CPF hat bereits den Wert 123.456.789-0X und die erforderlichen Operationen sind unten.
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
Addierend 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 Haben 244.

Jetzt, Mit der erhaltenen Summe sollten wir einen der beiden bereits erläuterten Wege verwenden, um zur Prüfziffer zu gelangen.

Methode 1

Multiplizieren 244 bis 10, Wir teilen durch 11 und wir nahmen den Rest.

Wir haben dann: 244 x 10 = 2.440

2.440 / 11 = 221 mit Ruhe 9.

Wenn der Rest ist 10 Die Prüfziffer ist Null, Andernfalls, Der Rest ist die Prüfziffer und in unserem Fall haben wir 9 als Second Digit Checker.

Methode 2

Wir bekommen den Rest der 244 bis 11.

Wir haben dann: 244 / 11 ist gleich 22 mit Ruhe 2.

Denken Sie daran, dass wir eine Regel haben, wann der Rest ist 0 (0 (null)) oder 1 (Eins) Die Prüfziffer ist Null.

Wenn es größer ist als 1 Subtrahieren Sie diesen Wert von 11 So erhalten Sie die Prüfziffer.

Für unseren Fall, Haben 11 ; 2 = 9 als unser zweiter Ziffernprüfer, der den gleichen Wert hat, der in der Methode erhalten wurde 1.

CPF hat ein Limit für die Ausgabe?

Theoretisch, Wir können bis zu 10 ^ 8 oder 100.000.000 (Hundert Millionen) Kombinationsmöglichkeiten für jede Region. In der Praxis haben wir etwas weniger durch den Verzicht auf wiederholte Ziffern, zum Beispiel. Obwohl es wie eine ziemlich große Zahl aussieht, Es sollte irgendwann renoviert werden, da es nicht wiederverwendet werden kann, auch wenn eine Person stirbt.

Angenommen, sie existieren bereits in der Region 8 (übernachten in São Paulo) ungefähr 40 Millionen von ausgegebenen CPFs (Ich konnte keine zuverlässigen Daten in 2022 Ich verwende also eine ungefähre Zahl der Wohnbevölkerung, die von 44,5 Millionen von Menschen), würde ungefähr übrig bleiben 60 Millionen von CPFs verfügbar. Mit der aktuellen Wachstumsrate der CPFs (Jahr von 2022) in über 600 Tausend pro Jahr, Das System sollte knapp unter 100 Jahre.

Wir kommen hier am Ende der Erklärung und des Beispiels zur Zusammensetzung des CPF. Unser Beispiel CPF war 123.456.789-09. Im Folgenden finden Sie einige Beispiele für Codes, um die Checkout-Ziffern zu generieren, Wie viel sie zu validieren sind.

Codes

Version PHP.

Version JavaScript.

Docker auf Ubuntu. Dienst nginx konnte nicht erstellt werden: ADD fehlgeschlagen: stat /var/lib/docker/tmp/docker-builder(;)/startup.sh: keine solche Datei oder ein solches Verzeichnis

Docker in Ubuntu

Manchmal, bei Verwendung von Laradock, Dieser Fehler tritt auf, nachdem Sie einen Containerneuaufbau mit no such file or directory Nachricht auf docker-compose up -d –build nginx Befehl.

Mir ist nicht klar, worum es jetzt geht., aber das Ausführen des Befehls mit sudo, wir können es erfolgreich führen.

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.

Nach dem Bau von Containern mit sudo, ist es möglich, es zu entladen und neu zu laden, ohne sudo.

DataTables + HTML 5 Export-Buttons + Laravel-Mix (Webpack)

In den letzten Tagen, Ich habe ein Problem versucht, verwenden Sie erlebt. DataTables und Bootstrap 4 mit Unterstützung für den Export der Ergebnisse Excel und PDF-DATEI mit Hilfe Laravel-Mix. Nach Stunden und Stunden damit, alle Skripte zur Zusammenarbeit zu setzen, Ich Gewinne schließlich. Also, Ich beschließe, dieses kleine schreiben So wird es gemacht für diejenigen mit derselben Art von Schwierigkeiten.



Lesen Sie weiter >>

Verwendung von jQueryMask Plugin in Format Datumsangaben in verschiedenen Mustern

jQuery Plugin Maske ist eine große Javascript-Bibliothek, Formatfelder für Präsentation und/oder eine richtig Eingabe Erzwingen von Benutzern.

Hier, Ich zeige, wie Eingaben können oder eine andere HTML-Element anzuzeigende Daten wann die Quelle hat eines anderen Format als Zielelement.

Beispiel:

  • Wir haben eine Datetime mit Jahr-Monat-Tag-Stunde:Minute:Sekunden und müssen nur die Jahr/Monat/Tag Teil.
  • Wir haben da Datum in Jahr-Monat-Tag und Notwendigkeit zu formatieren Tag/Monat/Jahr.

jQueryMask ist sehr einfach zu bedienen. Sie brauchen nicht zu viel zu verbergen, was Sie brauchen. Schauen Sie sich Beispiele auf seiner website.

Benötigen Sie ein einfaches Datum-Feld formatieren (auch in einem nicht-Input-element), benutzen Sie einfach den Code unten.

jQuery('[Daten-Rolle ="Datum"]).Maske("TC99/M9/D9", {
        Platzhalter: "____/__/__",
        Übersetzung: {
            "D": {Muster: /[0-3]/, optional: falsch, rekursive: wahr},
            "M": {Muster: /[01]/, optional: falsch, rekursive: wahr},
            "T": {Muster: /[12]/, optional: falsch, rekursive: wahr},
            "(C)": {Muster: /[09]/, optional: falsch, rekursive: wahr}
        }
    });

Der obige Code kann Maske und Termine im Pre zu validieren JAHR/MONAT/TAG Format.

Mit einem Eingang wie

<;input Type ="Text" Daten-Rolle ="Datum" Wert ="2018-06-11 15:47" />;

würde zu seinem Wert geändert werden 2018/06/11.

Wenn Sie versuchen, ein anderes Datum eingeben (nach löschen, Natürlich) Sie können nicht mit einer Zahl anders beginnen. 1 oder 2. Dieser Grund ist, dass unsere Maske eine Übersetzung erfolgen wenn Zeichen zulassen. Wenn das Muster nicht übereinstimmt, der Char wird gelöscht.

The meaning of “;TC99/M9/D9; Maske ist:

  • Muss beginnen mit 1 oder 2 (Übersetzung T: /[12]/ ; Benutzerdefiniertes format)
  • Nummer muss 0 oder 9 (Übersetzung C: /[09]/ ; Benutzerdefiniertes format)
  • Müssen eine Nummer haben (Alle) (Übersetzung 9 ; MaskPlugin Kern-format)
  • Müssen eine Nummer haben (Alle) (Übersetzung 9 ; MaskPlugin Kern-format)
  • Ein Schrägstrich wird automatisch hinzugefügt ( / )
  • Nummer muss 0 oder 1 (Übersetzung M: /[01]/ ; Benutzerdefiniertes format)
  • Müssen eine Nummer haben (Alle) (Übersetzung 9: MaskPlugin Kern-format)
  • Ein Schrägstrich wird automatisch hinzugefügt ( / )
  • Nummer muss 0, 1, 2 oder 3 (Übersetzung D: /[0-3]/ ; Benutzerdefiniertes format)
  • Müssen eine Nummer haben (Alle) (Übersetzung 9: MaskPlugin Kern-format)

Natürlich, Es gibt keine echte Validierung. You can type “;2999/19/39; und das ist kein gültiges Datum, aber ist fast fertig.

Also, auf andere Weise formatieren, Ändern Sie einfach Maske Parameterreihenfolge.

Aber, Wenn die Quelle-Datum in ein anderes Muster ist, wie Monat/Tag/Jahr, die Maske funktionieren nicht. The date output for “;06/11/2018 15:40; will be weird “;1018/15/0;.

Anderes Datum behandeln werden Formate mehr als einfache Maske benötigt. Brauchen wir eine Funktion.

Suchen Sie den folgenden code

        Var MaskBehaviorDateTime = Funktion (Val, und, Feld) { // Diese Funktion muss eine Maske Var Msk zurück = "TC99/M9/D9"; // Unser gewünschtes Format Var V = field.is('input') ? Field.Val() : Field.Text(); // ist eine Eingabe oder eine andere HTML-element??
                    V = v.replace(/\D/g, ''); // Streifen nicht stellen, wenn (v != '') { // hat Wert?
                        if ((/^[01]\d[0-3]\dd{4}$/).Test(v)) { //Testen, ob Muster Monat/Tag/Jahr nur V = v.replace(/^(\d{4})(\d{2})(\d{2})$/, "$3 / $2 / $1");
                        } elseif ((/^[01]\d[0-3]\dd{4}[012]\d[0-5]\d$ /).Test(v)) { //Testen Sie, ob Muster Monat/Tag/Jahr Stunde:Minute V = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, "$3 / $2 / $1");
                            // Wenn wir, Stunde und Minute zeigen müssen, zurückgegebene Maske muss auch geändert werden
                            // 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 und m muss existiert in Übersetzungsoptionen
                        }
                        Field.is('input') ? Field.Val(v) : Field.Text(v);
                    }
                    Msk zurück;
                },
                OptionsDateTime = {
                    Platzhalter: "____/__/__",
                    Übersetzung: {
                        "D": {Muster: /[0-3]/, optional: falsch, rekursive: wahr},
                        "M": {Muster: /[01]/, optional: falsch, rekursive: wahr},
                        "T": {Muster: /[12]/, optional: falsch, rekursive: wahr},
                        "(C)": {Muster: /[09]/, optional: falsch, rekursive: wahr},
                        "h": {Muster: /[0-2]/, optional: wahr, rekursive: wahr},
                        "m": {Muster: /[0-5]/, optional: wahr, rekursive: wahr}
                    }
                };
        jQuery('[Daten-Rolle ="Datum"]').Maske(maskBehaviorDateTime,  optionsDateTime);

Jetzt haben wir zwei weitere Übersetzung Muster (h und m). h bedeutet, dass die n-Indexposition zahlen müssen 0, 1 oder 2 und m Zahlen zwischen 0 und 5. Halten Sie im Verstand, was Fall zählt.

Mit dem obigen code, Wir können formatieren und Datum auf verschiedene Weise anzeigen. Ändern Sie einfach .Test() und .Ersetzen() Muster, Ihre gewünschte Muster zu füllen.

Dies ist der Code, den ich verwende, um Datenbank Datetime Felder mit Jahr-Monat-Tag Stunden formatieren:MINUTE:Zweiter in HTML-Elementen mit Tag/Jahr/Monat-Stunde:MINUTE

    Var MaskBehaviorDateTime = Funktion (Val, und, Feld) {
            // Wenn bereits ein Wert vorhanden ist, die Formate in der standard tt/mm/jjjj mit der optionalen hh:mm:SS-Var-Msk = "TC99/M9/D9 h9:M9:S9";
            if (Attr-Feld.("Original Datumswert") == undefined) {
                Var o = field.is('input') ? Field.Val() : Field.Text();
            } anderes {
                Var Attr = Feld.("Original Datumswert");
            }
            V = die. ersetzen(/\D/g, '');
            if (v != '') {
                Attr-Feld.("Original Datumswert") == undefined &;&; Attr-Feld.("Original Datumswert", die);
                if ((/^[12][09]\d{2}[01]\d[0123]\d$ /).Test(v)) { // Jahr/Monat/Tag V = v.replace(/^(\d{4})(\d{2})(\d{2})$/, "$3 / $2 / $1");
                    MSK = "D9/M9/TC99";
                } elseif ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d$ /).Test(v)) { // Jahr/Monat/Tag Stunde: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";
                } elseif ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d[0-5]\d$ /).Test(v)) { // Jahr/Monat/Tag Stunde:Minute:zweite 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('input') ? Field.Val(v) : Field.Text(v);
            }

            Msk zurück;
        },
        OptionsDateTime = {
            Platzhalter: "__/__/____",
            Übersetzung: {
                "D": {Muster: /[0-3]/, optional: falsch, rekursive: wahr},
                "M": {Muster: /[01]/, optional: falsch, rekursive: wahr},
                "T": {Muster: /[12]/, optional: falsch, rekursive: wahr},
                "(C)": {Muster: /[09]/, optional: falsch, rekursive: wahr},
                "h": {Muster: /[0-2]/, optional: wahr, rekursive: wahr},
                "m": {Muster: /[0-5]/, optional: wahr, rekursive: wahr},
                "s": {Muster: /[0-5]/, optional: wahr, rekursive: wahr}
            },
        };
    jQuery('[Daten-Rolle ="Datum"]').Maske(maskBehaviorDateTime,  optionsDateTime);

Mit einem Eingang wie

<;input Type ="Text" Daten-Rolle ="Datum" Wert ="2018-06-11 15:40">;

Die Ausgabe wird

11/06/2018 15:40

Hope this helfen Sie!

Mehrere Werte verbindlich in PDO-SQL-Anweisung (PDOStatement)

Manchmal müssen wir einen einzelnen Wert über mehrere Spalten suchen, beim Erstellen von SQL-Anweisungen.

Nehmen wir an der folgenden Tabelle

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

Wir benötigen einen einzelnen Wert auf Spalten suchen B,D und E Wir werden die folgende Anweisung verwenden, müssen

ID AUSWÄHLEN, COLUMN_A,(...Spalten..), COLUMN_E 
FROM ENTITY_ONE WHERE COLUMN_B LIKE '%search_value%' OR COLUMN_D LIKE '%search_value%' OR COLUMN_E LIKE '%search_value%';

Wir können in PHP-code

$q = '%search_value%';
$sql = "Auswählen * VON ENTITY_ONE WO COLUMN_B LIKE '$q' ODER COLUMN_D LIKE '$q' ODER COLUMN_E LIKE '$q'; 
$pdo = neue g.A.($Dsn, $Benutzer, $bestehen); 
$stmt = $pdo->;Abfrage($Sql);

Gut, this can work but we know that isn’;t der beste Ansatz. Wir brauchen verbindliche Werte verwenden, um SQL-Injection und andere schädlichen Leckereien zu vermeiden.

Also, der Code kann geändert werden

$q = '%search_value%'; 
$sql = "Auswählen * VON ENTITY_ONE WHERE COLUMN_B LIKE ? ODER COLUMN_D LIKE ? ODER COLUMN_E LIKE ?; 
$args = [$Q, $Q, $Q]; // Wir brauchen je einen Eintrag "?" on instruction
$pdo = new PDO($Dsn, $Benutzer, $bestehen); 
$stmt = $pdo->;Zubereiten($Sql);
$stmt->;Ausführen($Args);

Viel besser, aber, beim Bau von komplexen SQL-Anweisung, things can be confusing with lots of arguments and don’;Vergessen Sie nicht: BESTELLEN FRAGEN.

Glücklich kann PDO binden Werte in unterschiedlicher Reihenfolge wenn Bindungen mit benannt werden..

$q = '%search_value%'; 
$sql = "Auswählen * VON ENTITY_ONE WHERE COLUMN_B LIKE :First_arg oder COLUMN_D wie :Second_arg oder COLUMN_E wie :third_arg; 

$pdo = neue g.A.($Dsn, $Benutzer, $bestehen); 
$stmt = $pdo->;Zubereiten($Sql); 
// Eine Möglichkeit $args = [':first_arg' =>; $Q, ':third_arg' =>;$Q, ':second_arg' =>; $Q]; // Wir brauchen je einen Eintrag ":Name" on instruction 
$stmt->;Ausführen($Args); 
// Another way
$stmt->;bindValue(':Third_arg ". $Q);
$stmt->;bindValue(':First_arg ", $Q); 
$stmt->;bindValue(':Second_arg ", $Q);

$stmt->;Ausführen(); 

Hmm, seems that this isn’;t gut genug. Wir ändern nur die Verwendung von 1-indizierte Platzhalter um eine :benannten Platzhalter. There’;s kein Gewinn jenseits der Code lesbar und die Möglichkeit, in beliebiger Reihenfolge zu binden.

Ja, aber jetzt können wir die beste Vorgehensweise tun, wenn Sie einen einzigartigen Suchbegriff in mehrere Spalten verwenden. Wir können nur eine Bindung an eine oder mehrere :named placeholders ’;PDO ist smart und clever. Schauen Sie unsere endgültige Code hier.

$q = '%search_value%'; 
$sql = "Auswählen * VON ENTITY_ONE WHERE COLUMN_B LIKE :unique_arg ODER COLUMN_D LIKE :unique_arg ODER COLUMN_E LIKE :unique_arg; 
$pdo = neue g.A.($Dsn, $Benutzer, $bestehen); 
$stmt = $pdo->;Zubereiten($Sql); 
// One way 
$args = [':unique_arg' =>; $Q]; // Wir können alle binden :name with only one term 
$stmt->;Ausführen($Args); 
// Another way 
$stmt->;bindValue(':Unique_arg ", $Q); 
$stmt->;Ausführen(); 

Erspart eine Menge Tipparbeit beim Schreiben viele SQL-Anweisung mit demselben argument.

Benennen von Dateien mithilfe der Liste aus 0 bis Z

Heute ich war einige Skripte programmieren und habe ein wenig Mühe zu ein definiertes Muster verwenden.

Das Muster ist, Dateien zu erstellen, wo die Reihenfolge in beginnt 0 (0 (null)) und kann nicht wiederholt werden, bis Z.

Beispiel:

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

Gut, Dies ist kein großes Problem, so dass ich diesen Code verwenden.

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

Aber

$Seq

nicht gab der erwartete Wert des nicht 0 (0 (null)) bei der ersten Ausführung. Stattdessen, Es war leer.

Debuggen die Variablen, Ich sah, dass die while nie ergibt true. Auf der Kommandozeile zu reproduzieren versucht sah ich, dass

in_array($Seq, $seqs);

immer zurück true. Ich versuchte, verwenden “”, “R” und egal, welchen Wert ich habe, noch zurückgeben true.

So ändern ich, um zu verwenden STRICT Argument für 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 ist richtig, ;0; ist nicht unbedingt gleich 0. Die Chr Funktionsrückgabe string und

Bereich('0', '9')

erstellt ein array mit integer Werte.

Also, Ich änderte den Ansatz auf alle Werte mit auswerten STRICT, Da ich einen schönen und sauberen Code ohne keine anderen Funktionen möchte verwendet werden zu erstellen.

This is the final code that I’;m mit:

// Anfangswerte $seq = '';
$Seqs = Array_merge(Bereich(Ord('0'),Ord('9')), Bereich(Ord('A'), Ord('Z')));
$Seqs = Array_map("chr", $seqs);
$l = 1;
während (!in_array($Seq, $seqs, wahr)) {
    $Seq = chr(Ord($Infos['Last_seq']) + $l ++);
}

// Dateinamen foreach ($itens_for_files as $key =>; $itens) {
    // ... Eine andere Codes, die Datei $seq füllen = chr(Ord($Seq) + 1);
    während (!in_array($Seq, $seqs, wahr)) {
    $Seq = chr(Ord($Seq) + 1);
    $Filename = 'Myfile' . $Seq . . 'ext';
    // ...
}

Wie Sie sehen können, Ich änderte die $seqs initial values from ‘;0; zu Ihrem ASCII Code und auf Ihren Wert, der gab mir wieder ein array mit allen Werten im string Typ.

Bis bald!

PHP-Vergleich-Fehler

Heute, Ich schrieb ein Skript in PHP beim stieß ich auf unerwartetes Verhalten in der Befehlszeile verwendet werden (zumindest von meiner Seite).
Das Skript sollte drei Argumente erhalten., das letzte von ihnen eine Liste mit einem oder mehreren numerischen Codes.
Versuch, diese letzte Argument zu überprüfen war ein anderes Ergebnis bekommen als gedacht.
Finden Sie das Code-Snippet, das war ich mit:

// Test.php wenn (php_sapi_name() == 'Cli') {
    $di = Isset($argv[1]) ? $argv[1] : Datum('Y-m-d'); // Erste $df = Isset($argv[2]) ? $argv[2] : Datum('Y-m-d'); // Termin $prods = Isset($argv[3]) ? explodieren(',', $argv[3]) : Array(); // Codeliste

    ##### Überprüfen von
    // Erste wenn ($di != Datum('Y-m-d', strtotime($di))) {
        Echo "\n";
        Echo "FEHLER! Ungültige Fixierung!\n";
        Ausfahrt;
    }
    // Finale ausgehen, falls ($DF != Datum('Y-m-d', strtotime($DF))) {
        Echo "\n";
        Echo "ERRO! Ungültiges Datum endgültig!\n";
        Ausfahrt;    
    }

    // Codes, wenn (Graf($Viehtreiber) >; 0) {
        foreach ($prods als $prod) {
            if ($Prod != (int)$Prod) {
                Echo "\n";
                Echo "FEHLER! Der CODE " . $Prod . " ist ungültig!\n" ;
                Ausfahrt;
            }
        }
    }
    Echo "FERTIG!";
}

Lesen Sie weiter >>

jQuery.html() funktioniert nicht in Internet Explorer

Vor kurzem hatte ich Probleme mit einem Javascriptcode, der verwendet jQuery und es funktionierte in verschiedenen Browsern wie Chrom, die Firefox und einige Versionen von InternetExplorer, aber hartnäckig weigerte, die Arbeiten InternetExplorer 7 und 8.
Führen Sie den code:

$.Bereitstellen(URL,{ Optionen }, 
  Funktion (Antwort) {
     $('#myElement').HTML(Antwort);
  },
'Text');

Nach einigen Tests wurde mir klar, es gab ein Problem, Methode, wie in anderen Codes verhielt er sich wie erwartet.
So gründlich Debuggen von Code und die Antworten der Ajax-Methode realisiert einen kleiner Syntaxfehler in HTML und es war nur der Update-IE 7 die Antwort korrekt angezeigt.
Dann folgt die Spitze, Wenn Sie Probleme mit der Methode jQuery.html(), zunächst prüfen Sie, ob der Inhalt im Element geschrieben wird ein html-Code ohne Fehler ist, Da die Validierung IE 7/8 HTML wird ohne Fehler schreiben werden., Egal wie klein.