Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] "Typecasting"

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Hi.

    Irgendwie bekomm ich gerade zu 90% Antworten zu Fragen die ich gar nicht gestellt habe, bzw. die mich gar nicht wirklich interessieren.

    Habs jetzt momentan so gelöst, und nach meinen ersten Tests funktionierts es auch. Nur hätte ich nun nochmals die Frage an euch, ob es bei dem Code vielleicht doch eine "Schwachstelle" gibt die Ihr sofort erkennt oder ob es ok ist ?!?

    Hier also mein momentaner Code für INT und DOUBLE-Werte

    Code:
    // In Deutschland und anderen Ländern wird für den Datentyp Float
    				// oft das Komma als Trennzeichen verwendet, welches allerdings nicht
    				// SQL-Konform ist -> umwandeln in einen Punkt
    				$data["$feld"] = str_replace(",",".",$data["$feld"]);
    				
    				
    				if (!$data["$feld"] || $data["$feld"] == '') {
    					$sql .= '`'.$feld.'`=\'\', ';
    				}
    				// Da die nächste Funktion settype() beim Casten von Strings in
    				// Int als Rückgabe "0" liefert, muss INT-Wert 0 hier als
    				// zusätzliche Weiche vorhanden sein
    				elseif ($data["$feld"] == 0) {
    					$sql .= '`'.$feld.'`=\'0\', ';
    				}
    				// Datentyp ist Double bzw. Float, falls ein Punkt existiert
    				elseif (settype($data["$feld"],'double') && ereg('\.',$data["$feld"])) {
    
      // DIVERSER CODE
    
    }
    				elseif (settype($data["$feld"],'double')) {
    
    // DIVERSER CODE
    
    }
    Gruß

    Chris

    Kommentar


    • #17
      Zitat von cgeiger
      Irgendwie bekomm ich gerade zu 90% Antworten zu Fragen die ich gar nicht gestellt habe, bzw. die mich gar nicht wirklich interessieren.
      Ich hatte Dir folgenden Link gegeben
      12.1. Wie unterscheide ich böse Variablen von guten?
      http://www.dclp-faq.de/q/q-security-variablen.html

      in dem ua. folgendes zu lesen ist:
      Zitat von FAQ
      3. Variablen, die eine numerische Form haben müssen.
      Numerische Variablen können durch eine einfache Konvertierung erzwungen werden. Danach muss eine Überpruefung des Wertebereiches erfolgen:

      $checkedvar = isset($_GET["numericvar"]) ? $_GET["numericvar"]+0 : 0;
      Durch die Addition von 0 wird eine Konvertierung auf Integer erzwungen. Der Wert ist hinterher entweder Wert des numerischen Prefix von $_GET["numericvar"] oder 0. "123abc" wird also zu 123, "fasel" zu 0. Ein fehlender Wert wird durch das isset() ebenfalls zu 0.
      Was hatte Dir daran nicht gefallen?

      Kommentar


      • #18
        Hi meikel.

        Muss mich bei dir entschuldigen, vor lauter "seltsamer" Beiträge habe ich deinen sinnvollen dann ganz überlesen.

        Kann mich nun wenigstens rausreden, dass du dann unter den restlichen 10% warst

        Werde das mal testen - hört sich interessant an. Was hältst du von meiner Methode? Kritik?

        Weil eigenltich mach ich in meiner Methode was sehr ähnliches wie du beschreibst, nur verwende ich die settype()-Funktion.

        Denn momentan finde ich dass bei meiner jetzigen Version dein Beispiel "123abc" nämlich auch zu null und nicht - wie bei dir - zu "123" wird.
        Allerdings bin ich mir mit der Zuverlässigkeit meiner Methode auch noch nicht zu 100% sicher. Werde mir mal anschauen, ob man die beiden Modelle vielleicht kombinieren kann.

        Gruß

        Chris

        PS: Habe deine Links noch nicht ganz durchgelesen, werde dass aber morgen nachholen!

        Kommentar


        • #19
          zu dem tertiären Operator:
          tuts nicht auch:
          Code:
          intval($var);
          da wird eigentlich dasselbe gemacht, oder

          Kommentar


          • #20
            Hi.

            Ne, leider nicht - ist hier genau die selbe "Kleinigkeit" die ich oben beschreibe:

            "123hallo" wird zu (int)123 - und nicht wie ich das eigentlich gerne hätte zu 0 / False.

            Gruß

            Chris

            Kommentar


            • #21
              versuchs mal mit:
              Code:
              ereg("([[:digit:]]|,|.){".strlen($variable)."}", $variable, $regs)
              ergibt false wenn keine Zahl, ansonsten ist das result strlen($variable)! (UPADATE:jetzt gehts auch mit double)

              Kommentar


              • #22
                PHP Typecasting

                Hallo,

                ich habe das Problem mit Unverträglichkeiten bei Datentypen auch manchmal. Z.B. wenn man per GET Werte bekommt, werden diese in Variablen eingelesen vom Interpreter immer erst als String behandelt. Braucht man einen GET-Wert in einer Funktion aber explizit als Integer, kann das so aussehen:

                $get_wert = $_GET["wert"];
                $wert = (int) $get_wert;

                Und schon hat man einen Integerwert, vorausgesetzt, der mit GET gelieferte Wert besteht nur aus Ziffern und eventuellem Trennzeichen für Kommazahlen.

                Ich hoffe, damit geholfen zu haben. :wink:

                Kommentar


                • #23
                  Klarstellung

                  Zitat von cgeiger
                  Soll also heißen, dass es seltsamerweise im $_POST-Array alle übergebenen Datentypen als String interpretiert werden. Also selbst wenn nur eine "1" oder eben die "123.4" übergeben würden.
                  Das liegt nicht an PHP. Das Formular im Browser kennt keine Variablentypen, gewöhnliche HTML-Formulare kennen nur Strings, und der Browser schickt nur Strings an PHP.
                  Dass in dem String nur Zahlen drin stehen hat PHP hier nicht zu interpretieren, dazu ist der Programmierer da, und dem wird mit is_numeric() ein wunderbares Hilfsmittel zur Verfügung gestellt (braucht höchstens Hilfe bei "," und ".").

                  Ändern wird sich das mit XForms, die kennen nämlich Typen, aber bis die sich durchsetzen dauert es noch ne Weile... PHP kommt aber AFAIK schon damit zurecht.
                  mod = master of disaster

                  Kommentar


                  • #24
                    Zitat von cgeiger
                    Wenn ich dann also nochmals deinen Code laufen lasse, bekomme ich für is_string() ein true, weil PHP es intern einfach so interpretiert
                    Das ist richtig. PHP-intern sind das alles Strings, und die meisten aufgeführten Funktionen wie is_int() oder is_string() beschäftigen sich nur mit diesen PHP-internen Typen, doch die sind hier reichlich irrelevant.

                    is_numeric() prüft nicht (nur) den Typ der Variable, sondern den Inhalt, und ist deswegen hier richtig.
                    mod = master of disaster

                    Kommentar


                    • #25
                      Zitat von ImPAcT
                      UPADATE:jetzt gehts auch mit double
                      Und sogar mit der "Zahl" "4.5.6.2". Aber selbst Werte wir "ghjhjghjg" sind eine Zahl (weil der Punkt für jedes Zeichen steht. Für Integer-Werte müsstest du deinen Code in
                      Code:
                      ereg("^[[:digit:]]+$", $variable, $regs)
                      ändern. Für float- oder doubel-Werte wirds etwas komplizierter.
                      Code:
                      ereg("^[[:digit:]]*\.?[[:digit:]]*$", $variable, $regs)
                      funktioniert zwar, gibt aber leider auch bei einem einzelnen Punkt TRUE zurück. Der folgende Ausdruck sollte die Möglichkeiten abdecken:
                      Code:
                      ereg("^([[:digit:]]*\.?[[:digit:]]+$|^[[:digit:]]+$)", $variable, $regs)
                      Die Bedingung ist, falls ein Dezimalpunkt vorhanden ist, muss mindestens eine Stelle folgen
                      Gruss
                      L

                      Kommentar

                      Lädt...
                      X