dadprof: Javascript übernimmt richtige Variable gibt sie aber falsch aus

Hallo liebe Coder!

Vorab, ich habe von Javascript keinen Dunst, ich kann nur php! Und ja, ich habe Google bemüht um eine Lösung für mein Problem zu finden. Leider nichts passendes gefunden (was wohl an meiner Ahnungslosigkeit über js hängt)

Also: ich schreibe momentan ein Forum. php, html, css alles okay. Das habe ich drauf. Bisweilen stößt man aber an Grenzen. Nämlich dann, wenn man ein Javascript braucht und es nicht drauf hat! So wie ich :D

Ich habe für die Ausgabe der Postings (immer 15 pro Seite) eine php-wihle-Schleife (logisch)... Angemeldete User haben dabei auch die Möglichkeit sich VIA PN zu unterhalten. Dazu gibt es unter dem Usernamen eine Link. Da klickt man drauf und es öffnet sich ein Popup worin sich der Bereich zum lesen/schreiben befindet.

Ich bevorzuge dieses System da noch Funktionen geplant sind bei denen man nicht dauernd zwischen Posteingang und einer anderen Seite hin und her wechseln will. Bspw. Chat...

Nun habe ich den Link momentan so, dass VIA php der Username an die url angehängt wird:

<a class="pnlink" target="popup" onclick="window.open('','popup','scrollbars=yes,width=480,height=550,left=850,top=80')" href="hier wäre die url">PN</a>

Bei dieser Variante verzichte ich auf ein weiteres Javascript. Problem dabei ist, dass man damit immer nur EIN Fenster offen haben kann, sofern man ein anderen User anschreiben will wird das aktuelle Fenster reloaded und man schreibt da weiter. Das ist natürlich nicht im Sinn des Erfinders...

Mache ich es :

<a class="pnlink" href="javascript:pn('".$to_user."', '".$to_id."')">PN</a>

kann ich zwar so viele Fenster öffnen wie ich will, ohne dass das aktuelle überschrieben wird aber es öffnet sich immer nur ein Fenster zu einen bestimmten User, niemals zu dem User den ich eben angeklickt habe. Für diese Variante habe ich ein Javascript, und Ahnungslos wie ich bin, habe ich es auf php geparst damit ich die gesendeten Variablen (username, userid) verabreiten kann.

Dumm nur, dass das nicht funktioniert -.-

  
<?php  
         header("Content-type: application/javascript");  
  
         include_once('../include/url.php');  
  
         $to_user = $_GET['to'];  
         $to_id = $_GET['id'];  
         $_send = "/pn/to-".$to_user."";  
?>  
var username = '<?php echo $to_user;?>';  
var userid = '<?php echo $to_id;?>';  
  
function pn(){  
  window.open("<?php echo $_send;?>", "", "scrollbars=yes,width=500,height=550,left=850,top=80");  
}  

Das wäre der Code zur pn.js.php. diese ist in jedem Post nach dem PN-Link hinterlegt. Im QC ist die Zuordnung (pn.js.php?to=username&id=id) vollkommen richtig! Jedoch öffnet sich das Fenster immer mit demselben User!

Jetzt meine Frage: woran kann das liegen?

P.S. ich würde diese Variante (<a class="pnlink" href="javascript:pn('".$to_user."', '".$to_id."')">PN</a>) bevorzugen da sie einen kürzeren Quelltext erzeugt und weil ich damit mehrere Fenster öffnen kann.

