Gunnar: GET Parameter ist immer ein string?

Hallo,

ich war gerade dabei eine Funktion zu schreiben für eine Geschenkaktion. Dabei ist "von" gleich dem, der einem den Link geschickt hat, also der Schenker.

das kann nun so aussehen: geschenk.php?von=Zahl

Die Zahl muss ein Integer sein. Wenn ich aber nun geschenk.php?von=1337 übergebe und mit gettype($_GET["von"]); abfrage, sagt er mir, dass 1337 ein String ist. Ich will das aber nicht als string haben, sondern mit is_int abfragen können ob es einfach ein Integer ist.

Gibt es eine einfache Lösung drum rum? Oder muss ich das selbst mit intval zum Integer machen?

Und noch eine Frage zu MySql:
Wenn ich 1000 Geschenke habe, die alle eine eindeutige ID haben in einer Tabelle, also 1 bis 1000, kann ich ja durch auto_increment wenn ich ein Geschenk dazugebe, ihn die 1001, 1002 selbst setzen lassen. Wie ist das allerdings wenn ich nur 1000 Geschenke haben wollen würde, nach und nach aber die Geschenke verschwinden, also das Geschenk mit der ID z.b. 4,8,16,32,64 löschen würde. Kann ich manuell auto_increment wieder auf 0 setzen und er füllt mir nur die Zahlen auf die nicht besetzt sind, oder überschreibt er auch die vorhandenen Werte?

