Hi all,
I initially posted this to the [EMAIL PROTECTED] mailing list, but it seems to be more
of a CGI problem. This is the situation:
1. My script (edit.pl) reads a row of data from a database and displays it in an html
form for editing.
2. On submitting, the same script is called (in 'commit' mode) to write the updated
data to the database.
3. After the update, another script (show.pl) is called to load the updated data and
print it to the screen with my site's layout.
Steps 1 and 2 always (!) work fine, even if the error occurrs.
In most cases, step 3 also works fine. But if the content loaded from the database is
quite long (or is not properly encoded in utf8), I get the "malformed header from
script" error.
Now there"s a funny thing: If I do not load the content itself (via a variable
$content) from the database into the form field, but just print out the word "content"
and paste the original content into the field, I never get the error.
That's strange, since the content transferred as a CGI parameter should be the same in
both cases: The original content. The only difference is the string printed to the
form field when the form is generated.
I experimented a bit. Simple strings (like "content") never cause an error. But if I
add some tab stops and newlines, the error returns.
So I have been able to track down the source of the problem, but I just cannot
understand it.
Could anybody help me here? Below you find some code from my script's code. I know
it's less elegant than it could be and I already got some hints for fine tuning it,
but I'd like to solve the serious problem first.
Thanks,
Jan
----
#!/usr/bin/perl -w
use strict;
use DBI;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
# mein Modul f�r user_check, mysql_config und headfoot
use Site2;
my $q = new CGI;
# Standardmodus ist lokal
my $mode = $q->param('mode') || 'local';
# Konfiguration fuer die Verbindung zum MySQL-Server
my ($server, $db, $username, $password) = mysql_config($mode);
my $dbh = DBI->connect("dbi:mysql:$db:$server", $username, $password, { RaiseError =>
1 });
# checken, ob es sich um Edition oder Neueintrag handelt
my $id = $q->param('id') || '';
# Einlesen des eingegebenen Benutzernamen und Passworts
my $user_name_input = $q->param('user_name') || '';
my $user_password_input = $q->param('user_password') || '';
# legt fest, ob eine Maske ausgegeben oder die Daten uebertragen werden
my $edit_mode = $q->param('edit_mode') || '';
# legt die Mutter des neuen Eintrags fest (wird von show.pl �bergeben)
my $mother_id = $q->param('mother_id');
# Abrufen des Titels der Mutterseite f�r das Men�
my $query = "SELECT title FROM pages WHERE page_id = $mother_id";
my $sth = $dbh->prepare($query);
$sth->execute();
my ($mother_title) = $sth->fetchrow_array;
$sth->finish();
# Bestimmte Muttertitel werden nicht gedruckt (Home, Public, Private)
$mother_title = $mother_id == 1 || $mother_id == 2 || $mother_id == 2200 ? '' : '|' .
$mother_title . '|';
my $title = 'Editieren und Einfügen';
# Einlesen des Seitenkopfes und -fu�es (in Abh�ngigkeit von verschiedenen Variablen)
my ($page_head, $page_foot) = headfoot($title, $mother_id, $mother_title, $mode);
# Deklaration verschiedener Variablen (leer f�r Neueintr�ge)
my ($author_id, $content, $link, $page_type, $user_id, $pdf, $tex) = ();
# Ausdruck des Headers und Seitenkopfes
print $q->header(-type=>'text/html', -charset=>'utf-8'), $page_head unless $edit_mode
eq 'commit';
# Wenn noch kein Benutzername/Passwort angegeben ist: Identifizierung
# Wenn Identifizierung nur au�erhalb des lokalen Modus gew�nscht ist: "$mode eq
'local' ||" zum Konditional hinzuf�gen
unless ($mode eq 'local' || $user_name_input && $user_password_input) {
print qq{<h1>Identifizierung</h1><p>Bearbeitungsfunktionen sind passwortgesch�tzt.
Bitte geben Sie Benutzernamen und Passwort ein.</p><form action="edit.pl"
method="post" enctype="application/x-www-form-urlencoded"
accept-charset="utf-8"><table><tr><td>Benutzer:</td><td><input type="text"
name="user_name" value="" size="20" /></td></tr><tr><td>Passwort:</td><td><input
type="password" name="user_password" size="20" /></td></tr></table><input
type="hidden" name="id" value="$id" /><input type="hidden" name="mother_id"
value="$mother_id" /><input type="hidden" name="mode" value="$mode" /> <input
type="submit" value="Absenden" /></form>};
}
# Wenn Benutzername/Passwort vorhanden sind: �berpr�fen (dito zum lokalen Modus)
elsif ($mode eq 'local' || user_check(1, $user_name_input, $user_password_input,
$mode)) {
# Abrufen des Datensatzes, wenn eine $id vorhanden ist
if ($id) {
print qq{<h2>Editieren</h2>};
my $query = "SELECT mother_id, author_id, title, content, link, page_type,
user_id, pdf, tex FROM pages WHERE page_id = $id";
my $sth = $dbh->prepare($query);
$sth->execute();
($mother_id, $author_id, $title, $content, $link, $page_type, $user_id, $pdf,
$tex) = $sth->fetchrow_array;
$sth->finish();
}
# sonst: Festlegen der Standardwerte f�r den Neueintrag
else {
print qq{<h2>Neueintrag</h2>};
($author_id, $page_type, $user_id, $pdf, $tex) = (1,2,0,0,0);
}
######## print out the form here #############
print qq{<form action="edit.pl" method="post"
enctype="application/x-www-form-urlencoded" accept-charset="utf-8"><input
type="submit" value="Absenden" /><table><tr><td>Page_ID:</td><td><input type="text"
name="id" value="$id" size="5" readonly /></td></tr><tr><td>Mother_ID:</td><td><input
type="text" size="5" name="mother_id" value="$mother_id"
/></td></tr><tr><td>Author_ID:</td><td><input type="text" size="5" name="author_id"
value="$author_id" /></td></tr><tr><td>User_ID:</td><td><input type="text" size="5"
name="user_id" value="$user_id" /></td></tr><tr><td>Page_Type:</td><td><input
type="text" size="5" name="page_type" value="$page_type"
/></td></tr><tr><td>Link:</td><td><input type="text" size="120" name="link"
value="$link" /></td></tr><tr><td>PDF:</td><td><input type="text" size="5" name="pdf"
value="$pdf" /></td></tr><tr><td>LaTeX:</td><td><input type="text" size="5" name="tex"
value="$tex" /></td></tr><tr><td>Page_Title:</td><td><input type="text" size="120"
name="title" value="$title" /></td></tr><tr><td>Content:</td><td><textarea
name="content" rows="30" cols="120">$content</textarea></td></tr></table><input
type="hidden" name="mode" value="$mode" /> <input type="hidden" name="user_name"
value="$user_name_input" /> <input type="hidden" name="user_password"
value="$user_password_input" /> <input type="hidden" name="edit_mode" value="commit"
/></form>}; }
# bei nicht erfolgreicher Identifizierung
else {
print qq{<h1>Falsches Passwort!</h1><p>Bitte verwenden Sie den "Zur�ck"-Button
Ihres Browsers, um die Eingaben zu korrigieren.};
}
print $page_foot unless $edit_mode eq 'commit';
# �bertragungsmodus
# f�r erneute �berpr�fung hinzuf�gen: "&& user_check(1, $user_name_input,
$user_password_input, $mode)"
if ($edit_mode eq 'commit') {
# �bernahme der Parameter aus der Editierungs- bzw. Neueintragsmaske
my $mother_id = $q->param('mother_id');
my $author_id = $q->param('author_id');
my $user_id = $q->param('user_id');
my $page_type = $q->param('page_type');
my $title = $dbh->quote($q->param('title'));
my $content = $dbh->quote($q->param('content'));
my $link = $dbh->quote($q->param('link'));
my $pdf = $q->param('pdf');
my $tex = $q->param('tex');
# bei vorhandener ID: Update des Datensatzes
if ($id) {
my $query = "UPDATE pages SET mother_id = $mother_id, author_id = $author_id,
user_id = $user_id, page_type = $page_type, title = $title, content = $content, link =
$link, pdf = $pdf, tex = $tex WHERE page_id = $id";
my $sth = $dbh->prepare($query);
$sth->execute();
$sth->finish();
print $q->redirect("show.pl?mode=local&id=$id");
}
# sonst: Einf�gen eines neuen Datensatzes
else {
my $query = "INSERT INTO pages (mother_id, author_id, user_id, title, content,
link, page_type, pdf, tex) VALUES ($mother_id, $author_id, $user_id, $title, $content,
$link, $page_type, $pdf, $tex)";
my $sth = $dbh->prepare($query);
$sth->execute();
$sth->finish();
print $q->redirect("show.pl?mode=local&id=$mother_id");
}
}
$dbh->disconnect;
--
How many Microsoft engineers does it take to screw in a lightbulb? None. They just
redefine "dark" as the new standard.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>