Aki: ? maskieren in url für javascript

ich muss in einem Javascript eine komplexere URL übergeben

$("#refresh").load('test.php?' + 1*new Date());

Mein Problem ist, das ja PHP das erste Fragezeichen für seine ULR braucht aber eben auch das Javacript script.

test.php?a=1&b=2

Wie kann ich das erste ? das nach dem PHP maskieren, so das die übergabe funktioniert?

  1. Lieber Aki,

    ich muss in einem Javascript eine komplexere URL übergeben

    OK.

    $("#refresh").load('test.php?' + 1*new Date());

    Das verstehe ich nicht. Das sollte eine URL in dieser Art ergeben: https://example.org/test.php?1507303299065

    Mein Problem ist, das ja PHP das erste Fragezeichen für seine ULR braucht aber eben auch das Javacript script.

    Nein, Dein Problem ist, dass Du nicht verstanden hast, wie man Parameter übergibt!

    test.php?a=1&b=2

    Aha! Und wo siehst Du bei Deiner von JavaScript erzeugten URL einen Schlüsselnamen (wie a und b in Deinem Beispiel)? Eben! Du solltest Deinem Zeitstempel noch einen Namen geben:

    $("#refresh").load('test.php?time=' + 1*new Date());
    

    Jetzt kann PHP mit dem Schlüssel time Deinen in JavaScript erzeugten Sekundenwert "verstehen", allerdings musst Du PHP erst erklären, dass JavaScript auch Millisekunden dranschreibt - also für PHP die letzten drei Stellen einfach streichen.

    Wie kann ich das erste ? das nach dem PHP maskieren, so das die übergabe funktioniert?

    Die Übergabe scheitert nicht am "ersten ?", sondern am fehlenden Schlüssel. Fragezeichen und alles andere maskiert man in JavaScript mit encodeURI.

    Liebe Grüße,

    Felix Riesterer.

    1. Hallo Felix,

      da liegst Du nicht ganz richtig. Grundsätzlich gibt RfC 3986 für den Query-Teil einer URI kein spezielles Format vor. Key-Value Paare sind ÜBLICH, aber keine Pflicht.

      Mit Key-Value Paaren macht man sich in PHP allerdings das Leben leichter, weil man dann direkt mit den $_GET-Einträgen hantieren kann, statt $_SERVER['QUERY_STRING'] von Hand zu interpretieren. Im hier gezeigten Fall ist der Sinn des angehängten Date-Wertes aber wohl eher, ein Caching zu verhindern; der Server dürfte sich also den übergebenen Wert nicht interessieren.

      Wenn also nur das Date anzuhängen ist, sollte der vom OP gezeigte Code in dieser Form keinerlei Probleme auslösen.

      Wenn mehre Parameter übergeben werden sollen, kann man den Anti-Cache Wert als erstes oder letztes setzen, auch mittendrin.

      http://www.example.org/test.php?439830423&a=3&b=4
      http://www.example.org/test.php?a=3&439830423&b=4
      http://www.example.org/test.php?a=3&b=4&439830423
      

      PHP stellt für alle 3 URL in _GET die Keys "a", "b" und "439830423" bereit. "a" mit Wert 3, "b" mit Wert 4, "439830423" mit Wert null. Aber letzterer interessiert ja keinen :)

      Insofern - Aki - wenn Du ein Problem hast, liegt es möglicherweise woanders. Was genau funktioniert bei Dir nicht? Steht was in der Console oder im Netzwerktrace der Browser- Entwicklerwerkzeuge?

      Das Thema "Cache aushebeln" kann man übrigens auch mit einem POST-Request lösen. POST wird nicht gecached. Den Umweg mit einem variierenden Query-String muss man nur nehmen, wenn man auf die verwendete HTTP Methode keinen Einfluss hat oder wenn der Server einen Cache für POST-Requeste hat.

      Mit POST geht es so:

      $.post("test.php", returnHandler);
      // oder mit Parametern:
      $.post("test.php", { a:3, b:4}, returnHandler);
      
      function returnHandler(data) {
         $("#refresh").html(data);
      }
      

      Die Funktion, die die Rückgabe annimmt, kann man auch anonym und inline notieren. Man muss dann aber gut mit den Klammern aufpassen (oder mit LISP aufgewachsen sein):

      $.post("test.php", { a:3, b:4}, function (data) { $("#refresh").html(data); });
      

      Rolf

      --
      sumpsi - posui - clusi
  2. Hallo Aki,

    ich glaube, ich habe gerade erst dein Problem verstanden. Du fragst Dich, wie Du das Date und die beiden anderen Parameter gemeinsam übergibst.

    Letztlich steht's schon in meiner Antwort an Felix - aber hier nochmal kompakt: Das Prinzip ist, dass man mit dem Fragezeichen die Query-Parameter einleitet und dann die Parameter voneinander durch & trennt. Wenn Du also schon mit ? den Date-Wert angehängt hast, folgen die übrigen Parameter mit &. Wenn Du zuerst die übrigen Parameter anhängst, folgt der Date-Wert mit & statt ?.

    Du musst also kein ? maskieren, sondern durch & ersetzen.

    Alternativ nimm das Parameterobjekt, dann kümmert sich jQuery drum. Ich habe es im anderen Beitrag nur im Post benutzt, das geht auch im Load:

    $("#refresh").load("test.php", { a: 3, b: 8, time: Date.now() });
    

    Date.now() ist die modernere Alternative zu 1*new Date(). Funktioniert nur nicht bei älteren Internet Explorern (vor Version 9). Musst Du wissen, ob Du die supporten willst.

    Rolf

    --
    sumpsi - posui - clusi