Hello,
was bei mir passiert ist, dass der Text meiner "Versuchspersonen" (ich bin Psychologe und führe Online-Studien durch...) einfach abgeschnitten wird und dann einige (bis zu mehreren 100) solche Slashs erscheinen. Ich glaube, dass das nichts mit dem von Dir beschriebenen Problem zu tun hat.
Ja, da hast Du an mindestens zwei Stellen schwere Versäumnisse in Deinen Scripten.
1. Wenn get_magic_Quotes_gpc() === true; dann werden von PHP die Daten automatisch maskiert,
damit z.B. Psychologen ihren Job machen können, dafür _einfache_ Formulare einsetzen können,
ohne gleich Webprogrammierer werden zu müssen. Du hast aber schon ein komplexes System gebaut.
Da musst Du dann die Daten erst wieder demaskieren mit stripslashes()
2. Wenn die Daten dann wieder ausgegeben werden an den HTML-Browser, müssen sie vorher codiert
werden. Das macht man z.B. mittels htmlentities(). Alle Quotations, Umlaute und
HTML-eigenen Zeichen werden dann codiert. Dann werden (vermutlich) auch keine Texte mehr
"abgeschnitten".
3. Wenn die Daten in die Datenbankl geschrieben werden sollen, und vorher ordnungsgemäß
von Dir durch demaskierung ins Roh-Format zurückversetzt wurden, dann musst Du sie für
die Datenbank erst wieder datanbankgerecht maskieren. Dafür eignet sich aber in den
seltensten Fällen addslashes(), dass von PHP intern unter (1) benutzt wird, sondern
Du benötigst die zur textschnittstelle der Datenbank passende Maskierungsfunktion.
Für MySQL heißt die mysql_[real_]escape_string(). Die Maskierungen werden nicht mit
abgespeichert. Wenn man die Daten wiederholt, sind sie also wieder raw.
Dann gibts auch keine Probleme mehr mit Tabulatorzeichen, Zeilenendezeichen, NUL-Zeichen
usw.
http://de3.php.net/manual/de/function.get-magic-quotes-gpc.php
http://de3.php.net/manual/de/function.stripslashes.php
http://de3.php.net/manual/de/function.addslashes.php
http://de3.php.net/manual/de/function.htmlentities.php
http://de3.php.net/manual/de/function.htmlspecialchars.php
http://de3.php.net/manual/de/function.htmlspecialchars.php
http://de3.php.net/manual/de/function.mysql-real-escape-string.php
Tipp 1:
Das entfernen der Maskierungen kann man am besten gleich in der Section "Datenübernahme" seines Scriptes rekursiv auf den gesamten betroffenen Parameterkanal (GET, POST, COOKIE) anwenden:
#------------------------------------------------------------------------------
function strip($_data)
{
if (!get_magic_quotes_gpc()) ## nur anwenden, wenn PHP maskiert hat
{
return $_data; ## Sonst Array unverändert zurückgeben
}
if (is_array($_data)) ## ist der Wert ein Zeiger auf ein Unterarray?
{
foreach($_data as $key => $val) ## Dann für dieses ebenfalls die Funktion
{
$_data[$key] = strip($val); ## benutzen
}
}
else
{
$_data = stripslashes($_data); ## Wenn der Wert ein Skalar ist,
} ## Demaskierung durchführen
return $_data; ## und zurück zur nächst höheren Ebene
}
#------------------------------------------------------------------------------
$_POST = strip($_POST);
Tipp 2:
Wenn die Daten, die man aus der Datenbank wiederholt, in einem normalen HTML-text ausgegeben werden sollen, also nicht in einer <textarea>, dann muss man die Zeilenumbrüche (wenn man sie anzeigen will), durch Einfügen von <br /> hervorrufen.
$HTMLout = nl2br(htmlentities(wordwrap($data,$colwidth,"\r\n")));
wobei das "\r\n" auf jeden Fall noch weiteren Diskussionsbedarf enthält.
Das würde hier aber zu weit führen. In PERL dürfte man das so nicht übernehmen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau