Pete: strpos und andere sehr typenempfindlich?

Hi,

  
$_GET['x']= '1234';  
if(strpos($_GET['x'],'3' ) ){echo'Gefunden';}else{echo'Nicht gefunden';}  
// Ausgabe: Gefunden  
  
  
$_GET['x']= 1234;  
if(strpos($_GET['x'],'3' ) ){echo'Gefunden';}else{echo'Nicht gefunden';}  
// Ausgabe: Gefunden  
  
$_GET['x']= '1234';  
if(strpos($_GET['x'],3 ) ){echo'Gefunden';}else{echo'Nicht gefunden';}  
// Ausgabe: Nicht gefunden  

Nr. 1 ist klar
Nr. 2 findet er auch obwohl "1234" ein integer ist aber die "3" ein String

Nr.3 aber findet er nicht, weil "1234" wohl ein String ist die 3 aber integer. Verstehe ich nicht was soll das? Muss ich jetzt wirklich in Zukunft erst noch prüfen welcher Typ  irgendein Wert ist und dann umwandeln?

Pete

  1. Hi,

    Nr.3 aber findet er nicht, weil "1234" wohl ein String ist die 3 aber integer.

    http://de.php.net/manual/de/function.strpos.php
    "Ist needle  kein String, wird der Parameter in einen Integerwert konvertiert, der dem Ordinalwert des Zeichens entspricht."

    Abgesehen davon:
    $_GET['x']= '1234';
    if(strpos($_GET['x'],'1' ) ){echo'Gefunden';}else{echo'Nicht gefunden';}

    dürfte Dich auch überraschen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      http://de.php.net/manual/de/function.strpos.php
      "Ist needle  kein String, wird der Parameter in einen Integerwert konvertiert, der dem Ordinalwert des Zeichens entspricht."

      Den Satz hatte ich auch im Manual gelesen aber den Sinn nicht verstanden.
      Dann gehe ich jetzt mal davon aus, dass es sinnvoll ist solche Abfragen immer mit einem stringneedle zu machen, selbst wenn eine 99%ige Sicherheit vorliegt, dass haystack ein Integerwert ist?

      Abgesehen davon:
      $_GET['x']= '1234';
      if(strpos($_GET['x'],'1' ) ){echo'Gefunden';}else{echo'Nicht gefunden';}

      dürfte Dich auch überraschen.

      Nein, die Problematik ist mir seit vielen Jahren bekannt. Bin da Anfang des Jahrtausends in die Falle mit getappt.

      Gruss
      Pete

      1. Hi,

        »» http://de.php.net/manual/de/function.strpos.php
        »» "Ist needle  kein String, wird der Parameter in einen Integerwert konvertiert, der dem Ordinalwert des Zeichens entspricht."

        Den Satz hatte ich auch im Manual gelesen aber den Sinn nicht verstanden.
        Dann gehe ich jetzt mal davon aus, dass es sinnvoll ist solche Abfragen immer mit einem stringneedle zu machen, selbst wenn eine 99%ige Sicherheit vorliegt, dass haystack ein Integerwert ist?

        haystack muß ein String sein.

        Und ob ein integer als needle sinnvoll ist, hängt davon ab, ob Du nach einem Zeichen oder nach einem Zeichencode suchst.

        »» $_GET['x']= '1234';
        »» if(strpos($_GET['x'],'1' ) ){echo'Gefunden';}else{echo'Nicht gefunden';}
        »» dürfte Dich auch überraschen.
        Nein, die Problematik ist mir seit vielen Jahren bekannt. Bin da Anfang des Jahrtausends in die Falle mit getappt.

        Dann verstehe ich nicht, warum Du nicht mit !== false arbeitest.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hi,

          haystack muß ein String sein.

          Aha, da liegt also der Hase im Pfeffer. Dann muss ich wohl doch immer sicher gehen, dass das auch so ist, egal woher der Wert stammt, sicherheitshalber nach String konvertieren. Ich muss zugeben die Typenbestimmung in PHP hat mich das nie überdenken lassen, weil mir bisher solche Probleme nie untergekommen sind, eher in wenigen einzelnen Fällen umgekehrt, dass PHP Werte nicht als Integer angesehen hatte, obwohl es sollte.

          Dann verstehe ich nicht, warum Du nicht mit !== false arbeitest.

          Weil es nur ein (schreibfaules) Beispiel ist und das 0-Pos Problem hier nicht zum Tragen kommt.

          Danke
          Pete

          1. Hallo

            »» haystack muß ein String sein.

            Aha, da liegt also der Hase im Pfeffer. Dann muss ich wohl doch immer sicher gehen, dass das auch so ist, egal woher der Wert stammt, sicherheitshalber nach String konvertieren.

            Du kannst zumindest sicher sein, dass alles, was über GET und POST kommt, vom Typ String ist.

            Tschö, Auge

            --
            Die deutschen Interessen werden am Liechtenstein verteidigt.
            Veranstaltungsdatenbank Vdb 0.3
            1. Hi,

              Du kannst zumindest sicher sein, dass alles, was über GET und POST kommt, vom Typ String ist.

              eben nicht. So einen Satz habe ich hier schon einmal gelesen aber versäumt das als "Nicht Wahr" zu ergänzen. Die automatische Typenkonvertierung von PHP sorgt dafür das GET/Postanfragen durchaus verändert werden, denn in der Regel wird keine GET/POST Anfrage 1:1 übernommen, es finden Säuberungsänderungen statt, Prozeduren, eben was auch immer letztendlich jeder macht um den Wert dann zu nutzen.

              Gruss
              Pete

              1. Hallo

                »» Du kannst zumindest sicher sein, dass alles, was über GET und POST kommt, vom Typ String ist.

                eben nicht. So einen Satz habe ich hier schon einmal gelesen aber versäumt das als "Nicht Wahr" zu ergänzen.

                Ich weiß ja nicht, was du machst, aber wenn *ich* eine PHP-Datei mit folgendem Code aufrufe ...

                <?php var_dump($_GET); ?>

                ... und beim Aufruf z.B. folgende Parameter "?zahl=123&text=irgendwas" an die URL hänge, wird mir ausgegeben, dass alle Daten vom Typ String sind.

                array(2) {
                  ["zahl"]=>
                  string(3) "123"
                  ["text"]=>
                  string(9) "irgendwas"
                }

                Die automatische Typenkonvertierung von PHP sorgt dafür das GET/Postanfragen durchaus verändert werden, ...

                nein

                ... denn in der Regel wird keine GET/POST Anfrage 1:1 übernommen, ...

                doch

                ... es finden Säuberungsänderungen statt, Prozeduren, eben was auch immer letztendlich jeder macht um den Wert dann zu nutzen.

                Aaaahhh, jetzt kommen wir zum Thema. Man, also der Skriptautor, verarbeitet die Daten auf die eine oder andere Weise. Dass die Daten dabei manipuliert werden, liegt auf der Hand. *Dabei* kommt es im Falle des Falles auch zur automagischen Typkonvertierung, nicht bei der Übergabe bzw. dem initialen Import in das Skript.

                Tschö, Auge

                --
                Die deutschen Interessen werden am Liechtenstein verteidigt.
                Veranstaltungsdatenbank Vdb 0.3
      2. Hallo,

        »» http://de.php.net/manual/de/function.strpos.php
        »» "Ist needle  kein String, wird der Parameter in einen Integerwert konvertiert, der dem Ordinalwert des Zeichens entspricht."
        Den Satz hatte ich auch im Manual gelesen aber den Sinn nicht verstanden.

        was ist daran so kompliziert zu verstehen?

        Dann gehe ich jetzt mal davon aus, dass es sinnvoll ist solche Abfragen immer mit einem stringneedle zu machen

        Kommt drauf an ...

        selbst wenn eine 99%ige Sicherheit vorliegt, dass haystack ein Integerwert ist?

        Dann wird er in einen String konvertiert, weil PHP hier aus Gründen der Sinnhafitgkeit zwingend einen String braucht.

        »» $_GET['x']= '1234';
        »» if(strpos($_GET['x'],'1' ) ){echo'Gefunden';}else{echo'Nicht gefunden';}
        »» dürfte Dich auch überraschen.
        Nein, die Problematik ist mir seit vielen Jahren bekannt.

        Welche Problematik? Dass PHP (ähnlich wie Javascript) ungeniert und eigenmächtig zwischen verschiedenen Datentypen lustig hin- und herkonvertiert? Ja, das ist in der Tat ein Problem von schwach typisierten Sprachen.

        So long,
         Martin

        --
        F: Was ist eigentlich aus deinem schlimmen Durchfall geworden?
        A: Mein Arzt hat mir Valium verschrieben.
        F: Und das hilft?
        A: Naja, ich mach mir immer noch in die Hose. Aber inzwischen ist es mir egal.