Linuchs: Hochkomma über mehrere Kontextwechsel bringen

Hallo,

ein input-Feld für Namen enthält die Angaben

onkeyup   = "holeVorschlaege('[HOST]',this.id,this.value)"
onblur    = "loescheVorschlaege(this.id)"

Da werden bis zu fünf Vorschläge per Ajax geholt. Namen wie O'Nelly, also die Hochkommata machen Probleme. Es gibt auch Namen mit "

PHP sendet den kompletten Inhalt des Vorschlags-Containers, inklusive Javascript-Code, bei Klick den Namen ins input-Feld zu kopieren. Das gibt Probleme:

onclick="document.getElementById('name').value='O'Nelly'; 

Dass ich den Namen so schicke, imponiert Javascript überhaupt nicht:

echo ... htmlspecialchars($treffer['firma1'],ENT_QUOTES) ...

Ich müsste mit PHP für Javascript so etwas machen wie

 value='name.replace(/'/g, ''')'

Aber beim besten Willen, wie pfriemel ich das in diese PHP-Zeile? Die Hochkommas treten sich ja geradezu auf die Füße. Mal sind sie Daten, mal gehören sie zum Javascript-Code und dann wieder zum PHP-Code:

echo "<span onClick=\"".$klick."\">";
echo htmlspecialchars($treffer['firma1'],ENT_QUOTES);
echo " &nbsp; ".$treffer['land_kz']."-".$treffer['plz']." ".$treffer['ort_name'];
echo "</span><br>\n";

Ich glaube, ich denke zu viel um die Ecke, vielleicht ist's ja ganz einfach.

Linuchs

  1. bin jetzt tatsächlich etwas durch den Wind und habe die entscheidende PHP Zeile vergessen anzuzeigen:

    $klick.= "if(document.getElementById('".$arr_in['feld_id']."'))
            document.getElementById('".$arr_in['feld_id']."').value='".htmlspecialchars($treffer['firma1'],ENT_QUOTES)."'; ";
    

    Also hier weist PHP Javascript an, den Namen O'Nelly ins input-Feld zu übertragen. Bei Klick gibt das den Javascript-Fehler ; erwartet an Stelle des N

    Linuchs

    1. Servus Linuchs

      $klick.= "if(document.getElementById('".$arr_in['feld_id']."'))
              document.getElementById('".$arr_in['feld_id']."').value='".htmlspecialchars($treffer['firma1'],ENT_QUOTES)."'; ";
      

      Nur ein Tipp am Rande:

      Bei Änderungen am Javascript- oder PHP-Code wirst du früher oder später die Krise bekommen. Den Code so zu vermischen macht dir nicht nur jetzt Probleme mit dem Kontextwechsel, es wird dir auch in Zukunft die Nerven rauben, wenn andere Änderungen gemacht werden sollen.

      ciao

      P.S.: @Matthias Apsel in der Vorschau kann ich den waagerechten Scrollbalken nicht benutzen. Google Chrome Version 44.0.2403.107 m (64-bit)

      --
      "Sir, we are surrounded!" - "Excellent! We can attack in any direction!"
      1. Hallo henman,

        P.S.: @Matthias Apsel in der Vorschau kann ich den waagerechten Scrollbalken nicht benutzen. Google Chrome Version 44.0.2403.107 m (64-bit)

        Tritt das auch bei anderen Browsern auf? Ich konnte das bei mir noch nicht feststellen. Danke dennoch für diese Info. @Christian Kruse ist der Entwickler des Forums. Durch diese Notifikation weiß er dann jetzt auch Bescheid

        Bis demnächst
        Matthias

        --
        Signaturen sind bloed (Steel) und Markdown ist mächtig.
        1. Servus Matthias

          Tritt das auch bei anderen Browsern auf? Ich konnte das bei mir noch nicht feststellen.

          Ich muss mich etwas korrigieren. Ich kann den waagerechten Scrollbalken der Code-Box nicht benutzen, auch jetzt nicht. Im Firefox funkioniert es wie gewünscht, im IE 11 wird umgebrochen.

          Bis bald! Otto

          --
          "Sir, we are surrounded!" - "Excellent! We can attack in any direction!"
          1. Servus henman

            Ich muss mich etwas korrigieren.

            Jetzt habe ich noch etwas genauer hingeschaut. Nur die Code-Box innerhalb eines Zitats ist betroffen. Der Scrollbalken ist vorhanden, benutzen kann ich ihn aber nur, wenn ich die Maus ein paar Pixel darüber halte. Wenn ich die "white-space"-Eigenschaft des code-Elements ent- und wieder hinzuferne, kann ich den Scrollbalken auch normal benutzen.

            Bis bald! Otto

            huch

            ciao

            --
            "Sir, we are surrounded!" - "Excellent! We can attack in any direction!"
  2. @@Linuchs

    Da werden bis zu fünf Vorschläge per Ajax geholt. Namen wie O'Nelly, also die Hochkommata machen Probleme.

    Tja, das gehört auch kein ' rein, sondern ein Apostroph: O’Nelly. Aber für Nutzereingaben kannst du nichts.

    Das gibt Probleme:

    onclick="document.getElementById('name').value='O'Nelly'; 
    

    JavaScript-Code hat in HTML nichts zu suchen. Die Probleme sind hausgemacht.

    Verwendent keine on…-Attribute, sondern registriere Eventhandler im JavaScript-Code per addEventListener.

    echo ... htmlspecialchars($treffer['firma1'],ENT_QUOTES) ...
    

    Damit sollten ' und " escapet werden, AFAIS.

    echo "<span onClick=\"".$klick."\">";
    

    Es gibt keinen guten Grund dafür, Markup mit echo zu generieren.

    PHP in HTML schachteln, nicht andersrum:

    <span onclick="<?php echo $klick; ?>">
    

    oder kurz

    <span onclick="<?= $klick ?>">
    

    Und schon müssen auch keine " als \" escapet werden.

    Zu onclick gilt allerdings das oben Gesagte.

    LLAP 🖖

    --
    Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
    1. echo "<span onClick=\"".$klick."\">";
      

      Es gibt keinen guten Grund dafür, Markup mit echo zu generieren.

      Das ist die Ausgabe, auf die Ajax wartet. Es ist ein Schnipsel, das beim Client in eine HTML-Seite eingebaut wird. Wie würdest du das senden?

      Linuchs

      1. @@Linuchs

        Das ist die Ausgabe, auf die Ajax wartet. Es ist ein Schnipsel, das beim Client in eine HTML-Seite eingebaut wird. Wie würdest du das senden?

        Ich verstehe nur Bahnhof. Kann an mir liegen – oder daran, dass du immerzu „Bahnhof“ sagst.

        LLAP 🖖

        --
        Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
  3. Tach!

    Dass ich den Namen so schicke, imponiert Javascript überhaupt nicht:

    echo ... htmlspecialchars($treffer['firma1'],ENT_QUOTES) ...
    

    Das ist ja auch die funktion htmlspecialchars() und nicht javascriptspecialchars(). Für Javascript gibt es in PHP auch keine direkte Maskierfunktion. (Man kann wohl aber im einfachsten Fall json_encode() verwenden, hab ich mir sagen lassen.)

    Ich müsste mit PHP für Javascript so etwas machen wie

     value='name.replace(/'/g, '&apos;')'
    

    Nein, gültige Javascript-Stringliterale erzeugen würde fürs erste reichen. Anschließend HTML beachten.

    Aber beim besten Willen, wie pfriemel ich das in diese PHP-Zeile? Die Hochkommas treten sich ja geradezu auf die Füße. Mal sind sie Daten, mal gehören sie zum Javascript-Code und dann wieder zum PHP-Code:

    Deswegen löst man da Ganze ja auch am besten von innen auf. Erstmal den Javscript-Kontext durchnehmen und die Sonderzeichen entsprechend behandeln. Dann eine Ebene höher gehen. Hier muss man dann alle Zeichen einzeln betrachten, ohne zu berücksichtigen, welche Bedeutung sie für das System darunter haben. Also \' ist einfach nur ein Backslash und ein Hochkomma. Wenn es für den Backslash eine Regel gibt, dann wendet man sie auf ihn an, wenn es eine Regel für das Hochkomma gibt, wendet man die an. Das kann dann durchaus auch mal ein \\\' ergeben.

    Und dann wieder eine Ebene weiter nach außen nach demselben Prinzip. Man kann sich das Ganze nur dann etwas abkürzen, wenn man geschickt " und ' mischt, und so ein paar Maskierungen einsparen.

    Am besten du liest dir mal den Kontextwechselartikel im Wiki durch, da ist das alles erklärt.

    dedlfix.

  4. nach mehr als 3 Std Probiererei hab' ich's.

    Javascript hätte die Maskierung gerne mit \' - das lässt HTML unverändert (im Gegenteil zu &#039; oder &apos;) und nach dem JS-Kopiervorgang ins input-Feld ist der Rückwärtsschrägstrich wie von Zauberhand verschwunden:

    Server:

    $firma = addslashes( $treffer['firma1'] );
    ...
    $klick.= "if(document.getElementById('".$arr_in['feld_id']."'))
            document.getElementById('".$arr_in['feld_id']."').value='".$firma."'; ";
    

    Kommt so beim Client an:

    <span onclick="if(document.getElementById('firma1_a_adr_id')) document.getElementById('firma1_a_adr_id').value='0'; if(document.getElementById('firma1_a_int_id')) document.getElementById('firma1_a_int_id').value='471'; if(document.getElementById('firma1_a')) document.getElementById('firma1_a').value='Käpt\'n Bligh'; ">0, 471, Käpt'n Bligh   D-26954 Nordenham</span>
    

    Und so sieht's im input-Feld 'firma1_a' aus:

    Käpt'n Bligh

    Linuchs

    1. zur Foren-Software:

      Ich gebe einen Rückwärtsschrägstrich und ein Hochkomma ein: '

      Zu sehen ist nur das Hochkomma.

      Und den Tag-Vorschlag "zu diesem forum" kann ich auch nicht wählen

      1. Hi,

        zur Foren-Software:

        Ich gebe einen Rückwärtsschrägstrich und ein Hochkomma ein: '

        Zu sehen ist nur das Hochkomma.

        Weil Kramdown das Hochkomma frißt.

        Und den Tag-Vorschlag "zu diesem forum" kann ich auch nicht wählen

        Tags sind zwar nicht wie der Highlander (es kann nur einen geben), aber wie der Dreiländer (es kann nur drei geben). Du müßtest eines der anderen Tags entsorgen.

        cu,
        Andreas a/k/a MudGuard

        1. @@MudGuard

          Ich gebe einen Rückwärtsschrägstrich und ein Hochkomma ein: '

          Zu sehen ist nur das Hochkomma.

          Weil Kramdown das Hochkomma frißt.

          Diesem Kramdown müsste man einen Maulkorb anlegen.

          Und das meine ich ernst.

          LLAP 🖖

          --
          Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
      2. Hallo Linuchs,

        Ich gebe einen Rückwärtsschrägstrich und ein Hochkomma ein: '

        Zu sehen ist nur das Hochkomma.

        Hier gilt dasselbe, wie für php und JavaScript. Der Backslash ist ein Sonderzeichen und muss maskiert werden.

        • \'
        • \'

        Zudem könntest du die Eingabe auch als Code kennzeichnen.

        Und ich bin gegen einen Maulkorb für Kramdown. Hilfestellung gibt es auch im Wiki.

        Bis demnächst
        Matthias

        --
        Signaturen sind bloed (Steel) und Markdown ist mächtig.
        1. @@Matthias Apsel

          Zudem könntest du die Eingabe auch als Code kennzeichnen.

          Dass man das KÖNNTE, ist gut und schön. Dass man das MUSS, ist das Problem.

          Und ich bin gegen einen Maulkorb für Kramdown. Hilfestellung gibt es auch im Wiki.

          Wir wissen alle, dass Fragende Hilfeseiten genauso wenig lesen wie die Charta.

          Das Problem ist, dass Kramdown nicht progressive enhancement[^1] ist, sondern zwingend notwendig, damit Postings nicht verstümmelt werden.

          Wenn Code verstümmelt wird, werden Antwortende das Problem des Fragenden nicht erkennen und falsche Antworten geben, die das Problem nicht lösen.

          Am Ende ist der Fragende frustriert und kippt seinen Frust ungefiltert hier ins Forum. Was die Antwortenden frustriert. Dann bemerken sie, dass sie ihre Zeit verschwendet haben, da das Problem ganz woanders lag und sind dann doppelt frustriert.

          Und das alles wegen dieses zweifelhaften Forums-Features.

          LLAP 🖖

          --
          Ist diese Antwort anstößig? Dann könnte sie nützlich sein. [^1]: Wie hier. Womit nicht nur die Kursivschrift gemeint ist. Auch nicht die Fußnote.
      3. Hallo

        zur Foren-Software:

        Und den Tag-Vorschlag "zu diesem forum" kann ich auch nicht wählen

        Es kann nur drei geben. Du hast drei Tags, womit keine weitere Eingabe auch nur irgendeines Tags möglich ist. Und ja, das ist in der neuen Version von Anfang an so.

        Tschö, Auge

        --
        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
        Terry Pratchett, „Gevatter Tod“
    2. Tach!

      Javascript hätte die Maskierung gerne mit \' - das lässt HTML unverändert (im Gegenteil zu &#039; oder &apos;) und nach dem JS-Kopiervorgang ins input-Feld ist der Rückwärtsschrägstrich wie von Zauberhand verschwunden:

      Die Zauberei, die du hier zu erkennen glaubst sind grundlegende Regeln der jeweiligen Sprache: Wie notiert man Stringliterale und welche Sonderzeichen muss man auf welche Weise notieren? Sowas muss man als Programmierer beherrschen und nicht erst, wenn Zeichen offensichtlich falsch angezeigt werden. Solche Fehler können auch gegen deinen Willen ausgenutzt werden. SQL-Injection ist da das prominenteste Beispiel.

      dedlfix.

    3. Hallo,

      nach mehr als 3 Std Probiererei hab' ich's.

      Linda brauchte 2

      Gruß
      Kalk