Sicherheitsabstand: explode möchte nicht Arbeiten

Hallo

ich habe folgenden String

$ortplz = Münster,48145  
$ortplz= explode(",", $ortplz);  
$ort= $ortplz[0];  
$plz= $ortplz[1];

fügt man nun ein echo herein

kommt bei $ort:
Münster

und bei $plz:
Ã

heraus. Eigentlich sollte es die Postleitzahl sein! Liegt es an den Sonderzeichen?

  1. [latex]Mae  govannen![/latex]

    ich habe folgenden String

    Wo? Das ist jedenfalls keiner:

    $ortplz = Münster,48145

    ...jedenfalls fehlt da etwas entscheidendes, das einen String ausmacht.

    heraus. Eigentlich sollte es die Postleitzahl sein! Liegt es an den Sonderzeichen?

    Wenn ich die offensichtlichen PHP-Fehler behebe, trennt explode den String genau wie gewünscht auf.

    Cü,

    Kai

    --
    „It's 106 miles to Chicago, we got a full tank of gas, half a pack of cigarettes, it's dark, and we're wearing sunglasses“.
    „Hit it!“
    Selfzeugs
    SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
    1. Hallo Kai,

      ja das ; habe ich nicht eingetragen. Aber trotzdem läuft es nicht probiere es ruhig einmal selbst

      1. Moin!

        ja das ; habe ich nicht eingetragen. Aber trotzdem läuft es nicht probiere es ruhig einmal selbst

        Es ging eher um die Anführungszeichen um den String drumherum, die da fehlen.

        - Sven Rautenberg

        1. Moin Moin,

          hm du meinst sicher um den ersten String in dem ich Münster... vorgebe. Da hast du natürlich recht.
          Im Script war es auch vorhanden, ich habe es beim Abschreiben (copy & paste war leider nicht möglich, da ein anderer Rechner) übersehen.
          Nichtsdestotrotz will es nicht

          $ortplz = "Münster,48145";
          $ortplz= explode(",", $ortplz);
          $ort= $ortplz[0];
          $plz= $ortplz[1];
          echo $ort;
          echo $plz;

          probier es bitte bei deiner lokalen installation, es ist kurrios..

          Danke

          Sicherheitsabstand

          Moin!

          »» ja das ; habe ich nicht eingetragen. Aber trotzdem läuft es nicht probiere es ruhig einmal selbst

          Es ging eher um die Anführungszeichen um den String drumherum, die da fehlen.

          • Sven Rautenberg
          1. Hi Sicherheitsabstand!

            probier es bitte bei deiner lokalen installation, es ist kurrios..

            Done!
            Ausgabe: Münster48145

            Der Fehler liegt woanders. In erster Linie liegt er bei dir, weil du keine exakte Problembeschreibung lieferst bzw. dein bisherigen Debug-Maßnahmen unternommen hast.
            Dieses Urteil ist vollkommen wertfrei und kein Vorwurf. Jeder muss sowas lernen.

            Wenn du mehr Informationen und vielleicht sogar ein Online-Beispiel liefern kannst, dann kann man dir wahrscheinlich helfen.

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
            1. Hello,

              probier es bitte bei deiner lokalen installation, es ist kurrios..

              Done!
              Ausgabe: Münster48145

              Das deutet doch einwandfrei auf den von mir vermuteten Fehler hin:
              https://forum.selfhtml.org/?t=186188&m=1236439

              Du solltest also nochmal genau die Variablennamen im Original-Code anschauen (lassen) und sehen, ob es da nicht doch einen Schreibfehler gibt.

              Das ist ein Problem bei PHP, das durch die implizite Deklaration der Variablen entsteht.
              Wenn man dann solche Selbstzuweisungen vornimmt, merkt man nicht, wenn auf der linken Seite eine nicht vorhandene (ähnlich lautende) Variable benutzt wird. Es ist ja im PHP-Sinne kein Fehler.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
  2. Hi,

    $ortplz = Münster,48145

    Der Variablen $ortplz wird die Konstante Münster 1) zugewiesen - da diese (vermutlich) nicht definiert ist, weist PHP den Namen der Konstanten als String zu.
    Anschließend (Komma-Operator, der niedrigere Priorität als Zuweisungs-Operator hat) wird der Ausdruck 48145 berechnet (dabei kommt 48145 raus) und das Ergebnis verworfen.

    $ortplz= explode(",", $ortplz);

    "Münster" enthält kein Komma, es gibt also keine Trennstelle. Da kein negatives Limit gesetzt ist (kein dritter Parameter), wird ein array mit einem String (nämlich "Münster") zurückgegeben.

    $ort= $ortplz[0];

    $ort wird der erste String aus dem Array zugewiesen - das ist "Münster".

    Bis hierhin ist mir das Verhalten noch verständlich. Ab hier wird's schwammig. Ich versuche mal, das PHP-Verhalten zu erraten.

    $plz= $ortplz[1];

    Das array $ortplz enthält nur einen String, $ortplz[1] existiert demnach nicht als Array-Inhalt.
    Ich vermute, daß PHP hier $ortplz zu einem String castet (was auf "Münster" herausläuft).
    Der String könnte dann wiederum als array von Zeichen interpretiert werden, mit [1] wird auf das zweite Zeichen zugegriffen.

    kommt bei $ort:
    Münster

    Das ist logisch, Erklärung siehe oben.

    und bei $plz:
    Ã

    Dass wäre nach meiner Vermutung auch irgendwie logisch.

    heraus. Eigentlich sollte es die Postleitzahl sein!

    Nein, die Postleitzahl kann es nicht sein, Erklärung siehe oben.
    Ich hätte eher den Wert null erwartet (garniert mit einer Laufzeit-Warnung a la "Array Index out of bounds")

    1. kann es sein, daß das PHP-File utf8-kodiert ist, Du es aber als ISO-8859-1 betrachtest? ü sieht wie ein utf8-ü aus, das als iso-8859-1 betrachtet wird.

    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. Hello,

      da wird dann wohl auf der linken Seite vom Gleichheitszeichen an anderes $Ortplz stehen als es das $ortplz auf der rechten Seite ist, oder so ähnlich.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. echo $begrüßung;

      » $ortplz = Münster,48145

      Der Variablen $ortplz wird die Konstante Münster 1) zugewiesen - da diese (vermutlich) nicht definiert ist, weist PHP den Namen der Konstanten als String zu.
      Anschließend (Komma-Operator, der niedrigere Priorität als Zuweisungs-Operator hat) wird der Ausdruck 48145 berechnet (dabei kommt 48145 raus) und das Ergebnis verworfen.

      Schon falsch. Wenn die Anführungszeichen wirklich fehlen, dann darf das Komma an der Stelle nicht stehen. Das ergibt einen Syntax-Fehler, noch bevor die Steuerung an das Script übergeben wird. Das fehlende Semikolon wäre der nächste Syntax-Fehler.

      Bis hierhin ist mir das Verhalten noch verständlich. Ab hier wird's schwammig. Ich versuche mal, das PHP-Verhalten zu erraten.

      » $plz= $ortplz[1];

      Das array $ortplz enthält nur einen String, $ortplz[1] existiert demnach nicht als Array-Inhalt.
      Ich vermute, daß PHP hier $ortplz zu einem String castet (was auf "Münster" herausläuft).

      PHP castet nicht einfach ohne Grund. Wenn $ortplz ein Array ist, und das Element 1 nicht vorhanden ist, ergibt das wie bei jedem Zugriff auf nicht vorhandene Variablen als Ergebnis NULL begleitet von einer Notice (in dem Fall: Undefined offset: 1).

      Der String könnte dann wiederum als array von Zeichen interpretiert werden, mit [1] wird auf das zweite Zeichen zugegriffen.

      Das ist eher eine Erklärung, aber nicht für den vom OP gezeigten Code. Das explode() müsste in dem Fall gar nicht ausgeführt worden sein und $ortplz ein String bleiben.

      echo "$verabschiedung $name";

      1. Guten Tag,

        PHP castet nicht einfach ohne Grund. Wenn $ortplz ein Array ist, und das Element 1 nicht vorhanden ist, ergibt das wie bei jedem Zugriff auf nicht vorhandene Variablen als Ergebnis NULL begleitet von einer Notice (in dem Fall: Undefined offset: 1).

        Beim Zugriff auf einen String in Array-Notation wird der String wie ein Array aus Zeichen behandelt:

        <?php  
        $s = "abc";  
        echo $s[0], PHP_EOL, $s[2], PHP_EOL;  
        ?>
        

        Ergibt:

        a
        c

        Gruß
        Christoph Jeschke

        --
        Zend Certified Engineer
        Certified Urchin Admin
        1. echo $begrüßung;

          » PHP castet nicht einfach ohne Grund. Wenn $ortplz ein Array ist, und das Element 1 nicht vorhanden ist, ergibt das wie bei jedem Zugriff auf nicht vorhandene Variablen als Ergebnis NULL begleitet von einer Notice (in dem Fall: Undefined offset: 1).

          Beim Zugriff auf einen String in Array-Notation wird der String wie ein Array aus Zeichen behandelt:

          Ja, dazu muss aber auch ein String vorliegen. Das tat es beim OP mit hoher Wahrscheinlichkeit auch, obwohl er und sein geposteter Code von einem Array ausging. Die von Mudgard vermutete Verhaltensweise PHPs war jedenfalls, so wie er sie formuliert hat, nicht richtig.

          echo "$verabschiedung $name";

          1. Guten Tag,

            Ja, dazu muss aber auch ein String vorliegen. Das tat es beim OP mit hoher
            Wahrscheinlichkeit auch, obwohl er und sein geposteter Code von einem Array
            ausging.

            Ich vermute eh, dass der OP nicht alle Angaben korrekt übernommen hat.

            Die von Mudgard vermutete Verhaltensweise PHPs war jedenfalls, so wie
            er sie formuliert hat, nicht richtig.

            Zumindest was den ,-Operator angeht, hatte er unrecht. Ansonsten sind sie aber durchaus richtig.

            Gruß
            Christoph Jeschke

            --
            Zend Certified Engineer
            Certified Urchin Admin
  3. echo $begrüßung;

    Eigentlich sollte es die Postleitzahl sein! Liegt es an den Sonderzeichen?

    Wann immer Wunsch und Wirklichkeit nicht übereinstimmen, überprüfe das mit Kontrollausgaben. Auch das Spekulieren bringt einen nicht weiter, wenn man diese nicht - beispielsweise mit Kontrollausgaben - verifiziert.

    Einfache Kontrollausgaben können mit echo oder print gemacht werden, allerdings wandelt PHP dabei manchmal Werte in ihre Stringdarstellung und man sieht nicht, was wirklich in der Variable steht oder als Ergebnis eines Ausdrucks entsteht. var_dump() erzeugt eine deutlich genauere Ausgabe.

    Ebenfalls wichtig ist, beim Entwickeln das error_reporting auf E_ALL zu stellen. Damit bekommt man Fehlermeldungen für "weniger wichtige Fehler" (Notices) angezeigt. Das betrifft beispielsweise Zugriffe auf nicht vorhandene Variablen oder Strings, die als Konstante notiert sind.

    echo "$verabschiedung $name";