Danke für eine Antwort,
Gunnar

  1. Tach!

    Wenn ich aber nun geschenk.php?von=1337 übergebe und mit gettype($_GET["von"]); abfrage, sagt er mir, dass 1337 ein String ist.

    Ja, das wird immer als String übergeben (auch in $_POST).

    Ich will das aber nicht als string haben, sondern mit is_int abfragen können ob es einfach ein Integer ist.
    Gibt es eine einfache Lösung drum rum? Oder muss ich das selbst mit intval zum Integer machen?

    Es gibt keine Konfigurationsmöglichkeit, die solche wie Zahlen aussehende Strings zu Zahlen-Typen macht. Aber es gibt is_numeric().

    Kann ich manuell auto_increment wieder auf 0 setzen und er füllt mir nur die Zahlen auf die nicht besetzt sind, oder überschreibt er auch die vorhandenen Werte?

    You cannot reset the counter to a value less than or equal to any that have already been used.

    Du solltest nicht versuchen, der ID irgendeine andere Bedeutung als die eindeutige Identifikation eines Datensatzes zu geben. Wenn ein Mitarbeiter ausscheidet und ein anderer die Stelle besetzt, bekommt er auch nicht die Personalnummer des alten Mitarbeiters.

    Wenn du 1000 Plätze hast, dann verwalte diese 1000 Plätze in einer weiteren Tabelle. Dort ist dann entweder ein Verweis auf den Datensatz, der auf diesem Platz "sitzt" oder nichts gespeichert (0 oder NULL).

    dedlfix.

    1. Es gibt keine Konfigurationsmöglichkeit, die solche wie Zahlen aussehende Strings zu Zahlen-Typen macht. Aber es gibt is_numeric().

      Wird problematisch, da ja dann auch Hexadezimalwerte und Oktalwerte als richtig erkannt werden :(

      You cannot reset the counter to a value less than or equal to any that have already been used.

      Ich bedanke mich. Das ist eine gute Quelle :)
      Frohe Weihnachten!

      1. Tach!

        Es gibt keine Konfigurationsmöglichkeit, die solche wie Zahlen aussehende Strings zu Zahlen-Typen macht. Aber es gibt is_numeric().
        Wird problematisch, da ja dann auch Hexadezimalwerte und Oktalwerte als richtig erkannt werden :(

        Und wo ist das Problem dabei? Der Wert der Zahl bleibt immer derselbe. Wenn das Programm verhindert, dass jemand auf die Zahl 42 zugreift, dann muss es doch egal sein, in welchem Zahlensystem er sie angibt.

        dedlfix.

      2. Hallo,

        Es gibt keine Konfigurationsmöglichkeit, die solche wie Zahlen aussehende Strings zu Zahlen-Typen macht. Aber es gibt is_numeric().
        Wird problematisch, da ja dann auch Hexadezimalwerte und Oktalwerte als richtig erkannt werden :(

        das würde ich eher als Plus ansehen. Warum sollte ich anstatt der "krummen" 6144 nicht 0x1800 angeben dürfen? Sieht gefälliger aus und ist leichter zu merken. Für die Verarbeitung im Script macht es doch keinen Unterschied.

        Natürlich könntest du den Eingabewert auch mit intval() in einen Zahlenwert umwandeln, da hast du sogar die Möglichkeit, die Zahlenbasis 10 fest vorzugeben. Nur kannst du damit nicht mehr zwischen dem Wert 0 und einer nicht-numerischen Eingabe unterscheiden (ggf. _zusätzlich_ mit is_int() prüfen).
        Irgendeinen Haken gibt's ja immer. ;-)

        Ciao,
         Martin

        --
        Wieso heißen die Dinger eigentlich Anrufbeantworter? Eigentlich sind es doch nur Anrufanhörer.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Irgendeinen Haken gibt's ja immer. ;-)

          nicht bei den billigen Kleiderbügeln, die kommen ohne Haken...

          scnr
          Kalk

  2. Hallo!

    ich war gerade dabei eine Funktion zu schreiben für eine Geschenkaktion. Dabei ist "von" gleich dem, der einem den Link geschickt hat, also der Schenker.

    das kann nun so aussehen: geschenk.php?von=Zahl

    Die Zahl muss ein Integer sein. Wenn ich aber nun geschenk.php?von=1337 übergebe und mit gettype($_GET["von"]); abfrage, sagt er mir, dass 1337 ein String ist. Ich will das aber nicht als string haben, sondern mit is_int abfragen können ob es einfach ein Integer ist.

    Gibt es eine einfache Lösung drum rum? Oder muss ich das selbst mit intval zum Integer machen?

    Was spricht denn aus deiner Sicht gegen 'intval()' oder 'settype()'?

    Viel eher würde ich mich fragen, ob ein GET-Parameter so "optimal" ist?
    Was würde denn passieren, wenn ich ein Script laufen lassen würde, was bspw. für "von" die Zahlen von 1 bis 100.000 einsetzen würde?

    Gruß Gunther

    1. Viel eher würde ich mich fragen, ob ein GET-Parameter so "optimal" ist?
      Was würde denn passieren, wenn ich ein Script laufen lassen würde, was bspw. für "von" die Zahlen von 1 bis 100.000 einsetzen würde?

      Völlig irrelevant. POST-Data zu senden gänge z.B. auch mit wget, das man dann auch in einem Skript einsetzen könnte sogar mit Javascript.

      1. Hallo!

        Viel eher würde ich mich fragen, ob ein GET-Parameter so "optimal" ist?
        Was würde denn passieren, wenn ich ein Script laufen lassen würde, was bspw. für "von" die Zahlen von 1 bis 100.000 einsetzen würde?

        Völlig irrelevant. POST-Data zu senden gänge z.B. auch mit wget, das man dann auch in einem Skript einsetzen könnte sogar mit Javascript.

        Ich sehe das nicht als "völlig irrelevant" an. Gerade bei solchen "Aktionen" sollte doch zumindest eine möglichst große Erschwernis für mögliche "Manipulationen" gegeben sein. Und davon, anstatt GET POST zu verwenden, habe ich auch nichts geschrieben (wobei ich vom Grundsatz her POST-Daten zuimndest als weniger "einladend" für irgendwelche Tricksereien erachte).

        Gruß Gunther

        1. Tach!

          Viel eher würde ich mich fragen, ob ein GET-Parameter so "optimal" ist?
          Was würde denn passieren, wenn ich ein Script laufen lassen würde, was bspw. für "von" die Zahlen von 1 bis 100.000 einsetzen würde?
          Gerade bei solchen "Aktionen" sollte doch zumindest eine möglichst große Erschwernis für mögliche "Manipulationen" gegeben sein. Und davon, anstatt GET POST zu verwenden, habe ich auch nichts geschrieben (wobei ich vom Grundsatz her POST-Daten zuimndest als weniger "einladend" für irgendwelche Tricksereien erachte).

          Wie die Werte in das Script reinkommen, und ob das ungehindert oder über einen erschwerenden Weg passiert, ist wirklich egal. Wenn bestimmte Werte nicht erlaubt sind, muss das die Eingabedatenvalidierung rausfiltern.

          dedlfix.

          1. Tach!

            Wie die Werte in das Script reinkommen, und ob das ungehindert oder über einen erschwerenden Weg passiert, ist wirklich egal. Wenn bestimmte Werte nicht erlaubt sind, muss das die Eingabedatenvalidierung rausfiltern.

            Mag ja sein, dass ich das "Problem" vlt. nicht verstehe, aber es geht ja_nicht_um "bestimmte Werte, die nicht erlaubt sind", sondern vielmehr um das "ungewollte/ unerwünschte" (wiederholte/ mehrfache) aufrufen_mit_erlaubten Werten. Also nix mit "Eingabedatenvalidierung rausfiltern"!

            Gruß Gunther

            1. Tach!

              Mag ja sein, dass ich das "Problem" vlt. nicht verstehe, aber es geht ja_nicht_um "bestimmte Werte, die nicht erlaubt sind", sondern vielmehr um das "ungewollte/ unerwünschte" (wiederholte/ mehrfache) aufrufen_mit_erlaubten Werten.

              Achso, du meinst, wie verhindert werden kann, dass einer in einem Zug alle Geschenke abräumt. Nun, das muss ebenfalls die Geschäftslogik ausklamüsern. Auch hier ist der Ansatz über eine Request-Erschwerungsmethode nicht effektiv. Methoden dafür findet man in Voting-Scripts, die Mehrfachabstimmungen pro Besucher zu verhindern versuchen.

              dedlfix.

              1. Tach!

                Achso, du meinst, wie verhindert werden kann, dass einer in einem Zug alle Geschenke abräumt.

                Ja jetzt!
                Ich wollte den OP halt nur darauf aufmerksam machen, dass der gewählte Ansatz ggf. nicht "ideal" ist, und somit bei einem anderen das aktuelle Problem u.U. gar nicht auftritt.

                Nun, das muss ebenfalls die Geschäftslogik ausklamüsern. Auch hier ist der Ansatz über eine Request-Erschwerungsmethode nicht effektiv. Methoden dafür findet man in Voting-Scripts, die Mehrfachabstimmungen pro Besucher zu verhindern versuchen.

                Letztlich wird es vermutlich gar keine 100%ig "sichere" Variante geben. Aber zumindest eine "bessere" als per GET ...!

                Gruß Gunther

  3. Hi,

    Und noch eine Frage zu MySql:
    Wenn ich 1000 Geschenke habe, die alle eine eindeutige ID haben in einer Tabelle, also 1 bis 1000, kann ich ja durch auto_increment wenn ich ein Geschenk dazugebe, ihn die 1001, 1002 selbst setzen lassen. Wie ist das allerdings wenn ich nur 1000 Geschenke haben wollen würde, nach und nach aber die Geschenke verschwinden, also das Geschenk mit der ID z.b. 4,8,16,32,64 löschen würde. Kann ich manuell auto_increment wieder auf 0 setzen und er füllt mir nur die Zahlen auf die nicht besetzt sind, oder überschreibt er auch die vorhandenen Werte?

    ganz grundsätzlich: solche IDs sind nicht ideal, denn sie sind nicht global gültig. Den AI-Wert kannst du natürlich gerne zur Identifizierung eines Datensatzes nehmen, die eigentliche ID aber sollte ein UUID sein:

    UUID wikipedia

  4. Moin,

    HTTP kennt keine Datentypen.

    Hotti

    1. Tach!

      HTTP kennt keine Datentypen.

      Soweit richtig. Es geht hier jedoch nur mittelbar um HTTP, denn eigentlich will der OP ein PHP-Array abfragen. Und da hätte das PHP ja bereits für den Anwender ein paar Umwandlungen vornehmen können. Hier macht es das nicht, aber bei solchen Parameternamensnotationen wie foo[] greift es zumindest so ins Geschehen ein, dass ein Array entsteht. Drum wäre es erstmal nicht verwunderlich, wenn es anderweitig auch eingreifen würde.

      dedlfix.