Enrico: PHP-Datei zur String-Umwandlung nach Hexadezimal schneidet String ab (JavaScript/PHP)

Hallo,

mich beschäftigt seit geraumer Zeit ein Ajax-Problem.

Ich bekomme über eine Funktion einen String mit allen sich im Warenkorb befindlichen Artikeln, beispielsweise:

A Mirror's Diary|CD|15|1#Rivers of Heart|CD|12|1

In diesem Beispiel befinden sich ein Exemplar (CD) des Albums "A Mirror's Diary" zum Preis von 15,- EURO und ein Exemplar (CD) des Albums "Rivers of Heart" zum Preis von 12,- EURO im Warenkorb.

Nun wandle ich den "Warenkorb"-String über JavaScript nach Hexadezimal um:


function stringZuHex (string)
{
   if (anfrage !== false)
   {
alert(string);

      anfrage.open ("GET", "../php/stringZuHexGet.php?string=" + string, true);
      anfrage.onreadystatechange = fortfahren;
      anfrage.send (null)
   }
}

Das Ajax-Objekt ist tadellos initialisiert und der alert-Befehl liefert mir an dieser Stelle auch den String mit den zwei Alben.

Nun wird der an dieser Stelle noch korrekte String an die PHP-Datei "stringZuHexGet.php" übergeben:


$string = isset ($_GET["string"]) ? $_GET["string"] : false;

if ($string !== false)
{
   echo array_shift (unpack ('H*', $string));
}
else
{
   echo -1;
}

Lasse ich mir nun unmittelbar nach dem Auslesen der Variable $string dessen Wert ausgeben, dann bekomme ich nur das erste Album geliefert:

A Mirror's Diary|CD|15|1

Warum schneidet er mir das zweite Album ab?

Vielen Dank für eure Hilfe.

Gruß

Enrico

