Habe gerade einen Knoten im Kopf. JavaScript string mit Quotes

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Habe gerade einen Knoten im Kopf. JavaScript string mit Quotes

    Hi,

    irgendwie weiß ich gerade nicht wie ich das Problem lösen soll.

    Ich habe ein html input feld in das ich einen Text eingeben kann. Natürlich kann ich da auch Hochkommas und Anführungszeichen eingeben. Wenn ich das Formular dann abschicke baue ich mir in PHP einfach ein Array zusammen so in der Art

    Quellcode

    1. $params= array('id' => -1,'name1' => $_POST['myInputField'], ...


    Das gebe ich dann an meine PHP Klase welches das wiederum per PDO in eine mySQL Datenbank schreibt welche UTF8 kodiert ist. Soweit so gut. Dort steht dann auch das richtige drin.

    Nun muss ich aber das ja auch wieder auslesen und in eine javascript variable laden um damit weiter zu arbeiten. Also hole ich mir die Daten aus meiner PHP Klasse und habe dann den String in einer php variablen. Wenn ich jetzt aber versuche diesen Inhalt an eine javascript variable zu übergeben, dann habe ich verloren. Weil da ja dummerweise das " oder ' drin ist.

    Quellcode

    1. echo "var a="".$meineVar.'";";


    geht also nicht.

    Generell kann javascript aber ja strings mit Hochkomma. Wenn ich schreibe (Der einfacheit halber mal mit jquery syntax ansonsten oldscool dann mit document.getElementById)

    Quellcode

    1. var name=$('#meinTextFeld').val();


    dann kann ich das wunderbar mit alert() ausgeben und es stehen die ' und " drin.

    Wo ist denn nun mein Denkfehler?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Warum nicht als JSON bereitstellen und mit JavaScript abholen, wie man das normalerweise macht? Oh, warte, PHP, da ergibt ja nichts sinn :D

    OK, dann so (brrr, entschuldige, wenn ich PHP fehler mache)

    PHP-Quellcode

    1. <script type="text/x-data" id="meineVar"> <?php echo $meineVar; ?> </script>


    und dann einfach mit jQuery den inhalt von dem script holen.

    EDIT: Durch den type "text/x-data" interpretiert niemand (sprich, nicht der Browser) das Script-Tag. Script-Tags werden auch nicht angezeigt. So macht man es üblicherweise, wenn man grössere Datenmengen an JS übergeben will, und aus irgendwelchen Gründen JSON ned will
    EDIT2: Du solltest Sicherstellen, dass $meineVar kein "</script>" enthält. Ach halt, PHP. Da ignorier das, sonst kommst Du nicht auf genügend Schwachstellen in Deinem Code :P
    C++
  • Also langer Rede kurzer Sinn: Du hast einfach ein Problem mit Hochkomma-Escaping in JavaScript. Wie in so ziemlich allen Sprachen, die syntaktisch C-artig sind, kannst Du ein Hochkomma mit Backslash escapen. Das kannst Du entweder zu Fuß machen oder in PHP mit addslashes() – wobei dann auch Zollzeichen escaped würden, und das ist vermutlich nicht das, was Du willst, sofern Du Hochkomma als String-Delimiter verwendest.

    Carsten
  • little_pixel schrieb:

    Hallo Claus,

    echo ( "var a=".$meineVar );

    Das funktioniert nicht?

    Viele Grüße


    Hi Little,

    nein das kann es ja nicht. Das würde ja dann ein

    var a=test;

    ergeben wenn in $meineVar test drin steht. Es muss aber var a="test"; sein. Steht nun aber ein " in $meineVar, dann ergibt

    var a=\"".$meineVar."\";

    natuerlich dann

    var a=""";

    was für den Interpreter ein fehler ist. Das Ganze kannst du jetzt mit " und ' beliebig kombinieren und kommst trotzdem auf keinen grünen Zweig.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Warum musst du soetwas eigentlich machen? Das ist eigentlich etwas unsauber, die Daten in so ein "dynamisch generiertes Javascript" reinzuschreiben, irgendwann verwirrt das, wenn es das in großen Projekten mehrmals gibt, weil man nicht mehr weiß, was statisch aus dem Script kommt, und was dynamisch geladen wurde.

    Ich würde die Daten lieber per data- Attribut übertragen, im passenden DOM-Element.
  • Günther schrieb:

    Warum musst du soetwas eigentlich machen? Das ist eigentlich etwas unsauber, die Daten in so ein "dynamisch generiertes Javascript" reinzuschreiben, irgendwann verwirrt das, wenn es das in großen Projekten mehrmals gibt, weil man nicht mehr weiß, was statisch aus dem Script kommt, und was dynamisch geladen wurde.

    Ich würde die Daten lieber per data- Attribut übertragen, im passenden DOM-Element.


    Kannst du mit dazu mal einen link geben das ich weiß was du damit meinst?

    Oder irgendwie sonst kurz erklären?

    Danke

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • zerm schrieb:

    Er meint das, was ich fünf Posts weiter oben schon vorgeschlagen hatte. Nur schlechter.


    Hm ich kapier das aber nicht

    PHP-Quellcode

    1. <script type="text/x-data" id="meineVar"> <?php echo $meineVar; ?> </script>


    nehmen wir mal an in $meineVar wäre jetzt nur ein " drin. Dann würde aus Deiner Zeile

    Quellcode

    1. <script type="text/x-data" id="meineVar"> <"> </script>


    und das macht keine Probleme?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ich bin zunehmend konsterniert. Die Antwort auf die Frage ist trivial, aber es entstehen Diskussionen, als ginge es um wasweißichwas.

    Da meine abstrakte Beschreibung weiter oben offenbar nicht ankam, hier also nochmal zum Mitschreiben:

    PHP-Quellcode

    1. // Falls man " als JavaScript-String-Delimiter haben möchte
    2. printf(
    3. 'var jsVariable = "%s";' . "\n",
    4. str_replace('"', '\"', $myVariable)
    5. );
    6. // oder falls man ' als JavaScript-String-Delimiter haben möchte
    7. printf(
    8. "var jsVariable = '%s';\n",
    9. str_replace("'", "\\'", $myVariable)
    10. );
    Alles anzeigen


    Fertig. Inwiefern andere Ansätze stilistisch eleganter oder wartbarer sind, steht auf einem anderen Blatt (und ich würde das ohne Kontext nicht beurteilen wollen), aber zumindest ist das die Antwort auf das ursprüngliche Problem.
  • BlueM schrieb:

    Fertig

    Cool. Was ist, wenn $myVariable einen Backslash enthält?

    Sorry, fällt mir schwer mich in diese PHP-ich-hack-alles-irgendwie-zurecht reinzufinden. Stimmt. Keine grosse Diskussion um potentiell fragwürdige Daten, die auf der Webseite als JavaScript, also ausführbar, eingebettet werden. Dann würde man ja sonst auf die Idee kommen, andere Werkzeuge als PHP lieben zu lernen.
    C++
  • zerm schrieb:

    BlueM schrieb:

    Fertig

    Cool. Was ist, wenn $myVariable einen Backslash enthält?

    Sorry, fällt mir schwer mich in diese PHP-ich-hack-alles-irgendwie-zurecht reinzufinden. Stimmt. Keine grosse Diskussion um potentiell fragwürdige Daten, die auf der Webseite als JavaScript, also ausführbar, eingebettet werden. Dann würde man ja sonst auf die Idee kommen, andere Werkzeuge als PHP lieben zu lernen.


    Backslash geht übrigens auch mit json nicht.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • zerm schrieb:

    BlueM schrieb:

    Fertig

    Cool. Was ist, wenn $myVariable einen Backslash enthält?
    Korrekter Einwand. Kann man mal sehen, wie mich der Thread bereits verwirrt hat ;) Wenngleich es am prinzipiellen Sachverhalt nichts ändert, sprich: einfach das vergessene zusätzliche Escapen des Backslashes ergänzen.

    BTW: Von mir aus kannst Du PHP soviel bashen wie Du willst, ebenso wie jede andere Technologie. Aber da eigentlich nichts an diesem Thread PHP-spezifisch ist (die Frage hätte man sinngemäß genauso mit Java, Python, Groovy, Node.js o.ä. stellen können), wirkt Dein Herumreiten darauf etwas zwanghaft.

    Carsten
  • BlueM schrieb:

    gritsch schrieb:

    warum nicht einfach var x = unescape(<?=escape($phpvar)?>);

    Weil a) es keine native PHP-Funktion escape() gibt und b) es nichts zu unescapen gibt, da es lediglich um ein banales JavaScript-String-Literal geht.


    ja ist klar, hat nur an der tür geklingelt. korrekt wäre die urlencode() gewesen.
    dann hat man den vorteil dass man kein problem mit irgendwelchen sonderzeichen hat (oder kennst du die encoding des files und wie es dann vom browser gehandhabt wird etc) und eben auch um das problem mit quotes, single-quotes, backslashes, newlines, tabs etc zu umgehen.