Hochkomma über mehrere Kontextwechsel bringen
Linuchs
- datenbank
- javascript
- php
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 " ".$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
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
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)
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
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
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
@@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 🖖
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
@@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 🖖
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, ''')'
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.
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 ' oder ') 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
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
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
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
@@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 🖖
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
Tach!
Javascript hätte die Maskierung gerne mit \' - das lässt HTML unverändert (im Gegenteil zu ' oder ') 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.