Hej alla,
Jag har säkert förbisett något enkelt men samtidigt lagt alldeles för många timmar på mitt problem så nu ber jag om hjälp.
Som rubriken säger så mister jag min text efter första radmatningen då jag försöker lägga tillbaka texten i en textarea.
Sidan contact.php (den del som man kommer tillbaka till om något är fel) ser ut så här:
<?
} elseif ($_GET['msg'] != "OK") {
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<?
include ("../styles.php");
?>
</head>
<body topmargin="5" leftmargin="5" marginheight="5" marginwidth="5" bgcolor="#000000" background="../images/background_mini.jpg" bgproperties="fixed" style="background-attachment: fixed;">
<div class="headline">Kontakt</div>
<hr width="100%" size="1" noshade color="#65734a">
<br>
<font color=red><center>Felmeddelande!</font><br><br><br><br>
<? echo $_GET['msg']; ?></center><br>
<br><br><br>
<form action="check.php" method="post">
<table cellpadding=0 cellspacing=0><tr>
<td class=vanlig valign=top>Namn:</td>
<td class=vanlig><input type="text" name="name" value="<? echo htmlentities($_GET['name']); ?>" class="input" style="width: 230px;"></td>
</tr><tr>
<td class=vanlig valign=top>E-postadress:</td>
<td class=vanlig><input type="text" name="email" value="<? echo htmlentities($_GET['email']); ?>" class="input" style="width: 230px;"></td>
</tr><tr>
<td class=vanlig valign=top>Meddelande: <br><br><br><br><br><br><br><br><br>
<input type="submit" name="submit" value="Skicka" class="input" style="cursor: hand;"></td>
<td class=vanlig><textarea name="message" virtual="wrap" class="input" style="width: 230px;" rows="10">
<? echo str_replace('<br />', "\r\n", $_GET['texten']); ?></textarea></td>
</tr></table>
<input type="text" name="www" value="" style="{display: none;}">
</form>
</body>
</html>
Sidan check.php ser för närvarande ut så här:
<?
$namn = $_POST['name'];
$epost = $_POST['email'];
$text = nl2br($_POST['message']);
$www = $_POST['www'];
$error = "OK";
$error_1 = "Du måste fylla i ditt namn!";
$error_2 = "Du måste ange din e-post adress!";
$error_3 = "Det är något fel på din e-post adress!";
$error_4 = "Du måste skriva något i meddelandefältet!";
if ($namn == '') {
$error = $error_1;
} elseif ($epost == "") {
$error = $error_2;
} elseif (!preg_match('/^[-A-Za-z0-9_.]+[@][A-Za-z0-9_-]+([.][A-Za-z0-9_-]+)*[.][A-Za-z]{2,6}$/', $post)) {
$error = $error_3;
} elseif ($text == "") {
$error = $error_4;
} elseif ($www != "") {
header("Location: http://localhost/reservatet_hemma/spampage.php");
exit;
}
header("Location: http://localhost/reservatet_hemma/se/contact.php?msg=$error&name=$namn&email=$epost&texten=$text");
exit;
?>
Jag kan få fram all text med radmatningar och allt om jag skriver ut det direkt på check.php.
Vad är det jag missar eller inte förstår?
/webb
SPiNMedlem sedan mars 20007 896 inlägg Om du struntar i att köra texten genom nl2br(), får du samma resultat?
GET-variabler är inte optimalt för att skicka data. Det bästa du kan göra är att istället lägga in informationen i sessions-variabler. Då kommer dessa problem inte att uppstå (förhoppningsvis ;)).
(Du har också ett enkelt fel i din preg_match() - du skickar in variabeln $post som inte finns, det borde vara $epost)
fiddlerMedlem sedan juli 20023 617 inlägg Som SPiN säger borde du använda en sessionsvariabel istället.
Det som kanske ställer till det för dig är att nl2br() byter nyradstecknet (\n) mot "<br />" men lämnar returtecknet (\r) kvar.
SPiNMedlem sedan mars 20007 896 inlägg Japp, en bättre lösning på nl2br() skulle kunna vara:
function breaks($str) {
return str_replace(array('\r\n', '\n', '\r'), '<br />', $str);
}
Vad snabba ni är :)
Jo, jag får samma resultat när jag tar bort nl2br().
Skarpögt av dig SPiN att se missen i min preg_match() (y)
Anledningen att jag inte valt sessions är något så barnsligt som att jag är rostig på programmering och bara skulle göra det mest nödvändiga till min egen hemsida.
Lite märkligt tycker jag ändå att mitt fel är. Jag har en nästan identisk lösning till min gästbok och där fungerar det bra. Där går kontrollen via en öppen sida med koden:
<iframe src="gb_instructions.php?tag=error&vem=<? echo htmlentities($_POST["name"]);?>&var=<? echo $_POST["country"];?>&vad=<? echo nl2br(htmlentities($_POST["message"]));?>" width="345" height="368" frameborder="0"></iframe>
och visningen sker med:
<textarea name="message" virtual="wrap" class="input" style="width: 250px;" rows="11"><? echo str_replace('<br />', "\r\n", $_GET['vad']); ?></textarea>
Har ni inga mer förslag så får det bli sessions istället.
/webb
aasahMedlem sedan mars 20034 471 inlägg Hum...
<!--- Ur din form --->
><textarea name="message" virtual="wrap" class="input" style="width: 230px;" rows="10">
<? echo str_replace('<br />', "\r\n", $_GET['texten']); ?></textarea>
Är det inte $_GET['message'] du vill visa i den?
Tack för tipsen,
Det fick bli en lösning med sessions istället, vilket ju var lättare att skriva än jag kom ihåg :h
Om någon annan råkar på samma fel i framtiden så ser en lösning ut så här - på kontrollsidan:
<?
session_start();
$_SESSION['name'] == "";
$_SESSION['email'] == "";
$_SESSION['message'] == "";
$_SESSION['www'] == "";
$error = "OK";
$error_1 = "Du måste fylla i ditt namn!";
$error_2 = "Du måste ange din e-post adress!";
$error_3 = "Det är något fel på din e-post adress!";
$error_4 = "Du måste skriva något i meddelandefältet!";
if ($_POST['name'] == "") {
$error = $error_1;
} elseif ($_POST['email'] == "") {
$error = $error_2;
} elseif (!preg_match('/^[-A-Za-z0-9_.]+[@][A-Za-z0-9_-]+([.][A-Za-z0-9_-]+)*[.][A-Za-z]{2,6}$/', $_POST['email'])) {
$error = $error_3;
} elseif ($_POST['message'] == "") {
$error = $error_4;
} elseif ($_POST['www'] != "") {
header("Location: http://localhost/reservatet_hemma/spampage.php");
exit;
}
$_SESSION['name'] = $_POST['name'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['message'] = htmlentities($_POST['message']);
$_SESSION['www'] = $_POST['www'];
header("Location: http://localhost/reservatet_hemma/se/contact.php?msg=$error");
exit;
?>
På visningssidan ser det ut så här:
<?
} elseif ($_GET['msg'] != "OK") {
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<?
include ("../styles.php");
?>
</head>
<body topmargin="5" leftmargin="5" marginheight="5" marginwidth="5" bgcolor="#000000" background="../images/background_mini.jpg" bgproperties="fixed" style="background-attachment: fixed;">
<div class="headline">Kontakt</div>
<hr width="100%" size="1" noshade color="#65734a">
<br>
<font color=red><center>Felmeddelande!</font><br><br><br><br>
<? echo $_GET['msg']; ?></center><br>
<br><br><br>
<form action="check.php" method="post">
<table cellpadding=0 cellspacing=0><tr>
<td class=vanlig valign=top>Namn:</td>
<td class=vanlig><input type="text" name="name" value="<? echo htmlentities($_SESSION['name']); ?>" class="input" style="width: 230px;"></td>
</tr><tr>
<td class=vanlig valign=top>E-postadress:</td>
<td class=vanlig><input type="text" name="email" value="<? echo htmlentities($_SESSION['email']); ?>" class="input" style="width: 230px;"></td>
</tr><tr>
<td class=vanlig valign=top>Meddelande: <br><br><br><br><br><br><br><br><br>
<input type="submit" name="submit" value="Skicka" class="input" style="cursor: hand;"></td>
<td class=vanlig><textarea name="message" virtual="wrap" class="input" style="width: 230px;" rows="10">
<? echo str_replace('<br />', "\r\n", $_SESSION['message']); ?></textarea></td>
</tr></table>
<input type="text" name="www" value="" style="{display: none;}">
</form>
</body>
</html>
Det är säkert inte den snyggaste koden men den fungerar :e
/webb