akzeptierte Antworten

  1. Hallo Enrico,

    das liegt am # Zeichen, das hat in URLs Sonderbedeutung (um die abgerufene Seite auf eine bestimmte ID zu positionieren). Was hinter dem # steht, wird nicht an den Server übermittelt.

    Das musst Du codieren, dazu kannst Du z.B. die encodeURIComponent() Funktion verwenden. Ob PHP das dann automatisch decodiert oder ob Du dafür dann PHP-seitig noch mit urldecode oder rawurldecode ran musst, musst Du schauen. Vermutlich ja.

    Du bekommst allerdings Probleme, wenn im Warenkorb Unicode-Zeichen stehen mit einem Code Point > \u00ff, das codiert sich mit mehr als einem Byte. WAS genau ist das Problem, dass Du mit der Hex-Codierung lösen willst?

    Rolf

    --
    sumpsi - posui - clusi
  2. Hi,

    Nun wandle ich den "Warenkorb"-String über JavaScript nach Hexadezimal um:

    nein, machst Du nicht - statt eine kleine js-Funktion zu schreiben, die das erledigt, versuchst Du den String durch die Welt zu schicken und serverseitig über PHP nach Hexadezimal zu wandeln.

    Nun wird der an dieser Stelle noch korrekte String an die PHP-Datei "stringZuHexGet.php" übergeben:

    Und dabei vergißt Du, den String kontextgerecht zu behandeln. Was dann auch zum Problem führt - das allerdings gar nicht relevant wäre, wenn Du die Wandlung direkt in js machen würdest.

    Warum schneidet er mir das zweite Album ab?

    wegen fehlender kontextgerechter Behandlung - das # hat in Urls eine Sonderbedeutung.

    cu,
    Andreas a/k/a MudGuard

    1. Warum machst du alles so schwierig! Es reicht ID des Warenkorbs in Cookies des Users zu bewahren, und andere Dateien (Artikel, Preise) - in der DB des Server.

      1. Warum machst du alles so schwierig! Es reicht ID des Warenkorbs in Cookies des Users zu bewahren, und andere Dateien (Artikel, Preise) - in der DB des Server.

        Nein bloß nicht. Dann kann der Kunde ja die Preise nicht mehr ändern!

        MfG

        1. Es reicht ID des Warenkorbs in Cookies des Users zu bewahren, und andere Dateien (Artikel, Preise) - in der DB des Server.

          Nein bloß nicht. Dann kann der Kunde ja die Preise nicht mehr ändern!

          Hehe! Musst Du alles verraten? Shops mit derart verbraucherfreundlichen Sonderfunktionen gehören auf die geheime Liste der bevorzugten Einkaufsgelegenheiten. Und das Video welches zeigt, wie man da durch die Anpassung lokaler Informationen preisoptimal bestellt, natürlich auf "Du Tube".

          1. Tach!

            Shops mit derart verbraucherfreundlichen Sonderfunktionen gehören auf die geheime Liste der bevorzugten Einkaufsgelegenheiten. Und das Video welches zeigt, wie man da durch die Anpassung lokaler Informationen preisoptimal bestellt, natürlich auf "Du Tube".

            Das Video von der Verhandlung wegen Betrugsversuch dann aber bitte auch.

            dedlfix.

            1. Shops mit derart verbraucherfreundlichen Sonderfunktionen gehören auf die geheime Liste der bevorzugten Einkaufsgelegenheiten. Und das Video welches zeigt, wie man da durch die Anpassung lokaler Informationen preisoptimal bestellt, natürlich auf "Du Tube".

              Das Video von der Verhandlung wegen Betrugsversuch dann aber bitte auch.

              Also rein rechtlich handelt es sich beim Absenden der Daten des Warenkorbs als Bestellung um ein Angebot, welches der Shopbetreiber (oder der ihn beauftragende Händler) annehmen muss, um einen Vertrag zu schließen. Stellt sich die Frage, ob der Besteller dann "durch Vorspiegelung falscher oder durch Entstellung oder Unterdrückung wahrer Tatsachen einen Irrtum erregt oder unterhält".

              Denn es wird seitens des Restellers durch die Bestellung klar angegeben, zu welchem Preis er welches Produkt in welcher Menge begehrt. Wenn der Händler entgegen kaufmännischer Sorgfalt den Vertrag ungeprüft eingeht (auch konkludent durch Lieferung bzw. Abbuchung) ist das sein Problem.

              Und selbst wenn man von einer Täuschung des Händlers ausgehen will, dann müsste man in einem Betrugsverfahren immer noch beweisen, dass der Besteller a) selbst und b) absichtlich eine Manipulation vorgenommen hat.

              Dabei viel Glück.

    2. Hallo Andreas,

      danke Dir, das war's 😀

      Viele Grüße

      Enrico

  3. Tach!

    Die Ursache wurde ja schon aufgezeigt. Aber hier noch etwas Senf von mir.

    $string = isset ($_GET["string"]) ? $_GET["string"] : false;
    

    Lasse ich mir nun unmittelbar nach dem Auslesen der Variable $string dessen Wert ausgeben, dann bekomme ich nur das erste Album geliefert:

    Das ist kein Auslesen, das ist unnötiges Kopieren. $_GET["string"] ist genauso eine Variable, wie sie $string ist. Sie ist sofort verwendbar ohne irgendwelche Schritte. Ob $_GET["string"] existiert kann man auch mit empty() testen.

    Warum schneidet er mir das zweite Album ab?

    Wenn man das #-Problem nicht kennt, wäre hier erstmal zu klären, wer denn dieser "er" überhaupt ist. Wenn am Server etwas nicht ankommt, sollte man nachsehen, was genau ankommt, und ob das fehlende überhaupt übertragen wurde. Alles was PHP über den Request weiß, steht in $_SERVER und kann auch über die phpinfo()-Ausgabe eingesehen werden. Was der Browser absendet, kann im Netzwerk-Tab der Entwickler-Tools des Browsers kontrolliert werden. Darin hätte man in diesem Fall sehen können, dass "er" der Browser ist.

    dedlfix.

    1. Hallo dedlfix,

      danke auch Dir für die Aufklärung.

      Viele Grüße

      Enrico