Bitte schlagt mich nicht, ich habe echt keinen Plan von js!!!! :D

  1. Hallo,
    <a class="pnlink" target="popup" onclick="window.open('','popup','scrollbars=yes,width=480,height=550,left=850,top=80')" href="hier wäre die url">PN</a>

    Bei dieser Variante verzichte ich auf ein weiteres Javascript. Problem dabei ist, dass man damit immer nur EIN Fenster offen haben kann, sofern man ein anderen User anschreiben will wird das aktuelle Fenster reloaded und man schreibt da weiter. Das ist natürlich nicht im Sinn des Erfinders...

    Dein Fenstername ist immer gleich "popup", deswegen wird der Inhalt auch immer im selben Fenster geladen.
    Wenn Du mehrere Fenster öffnen willst, musst Du nur dafür sorgen, dass sie jeweils unterschiedlich heissen. Du könntest z.b. die User-ID des jeweiligen Users anhängen:

      
    $userId = ... (Irgendwie die User-ID ermitteln)... ;  
    echo "<a class=\"pnlink\" target=\"popup".$userId."\" onclick=\"window.open('','popup','scrollbars=yes,width=480,height=550,left=850,top=80')\" href=\"hier wäre die url\">PN</a>";  
    
    

    Das sollte funktionieren.

    Zu Deiner anderen Lösung:
    Ich nehme an, Du führst Deinen Code-Block

      
     <?php  
              header("Content-type: application/javascript");  
      
              include_once('../include/url.php');  
      
              $to_user = $_GET['to'];  
              $to_id = $_GET['id'];  
              $_send = "/pn/to-".$to_user."";  
     ?>  
     var username = '<?php echo $to_user;?>';  
     var userid = '<?php echo $to_id;?>';  
      
     function pn(){  
       window.open("<?php echo $_send;?>", "", "scrollbars=yes,width=500,height=550,left=850,top=80");  
     }  
    
    

    mehrfach hintereinander aus, sehe ich das richtig? Also Du hast irgendwie sowas in Deiner Seite:

      
     ...  
     var username = 'Peter';  
     var userid = '4711';  
      
     function pn(){  
       window.open("/pn/to-Peter", "", "scrollbars=yes,width=500,height=550,left=850,top=80");  
     }  
      
     var username = 'Paul';  
     var userid = '4712';  
      
     function pn(){  
       window.open("/pn/to-Paul", "", "scrollbars=yes,width=500,height=550,left=850,top=80");  
     }  
    ...  
    
    

    In diesem Fall hast Du das Problem, dass Deine "pn()"-Funktion jedesmal überschrieben wird. Du erzeugst zwar zunächst eine Funktion "pn()" für den user "Peter", aber im nächsten Moment wird sie (aus JavaScript-Sicht) durch eine Funktion für den User "Paul" ersetzt.

    Sinnvoll wäre es, Deine PN-Funktion nur einmal in der Seite zu definieren. Wenn Du sie so wie oben beschreiben verwenden willst, benötigt sie noch zwei Parameter, username und userid

      
    function pn(username, userid) {  
       window.open("/pn/to-"+username, "", "scrollbars=yes,width=500,height=550,left=850,top=80");  
    
    

    Jetzt kannst Du in der Schleife über Deine Posts gehen und jedesmal die entsprechende Funktion aufrufen:

      
    <a class="pnlink" href="javascript:pn('".$to_user."', '".$to_id."')">PN</a>  
    
    

    Das sollte gehen (alles ohne Gewähr). Hoffe das hilft Dir weiter.

    Viele Grüße,
    Jörg

    PS:

      
     $to_user = $_GET['to'];  
     $to_id = $_GET['id'];  
     $_send = "/pn/to-".$to_user."";  
    
    

    Grundsätzlich aufpassen, wenn Du PHP Variablen direkt aus dem GET- oder POST-String entnimmst und diese 1:1 in den Output schreibst! Bedenke, dass bösillige Menschen Dir  beliebige Parameter für Dein "to" und "id" unterjubeln können. Sofern irgendwie möglich, immer escapen und validieren.

    Viele Grüße,
    Jörg

    1. Hallo Jörg,

      danke erstmal für deine Antwort! ich werde beide Möglichkeiten sofort testen, ich gebe selbstredend bescheid! :)

      Dein Fenstername ist immer gleich "popup", deswegen wird der Inhalt auch immer im selben Fenster geladen.
      Wenn Du mehrere Fenster öffnen willst, musst Du nur dafür sorgen, dass sie jeweils unterschiedlich heissen. Du könntest z.b. die > User-ID des jeweiligen Users anhängen:

      $userId = ... (Irgendwie die User-ID ermitteln)... ;
      echo "<a class="pnlink" target="popup".$userId."" > onclick="window.open('','popup','scrollbars=yes,width=480,height=550,left=850,top=80')" href="hier wäre die url">PN</a>";

        
      Dass es daran liegt, dass das Popupfenster immer wegen dem Target überschrieben wird wusste ich gar nicht. Ich dachte, dass das nur ein Atribut ist um dem html-Teil zu sagen "mach nen Popup auf". Schande über mich :D  
        
        
        
      
      > Zu Deiner anderen Lösung:  
      > Ich nehme an, Du führst Deinen Code-Block  
      >   
      > ~~~php
        
      
      >  <?php  
      >           header("Content-type: application/javascript");  
      >   
      >           include_once('../include/url.php');  
      >   
      >           $to_user = $_GET['to'];  
      >           $to_id = $_GET['id'];  
      >           $_send = "/pn/to-".$to_user."";  
      >  ?>  
      >  var username = '<?php echo $to_user;?>';  
      >  var userid = '<?php echo $to_id;?>';  
      >   
      >  function pn(){  
      >    window.open("<?php echo $_send;?>", "", "scrollbars=yes,width=500,height=550,left=850,top=80");  
      >  }  
      > 
      
      

      mehrfach hintereinander aus, sehe ich das richtig? Also Du hast irgendwie sowas in Deiner Seite:

      ...
      var username = 'Peter';
      var userid = '4711';

      function pn(){
         window.open("/pn/to-Peter", "", "scrollbars=yes,width=500,height=550,left=850,top=80");
      }

      var username = 'Paul';
      var userid = '4712';

      function pn(){
         window.open("/pn/to-Paul", "", "scrollbars=yes,width=500,height=550,left=850,top=80");
      }
      ...

      
      >   
      >   
      > In diesem Fall hast Du das Problem, dass Deine "pn()"-Funktion jedesmal überschrieben wird. Du erzeugst zwar zunächst eine Funktion "pn()" für den user "Peter", aber im nächsten Moment wird sie (aus JavaScript-Sicht) durch eine Funktion für den User "Paul" ersetzt.  
      >   
      > Sinnvoll wäre es, Deine PN-Funktion nur einmal in der Seite zu definieren. Wenn Du sie so wie oben beschreiben verwenden willst, benötigt sie noch zwei Parameter, username und userid  
      >   
      > ~~~javascript
        
      
      > function pn(username, userid) {  
      >    window.open("/pn/to-"+username, "", "scrollbars=yes,width=500,height=550,left=850,top=80");  
      > 
      
      

      Jetzt kannst Du in der Schleife über Deine Posts gehen und jedesmal die entsprechende Funktion aufrufen:

      <a class="pnlink" href="javascript:pn('".$to_user."', '".$to_id."')">PN</a>

      
      >   
      > Das sollte gehen (alles ohne Gewähr). Hoffe das hilft Dir weiter.  
      >   
      > Viele Grüße,  
      > Jörg  
      >   
      > PS:  
      > ~~~php
        
      
      >  $to_user = $_GET['to'];  
      >  $to_id = $_GET['id'];  
      >  $_send = "/pn/to-".$to_user."";  
      > 
      
      

      Grundsätzlich aufpassen, wenn Du PHP Variablen direkt aus dem GET- oder POST-String entnimmst und diese 1:1 in den Output schreibst! Bedenke, dass bösillige Menschen Dir  beliebige Parameter für Dein "to" und "id" unterjubeln können. Sofern irgendwie möglich, immer escapen und validieren.

      Viele Grüße,
      Jörg

      Ja, das Script wird tatsächlich in jedem Beitrag ausgeführt. Ich nahm an, es mache mehr Sinn das .js in die php-while zu legen damit das Script auch tatsächlich von jedem Beitragschreiber die Daten bekommt. Hm, so kann man sich irren -.-

      Wäre es aus der Sicht besser das Javascript in den Headbereich zu legen oder irgendwo an das Ende der Seite? Ich denke, das Script kann nur dann Daten annehmen wenn sie bereits da sind. Das war auch der Grund warum es mit in die Schleife gelegt habe.

      Gut, ich ändere die Fehler und gebe dann nochmals bescheid!

      P.S.
      Stimmt, ich habe tatsächlich vergessen die ID und den Usernamen zu escapen :D Merci

    2. Jörg, ich bedanke mich recht herzlich! Beide Möglichkeiten funktionierten im ersten Durchlauf perfekt!

      Für diese Möglichkeit:

      echo "<a class=\"pnlink\" target=\"popup".$userId."\" onclick=\"window.open('','popup','scrollbars=yes,width=480,height=550,left=850,top=80')\" href=\"hier wäre die url\">PN</a>";

      musste ich die User-Id noch mit in das zweite Popup-Atribut legen. aber ich nehme doch die die andere Variante, der QC ist dadurch um einiges kürzer. Eingesparte Zeichen, inklusive des sich nicht mehr in der Schlefei befindlichen Scriptes etwa 20kb!!!!!

      Nochmals, herzlichen Dank!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :D