molily: PHP array an javascript function übergeben

Beitrag lesen

Hallo,

ich habe jetzt jedoch das Problem das… der string der durch json_encode erzeugt wird, kommas enthält.

Ich fürchte, solange du dir einige Grundlagen nicht aneignest, wird es immer wieder »knallen« in deinem Code.

Du wurdest schon mehrfach darauf hingewiesen, dich in die Grundlagen eines Kontextwechsel einzulesen und dir jeweils den generierten HTML-Code anzusehen. Wenn ich mich recht entsinne, ist das schon der zweite oder dritte Thread von dir zum Thema, und wir sind noch keinen nennenswerten Schritt voran gekommen.

Die Leute hier würden nicht so darauf herumreiten, wenn dieses Verständnis nicht essentiell wichtig für die Webprogrammierung wäre. Es kann zu schwerwiegenden Programmfehlern und Sicherheitslücken führen, wenn diese Grundlagen nicht beachtet werden. Es kann gefährlich werden, wenn du PHP und JavaScript ohne diese Kenntnisse programmierst.

onclick=dasistdiejavascriptfunction($varibaleanjavascript, $variable2, $variable3)

Das ist problematisch und wird nicht funktionieren, klar, weil du den Kontextwechsel nicht beachtet hast.

Erst einmal solltest du dich mit den Grundlagen beschäftigen, dazu gibt es im SELFHTML-Wiki einen Artikel, der dir auch schon mehrfach gezeigt wurde:

http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

Du musst dir im Klaren sein, dass du hier verschiedene Sprachen verschachtelst (PHP, HTML, JavaScript) und jede Sprache in sich noch einmal aus Teilen besteht (u.a. PHP-Strings, HTML-Attribute, JavaScript-Strings). Immer wenn du gewisse Zeichenketten in eine Sprache einbettest, musst du sie kontextgerecht MASKIEREN.

HTML besteht z.B. aus Tags und Attributen. Je nachdem, an welcher Stelle du mit PHP HTML-Code generierst, musst du entsprechende Maskierungen vornehmen, damit der Inhalt »sicher« in die Sprache HTML überführt wird und selbst nicht als HTML verarbeitet wird (bzw. nur soweit du es willst).

Du willst hier JavaScript-Code (das ist JSON letztlich) in ein Attribut einfügen. Dieses Attribut ist ein Event-Handler, sein Inhalt wird also als JavaScript verarbeitet.

Erst einmal der HTML-Code:

<button title="">Button</button>

Attributwerte in HTML werden mit " oder ' begrenzt. Diese Begrenzer dürfen schon einmal nicht unmaskiert im Attributwert vorkommen, sonst wird der Attributwert beendet. Beispiel (fehlerhafter Code!):

<button title="Sie fragte: "Wo geht’s hier zum Bahnhof?"">Button</button>

Das title-Attribut hat den Wert »Sie fragte: «, danach versucht der fehlertolerante HTML-Parser aus den restlichen Worten neue Attribute zu bauen. Es kommt ungefähr dieser Quatsch hier heraus:

<button title="Sie fragte: " wo="" geht’s="" hier="" zum="" bahnhof?""="">Button</button>

Wenn die Begrenzer im Attributwert vorkommen sollen, müssen sie maskiert werden. D.h. sie werden durch harmlose Zeichen ersetzt, die vom Browser wieder zurückübersetzt werden. In HTML ist das durch http://de.selfhtml.org/html/referenz/zeichen.htm@title=Zeichenreferenzen möglich. Beispiel:

' wird durch &apos; ersetzt
" wird durch &quot; ersetzt

(gibt noch weitere Möglichkeiten, die ich hier einmal verschweige)

Anwendung:

<button title="Sie fragte: &quot;Wo geht’s hier zum Bahnhof?&quot;">Button</button>

Wenn du HTML-Code in PHP generierst, dann kannst du diese Ersetzung mithilfe einer Funktion vornehmen:

http://php.net//manual/de/function.htmlspecialchars.php

Falls dir diese Funktion noch nicht in Fleisch und Blut übergegangen ist, solltest du dir vielleicht noch einmal ein PHP-Grundlagenbuch zu Gemüte führen. Es ist eine der wichtigsten Funktionen in PHP (zumindest wenn mit PHP direkt HTML generiert wird).

Anwendungsbeispiel:

<?php  
[code lang=php]$title = 'Sie fragte: "Wo geht’s hier zum Bahnhof?"';  
$masked_title = htmlspecialchars($title);  

~~~?>  
<button title="<?php echo $masked\_title ?>">Button</button>[/code]  
  
HTML-Ausgabe:  
  
`<button title="Sie fragte: &quot;Wo geht’s hier zum Bahnhof?&quot;">Button</button>`{:.language-html}  
  
Das Einbetten von JavaScript in HTML-Attribute funktioniert ähnlich.  
  
~~~html
<?php  
[code lang=php]// PHP-Array, der ans JavaScript weitergegeben wird  
$array = array("kleiner Bär", "kleiner Tiger", "Tigerente", "\"Quatsch\", 'mit Soße'");  
// In einen JSON-String umwandeln (das ist gültiger JavaScript-Code)  
$json = json_encode($array);  
// Dann HTML-maskieren, da es in den Kontext eines HTML-Attributs eingebettet wird  
$masked_json = htmlspecialchars($json);  

~~~?>  
<script>  
~~~javascript
// JavaScript-Funktion, den den Array entgegen nimmt  
function output (array) {  
  alert(array[0]);  
}  

~~~</script>  
<button onclick="output(<?php `echo $masked_json`{:.language-php} ?>)">Button</button>[/code]  
  
Das generierte HTML:  
  
`<button onclick="output([&quot;kleiner B\u00e4r&quot;,&quot;kleiner Tiger&quot;,&quot;Tigerente&quot;,&quot;\&quot;Quatsch\&quot;, 'mit So\u00dfe'&quot;])">Button</button>>`{:.language-html}  
  
Sieht wirr aus, ist aber nötig, weil hier mehrere Sprachen verschachtelt sind und mehrere Maskierungen nötig sind.  
  

> Muss ich das dann irgendwie pharsen  
  
»Pharsen« gibt es nicht, es gibt »parsen«, das [bedeutet aber etwas anderes](http://de.wikipedia.org/wiki/Parser).  
  

> oder kann ich die json-trennzeichen (anstatt kommas z.b. zwei --) ändern?  
  
JSON ist immer gleich aufgebaut und nutzt immer dieselben Trennzeichen, das ist der Vorteil von JSON.  
  
Um solchen Privatunterricht zu PHP-Grundlagen zu vermeiden, gibt es unzählige Fachartikel und Bücher zum Thema, die du bitte lesen mögest.  
  
Grüße  
Mathias

-- 
[Chaplin.js - JavaScript application architecture on top of Backbone.js](http://chaplinjs.org/)
0 48

PHP array an javascript function übergeben

javascriptnewbie
  • javascript
  1. 0
    dedlfix
  2. 0
    Der Martin
    1. 0
      molily
    2. 0
      javascriptnewbie
      1. 0
        M.
        1. 0

          Gute Idee

          Tom
          • menschelei
      2. 1
        ChrisB
        1. 0
          javascriptnewbie
          1. 0
            molily
            1. 0
              javascriptnewbie
              1. 0
                M.
              2. 6
                molily
      3. 0
        Tom
        1. 0
          javascriptnewbie
          1. 0
            Tom
            1. 0
              Sven Rautenberg
              1. 0

                Nicht nur meckern, zeigen! Escaping für JavaScript-Variablen

                Tom
                1. 0
                  molily
                  1. 0
                    tami
                    1. 0
                      molily
                      1. 0
                        tami
                  2. 0
                    Tom
                    1. 0
                      molily
              2. 0

                PHP json_encode - kontextspezifisches Escaping

                tami
                1. 0
                  tami
                  1. 0
                    molily
                    1. 0
                      Sven Rautenberg
                      1. 0
                        molily
                        1. 0
                          molily
                        2. 0

                          JSON in HTML einbetten

                          molily
                          1. 1

                            JSON in HTML einbetten - RoR "vs" ZF

                            tami
                            1. 0
                              tami
                              1. 0
                                Tom
                                1. 0
                                  molily
                            2. 0
                              molily
                              1. 0
                                tami
                                1. 0
                                  tami
                              2. 0

                                JSON-Paket mit composer vom Zend Framework holen

                                tami
                              3. 2

                                JSON in HTML einbetten

                                molily
                                • php
                          2. 0

                            Reihenfolge der Auswertung?

                            Tom
                            1. 0
                              tami
                            2. 0
                              tami
                            3. 0

                              Reihenfolge der Auswertung? Codierung, kleine Korrektur

                              Tom
                            4. 0
                              molily
                              1. 0
                                Tom
                                1. 0
                                  molily
                  2. 0
                    Tom