Probleme mit SUBSTR
Timur
- php
Hallo,
ich gebe in einem TEXTAREA einen Text ein. Mit dem PHP Befehl substr()
lasse ich die ersten 180 Zeichen (substr(0,180,$_POST['textarea'])
) auf einer Seite (test.php) ausgeben.
Nur habe ich hier ein Problem. Wenn der Text im TEXTAREA nicht länger als 180 Zeichen sind, wird es nicht auf der Seite test.php angezeigt. Das gleiche tritt dann auch auf, wenn im TEXTAREA ein Zeilenumbruch ist (<br />
).
Vielen Dank
Timur
Hi,
ich gebe in einem TEXTAREA einen Text ein. Mit dem PHP Befehl
substr()
lasse ich die ersten 180 Zeichen (substr(0,180,$_POST['textarea'])
) auf einer Seite (test.php) ausgeben.
RTFM - das ist nicht die Reihenfolge, in der substr seine Parameter erwartet.
MfG ChrisB
Hallo Chris,
ich habe es nach mein Posting selber gesehen, die richtige Reihenfolge ist ja so:
substr($_POST['textarea'], 0, 180);
Aber damit hat sich das problem auch nicht behoben. Es bleibt wie gehabt.
Gruß
Timur
Hi,
ich habe es nach mein Posting selber gesehen, die richtige Reihenfolge ist ja so:
substr($_POST['textarea'], 0, 180);
Aber damit hat sich das problem auch nicht behoben. Es bleibt wie gehabt.
Dann kann ich deine Problembeschreibung nicht nachvollziehen.
substr hat keine Probleme damit, wenn der Text kürzer ist als das angegebene Ende - dann wird einfach alles zurückgegeben; das ist definiertes Verhalten.
Und was in einer Textarea "ein Zeilenumbruch (<br />)" soll, bleibt auch weiterhin unklar. Das content model von Textarea ist #PCDATA, also kann <br /> darin gar kein "Zeilenumbruch" sein, sondern ist nur die Aneinanderreihung der Zeichen <, b, r, Leerzeichen, / und >.
Du sprichst nach wie vor in Rätseln. </hilfe/charta.htm#tipps-fuer-fragende>
MfG ChrisB
Hi,
Dann kann ich deine Problembeschreibung nicht nachvollziehen.
das ist aber wirklich so. Wenn ich z.B. 145 zeichen habe und danach ein Zeilenumbruch im Textarea ist wird es nicht angzeigt. Mit Zeilenumbruch meine ich sowas:
Also die zwei leeren Zeilen.
Gruß
Timur
Hi,
Dann kann ich deine Problembeschreibung nicht nachvollziehen.
das ist aber wirklich so.
Wenn ich Lust hätte, mich mit dir zusammen im Kreis zu drehen, hätte ich nicht die Tipps für Fragende verlinkt.
Ich schlage vor, du liest diese noch mal aufmerksam - und bringst dann ein Beispiel, an dem sich das beschriebene Verhalten nachvollziehen lässt.
MfG ChrisB
Hallo,
na dann, ganz von vorne nochmal:
Vielleicht sollte ich das auch noch erwähnen:
Ich habe ein Seite (beispiel.php) mit ein Formular. Im Formular habe ich ein TEXTAREA und ein SUBMIT Button. Im TEXTAREA gebe ich ein sehr großen Text ein. Mit dem SUBMIT Button erreiche ich, dass der Text im TEXTAREA in eine MySQL Datenbank eingegeben wird. In der MySQL Datenbank habe ich ein Feld (feld1). Mit substr() möchte ich die Länge des im TEXTAREA eingegebenen Text auf 180 Zeichenketten reduzieren und auf der Seite test.php ausgeben. Das funktioniert auch, ABER:
1.
Wenn die ersten 180 Zeichen des Texts folgenden Zeichen enthalten: " und ' wird es nicht angezeigt, warum?
2.
Wenn im TEXTAREA nach 100 Zeichen, oder auch früher, leere Zeilen sind, also "ENTER" oder "<br />", weiß nicht wie man leere Zeilen beschreiben soll, dann wird der Text auch nicht auf der Seite test.php angezeigt.
Warum ich gerade 180 Zeichen ausgeben lasst, ist meine Sache ...
Ich hoffe, ich habe mich diesmal besser ausgedrückt.
Gruß
Timur
Hi,
Ich habe ein Seite (beispiel.php) mit ein Formular. Im Formular habe ich ein TEXTAREA und ein SUBMIT Button. Im TEXTAREA gebe ich ein sehr großen Text ein. Mit dem SUBMIT Button erreiche ich, dass der Text im TEXTAREA in eine MySQL Datenbank eingegeben wird. In der MySQL Datenbank habe ich ein Feld (feld1).
Wie definiert, wie geschieht das Eintragen?
Mit substr() möchte ich die Länge des im TEXTAREA eingegebenen Text auf 180 Zeichenketten reduzieren und auf der Seite test.php ausgeben.
Also nicht vor dem Speichern, sondern erst nach dem wieder-auslesen aus der Datenbank?
Wenn die ersten 180 Zeichen des Texts folgenden Zeichen enthalten: " und ' wird es nicht angezeigt, warum?
Vielleicht hast du die üblichen Absicherungsmaßnahmen zum Verwenden von Nutzeriengaben in einer MySQL-Query nicht berücksichtigt.
Aber dann sollte eigentlich gar kein Eintrag erfolgen können, sondern ein Fehler auftreten.
Wenn im TEXTAREA nach 100 Zeichen, oder auch früher, leere Zeilen sind, also "ENTER" oder "<br />", weiß nicht wie man leere Zeilen beschreiben soll, dann wird der Text auch nicht auf der Seite test.php angezeigt.
Dafür kann ich mir spontan keine mögliche, plausible Ursache denken.
Ich hoffe, ich habe mich diesmal besser ausgedrückt.
Fehlerpotential besteht einiges; aber ohne zu sehen, wie genau du vorgehst, lässt sich dazu wenig sagen - also ist Beispielcode (und Beispieldaten) erforderlich, um das ganze nachvollziehbar zu machen - aber bitte auf's Wesentliche reduziert!
MfG ChrisB
Hallo Chris,
nun ersmal die Codes womit ich meine Probleme habe.
Die Datei beispiel.php:
<?PHP
mysql_connect("...") or die ("...");
mysql_select_db("...") or die ("...");
mysql_query ("INSERT INTO `table_1` SET `text` = 'substr($_POST['nachricht'], 0, 180)'");
?>
<form action="beispiel.php" method="post">
<textarea name="nachricht"><textarea>
<br />
<input type="submit" />
</form>
Die Datei test.php:
<?PHP
mysql_connect ("...") or die ("...");
mysql_select_db("...") or die ("...");
$sql = "SELECT `text` FROM `table_1` ORDER BY `nr` DESC LIMIT 0,1";
$result = mysql_query($sql);
while($row = mysql_fetch_object($result))
{
$kleinertext=$row1->text;
}
echo "$kleinertext";
?>
Wie gesagt, wenn der Text kleiner als 180 Zeichen ist und im TEXTAREA bei der Eingabe " oder ' oder leeren Zeilen vorkommen wird bei test.php nichts angezeigt.
Gruß Timur
Hallo,
Wie gesagt, wenn der Text kleiner als 180 Zeichen ist und im TEXTAREA bei der Eingabe " oder ' oder leeren Zeilen vorkommen wird bei test.php nichts angezeigt.
das mit dem " und ' habe ich mit ereg_replace hinbekommen.
Das einzige was nicht klappt ist folgendes:
Wenn ich 60 Zeichen eingebe danach ein leere Zeile kommt und danach wieder 60 Zeichen eingebe wird gar nichts angezeigt.
Ich habe festgestellt, dass es mit den Zeilenümbrüchen zu tun haben muss. Nur weiß ich leider nicht wie man Zeilenumbrüche unterdrücken kann.
Wäre es sinnvoll Zeilenumbrüche mit ereg_replace("\n"," ") zu ersetzen?
Gruß
Timur
das mit dem " und ' habe ich mit ereg_replace hinbekommen.
warum?
Was spricht gegen eine kontextgerechte Behandlung der Daten? Schreibe die Daten entsprechend maskiert in deine Datenbank (mysql_real_escape_string() ist das Mittel der Wahl). Dort kann ruhig ' oder " stehen (im übrigen ist " im MySQL-Kontext völlig harmlos). Es ist absolut nicht notwendig, die Daten irgendwie zu ersetzen oder gar als nummerische oder benannte Referenzen in die Datenbank zu schreiben. Ein ' oder ein " hat, auch wenn das vermutlich mal als HTML ausgegeben wird, in der Datenbank ansich nix verloren. Dort sind die Daten üblicherweise möglichst Formatneutral hinterlegt.
Zudem sind die preg-Funktionen den ereg-Funktionen eindeutig vorzuziehen Siehe "Notes" - stellvertretend für alle POSIX-kompatiblen regulären Ausdrücke.
Wenn ich 60 Zeichen eingebe danach ein leere Zeile kommt und danach wieder 60 Zeichen eingebe wird gar nichts angezeigt.
Nicht nachvollziehbar.
Ich habe festgestellt, dass es mit den Zeilenümbrüchen zu tun haben muss.
Wie hast du das festgestellt? Mir ist kein Fall bekannt, in dem es zu einer Nichtdarstellung im HTML-Kontext führt, nur weil der Inhalt eines Elements ein Whitespace-Zeichen beinhaltet.
Wäre es sinnvoll Zeilenumbrüche mit ereg_replace("\n"," ") zu ersetzen?
Nein - zumal du mit \n keinen \r\n oder \r abdeckst, weiters ist ein regulärer Ausdruck für eine simple Zeichenkettenersetzung der Overkill, drittens gibt's dazu eigenen Funktionen z.B. nl2br() und zuletzt: ist ein geschütztes Leerzeichen, \n ein das EOL/Linebreak-Zeichen.
Hallo suit,
doch das ist aber so...
ich habe nun mysql_real_escape_string mit eingebaut, daher brauche ich diese ganzen ereg_replace Sachen nicht mehr. Ist ein sehr guter Tipp gewesen.
Vielleicht schreibe ich hier mal den HTML, JAVASCRIPT und PHP Code auf, damit Ihr mich besser versteht.
Die Datei beispiel.php:
<?PHP
mysql_connect("...") or die ("...");
mysql_select_db("...") or die ("...");
$mtext = mysql_real_escape_string($_POST['nachricht']);
mysql_query ("INSERT INTO `table_1` SET `text` = 'substr($mtext,0,180)'");
?>
<html>
<head>
</head>
<body>
<form action="beispiel.php" method="post">
<textarea name="nachricht"><textarea>
<br />
<input type="submit" />
</form>
</body>
</html>
Die Datei test.php:
<?PHP
mysql_connect ("...") or die ("...");
mysql_select_db("...") or die ("...");
$sql = "SELECT `text` FROM `table_1` ORDER BY `nr` DESC LIMIT 0,1";
$result = mysql_query($sql);
while($row = mysql_fetch_object($result))
{
$kleinertext=$row1->text;
}
?>
<html>
<head>
<script type="text/javascript">
[code lang=javascript]/* <![CDATA[ */
function eins()
{
document.getElementById("kurztext").innerHTML = "<?PHP echo "<a href=\'blabla.php\'>$kleinertext</a>"; ?>";
}
/* ]]> */
</script>
</head>
<body onload="javascript:eins();">
<div id="kurztext"></div>
</body>
</html>[/code]
So wie gesagt, das mit der Eingabe von Zeichen klappt.
Wenn zum Beipsiel die Eingabe 60 Zeichen enthalten werden auch die 60 Zeichen ausgegeben. Das ist auch in Ordnung so.
Nur was die ganze Zeit nicht klappt ist, wenn die Eingabe beispielsweise 60 Zeichen und leere Zeilen ("ENTER" "<br />") enthält, wird nichts angezeigt.
Gruß
Timur
ich habe nun mysql_real_escape_string mit eingebaut, daher brauche ich diese ganzen ereg_replace Sachen nicht mehr. Ist ein sehr guter Tipp gewesen.
Ich hab' "kontextgerecht" geschrieben, nicht dass du überall mysql_real_escape_string() verwenden sollst - beim Lesen der Daten aus der Datenbank und bei der Ausgabe als HTML ist htmlspecialchars() wesentlich sinnvoller.
Vielleicht schreibe ich hier mal den HTML, JAVASCRIPT und PHP Code auf, damit Ihr mich besser versteht.
Ich hab' dein Problem bereits verstanden, nachvollziehbar ist es nicht
$mtext = mysql_real_escape_string($_POST['nachricht']);
mysql_query ("INSERT INTOtable\_1
SETtext
= 'substr($mtext,0,180)'");
Umgekehrt - wenn du den String "hallo, ich bin's wirklich" escapest und dann auf 15 zeichen kürzt, hast du folgendes
"hallo, ich bin" aber eigentlich willst du "hallo, ich bin'" haben
Nur was die ganze Zeit nicht klappt ist, wenn die Eingabe beispielsweise 60 Zeichen und leere Zeilen ("ENTER" "<br />") enthält, wird nichts angezeigt.
Brich dein Problem auf mehrere Teilprobleme herrunter und verifiziere in jedem Schritt, was mit deinen Daten passiert.
A)
Übergabe des Formulars per POST/GET an dein Script - Ausgabe der Daten (ist alles noch OK?)
B)
Schreiben in die Datenbank - Prüfen z.B. per phpMyAdmin (ist alles noch OK?)
C)
Lesen der Daten aus der Datenbank, prüfen ob's noch passt (var_dump/echo ...)
D)
Ausgabe der Daten im HTML-Kontext
Solange du das nicht machst, ist alles pure raterei.
Hallo suit,
ich glaube ich habe den Fehler gefunden, brauche aber jedoch noch hilfe. Das hat nichts mit PHP programmieren zu tun, scheint ein JAVASCRIPT Fehler zu sein. Die Javascript Konsole zeigt dies an:
function haber1() // HABERUEBERGANG 1 -> 2
{
var e = document.getElementById("ortaresim");
e.src = document.getElementById("img1").src;
document.getElementById("ueber").innerHTML = "asdasda ' " FD # daf";
document.getElementById("betim").innerHTML = "<a href=\'fff.php?fff=1020\'>asd a afjh sdjhjhdf j kldjfkjd ewr ködjfk werwen sadjn awö kjf jklg kldsjf sdkj fsdklg"" asdas asdfas dfsd nklflkas sdlkj skldjglkfjd lskdgflkdsewqjqwe qwepjqw qwöekqwöle qw ...</a>";
document.getElementById("img4").style.border = 'none';
document.getElementById("img1").style.border = '2px solid red';
window.setTimeout("haber2()", 10000);
}
Der Fehler liegt dann nach FF in dieser Zeile:
document.getElementById("betim").innerHTML = "<a href=\'fff.php?fff=1020\'>asd a afjh sdjhjhdf j kldjfkjd ewr ködjfk werwen sadjn awö kjf jklg kldsjf sdkj fsdklg"" asdas asdfas dfsd nklflkas sdlkj skldjglkfjd lskdgflkdsewqjqwe qwepjqw qwöekqwöle qw ...</a>";
Komischerweise zeigt FF noch diesen Fehler an:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
achso, ich habe im body tag sowas stehen:
<body onload="javascript:haber1()">
komischerweise wenn ich kein Zeilenumbruch habe klappt es. Aber wenn ich ein zeilenumbruch habe klappt es nicht.
Gruß
Timur
komischerweise wenn ich kein Zeilenumbruch habe klappt es. Aber wenn ich ein zeilenumbruch habe klappt es nicht.
Ich aktiviere für heute noch 1x den Ratemodus - dann hab' ich keine Lust mehr, dir alles aus der Nase zu ziehen und immer wieder zu sehen, dass du nichtmal im Ansatz versuchst, die Lösungsvorschläge zu beachten.
<ratemodus type="vermutung">
Du erzeugst mittels PHP eine JavaScript-Funktion oder zumindest einen Teil davon, welche dafür verantwortlich ist, das Formularfeld oder wasauchimmer zu befüllen. Dein inner.HTML = "STRING"; wird mit dem String aus der Datenbank befüllt - da du deine Daten nicht kontextgerecht behandelst, führt der Umbruch im JavaScript dazu, das das JavaScript fehlerhaft wird. Das Script bricht mit einem Fehler ab und der Inhalt steht nicht im Dokument.
</ratemodus>
Sollte ich damit richtig liegen, bitte ich um die sofortige Überweisung von 50 Euro auf mein Konto (Bankverbindung auf Anfrage) oder um Zusendung einer Kiste Bier (Adresse auch).
Zudem hätte ich dann noch die Frage: WOZU machst du diesen Käse überhaupt, besonders, weil deine Seite ohn JavaScript garnicht funktioniert - wenn du einen Wechsler für Teaser (zum Nerven deiner Benutzer[1]) einbauen willst, kansnt du das auch so tun, dass man das Ding auch ohne JavaScript noch nutzen kann.
Im übrigen, wenn du immer noch nicht zurande kommst: beschreibe WAS du vorhast, WARUM du das vorhast (ggf. gibts bessere Lösungen) und vor allem WAS du bereits probiert hast, um das gewünschte Verhalten zu erreichen. Ohne deine Mithilfe bei der Fehlersuche vergeht mir jedenfalls die Lust.
[1] wenn man nach 10 Sekunden noch nicht mit dem Lesen fertig ist, wird der Inhalt einfach durch einen anderen ersetzt - sehr fies.
danke für den tipp...
ich wohne in berlin; falls du auch in berlin wohnst, werde ich beim nächsten besuch bei grtränke hoffmann an dich denken und eine kiste bier zu dir nach hause liefern lassen...
:-)
gruß
timur
danke für den tipp...
Hat's denn funktioniert bzw. hatte ich recht?
ich wohne in berlin; falls du auch in berlin wohnst, werde ich beim nächsten besuch bei grtränke hoffmann an dich denken und eine kiste bier zu dir nach hause liefern lassen...
Ich wohne in Salzburg - also etwa 700 Kilometer weiter südlich :) - solltest du aber wirklich gewillt sein, eine Kiste Bier zu spendieren, schick sie an den SELFHTML-Verein, die arbeiten sich den Hintern wund, damit wir hier ein tolles Forum haben (und ein Nachschlagewerk) und verdienen tun sie nix damit.
Hat's denn funktioniert bzw. hatte ich recht?
scheint so, jetzt funktioniert es so wie ich es will...
Ich wohne in Salzburg - also etwa 700 Kilometer weiter südlich :) - solltest du aber wirklich gewillt sein, eine Kiste Bier zu spendieren, schick sie an den SELFHTML-Verein, die arbeiten sich den Hintern wund, damit wir hier ein tolles Forum haben (und ein Nachschlagewerk) und verdienen tun sie nix damit.
spediere ich denen beim nächten besuch bei getränke hoffmann...
gruß
timur
Hi,
ich glaube ich habe den Fehler gefunden, brauche aber jedoch noch hilfe. Das hat nichts mit PHP programmieren zu tun, scheint ein JAVASCRIPT Fehler zu sein.
Warum zum Geier erwähnst du das mit dem JavaScript erst jetzt?
Dass dabei unbehandelte Zeilenumbrüche Probleme machen, weil sie die Syntax von JavaScript zerstören, ist klar.
Das nächste mal erwähne sowas bitte gleich von Anfang an - damit man nicht ewig rumraten muss, an welcher Stelle du Mist gebaut hast.
MfG ChrisB
Hi,
$mtext = mysql_real_escape_string($_POST['nachricht']);
mysql_query ("INSERT INTO
table_1
SETtext
= 'substr($mtext,0,180)'");
?>
Mach dir bitte klar, das auch das Unfug ist, bzw. nicht das, was du willst.
Lass dir den String, den du da zusammenbastelst, mal per echo zur Kontrolle ausgeben.
MfG ChrisB
--
Light travels faster than sound - that's why most people appear bright until you hear them speak.
Hello Timur,
Dann kann ich deine Problembeschreibung nicht nachvollziehen.
das ist aber wirklich so. Wenn ich z.B. 145 zeichen habe und danach ein Zeilenumbruch im Textarea ist wird es nicht angzeigt. Mit Zeilenumbruch meine ich sowas:
Also die zwei leeren Zeilen.
Dein Problem ist, dass Du bisher nicht gelernt hast, Dir als Entwickler Daten sichtbar zu machen. Du verlässt Dich auf irgendwelche Programme, deren Transformationseigenschaften Du nicht kennst.
Und das Problem der übrigen Poster hier ist, dass Die Dir das bisher nicht gesagt haben. Aber vermutlich wissen sie es sleber nicht besser.
Wenn Du Datenaustausch betreibst, dann musst Du selbstverständlich wissen, an welcher Stelle welche Veränderungen an den daten vorgenommen werden, auch wenn es nur zur Anzeige geschieht. Lass Dir die empfangenen Daten in einem passenden Editor anzeigen (z.B. HEX-Editor). Wenn Du den Wert jedes Byte angezeigt bekommst, dann sollte Dir der Unterschied zwischen "Raw" und "Cooked" schnell klar werden.
Bitte google einfach mal nach den Fachbegriffen.
Wenn Du dir also mittels einer sehr verfremdenden Umgebung, wie HTML, daten anzeigen lassen willst, wie sie im Script ankommen, dann sorge dafür, dass die HTML-Umgebung auch weiß, dass es sich um Rohdaten handelt und diese (möglichst) nicht verändert werden sollen, bzw. wähle eine Darstellungsart, die für die Anzeigeumgebung (Kontext) keine Veränderungen nötig macht.
Liebe Grüße aus Syburg
Tom vom Berg