Formulardaten gehen bei fehlerhafter Eingabe verloren (in mobilenr Websitenansicht)

WebMarco

Mitglied
Liebe Forum-Gemeinde,

mir ist ein Problem aufgefallen, bei dem ich weder mit Hilfe von Google (es fehlen mir irgendwie auch die Schlagworte, wonach ich suchen soll), noch durch Probieren zu einer Lösung gekommen bin. Ich habe eine Funktion geschrieben, die es dem Besucher erlaubt, unter meinen Beiträgen eigene Kommentare zu verfassen. Natürlich findet dabei auch eine Überprüfung der Eingaben statt. Sofern eine Eingabe nicht den Vorgaben entspricht, so wird ein Fehler ausgegeben. Die eigegebenen Formulardaten sollen dabei natürlich erhalten bleiben. Es ist schon sehr ärgerlich, wenn man wieder alles erneut eingeben muss. Das funktioniert bei der "normalen Desktop-Version" meiner Seite auch auf allen Browsern tadellos. Doch nun ist mir aufgefallen, dass bei der mobilen Webseitenansicht die Formulardaten verloren gehen; unabhängig welcher mobile Browser. Sobald ich den Button "zur Desktop-Variante" klicke und die normale Website auf dem Smartphone angezeigt wird, bleiben die eingegebenen Daten erhalten.

Das nachfolgende Bild soll die Problematik kurz veranschaulichen:
problem-1.jpg

Ich gebe mal den Quellcodeteil zur Einsicht, bei dem ich den Fehler vermute:
PHP:
// Kommentar eintragen
if(isset($_POST['kommentar_sent']))
{
  $id = $_POST['id'];
  $name = $_POST['name'][$id];
  $email = $_POST['email'][$id];
  $url = $_POST['url'][$id];
  $kommentar = $_POST['kommentar'][$id];
  $spamschutz = $_POST['spamschutz'][$id];
 // Wird mittels CSS versteckt
 if(!empty($spamschutz))
  {
	$fehler = 1;
	$fehler_spamschutz = ''. $lang_artikel_kommentare_fehler_spamschutz .'';
  }
  if(empty($name))
  {
	$fehler = 1;
	$fehler_name = ''. $lang_artikel_kommentare_fehler_name .'';
  }
  if(empty($email) || !eregi("^[a-z0-9\._-]+@+[a-z0-9\._-]+\.+[a-z]{2,4}$", $email) || ctype_cntrl($email))
  {
	$fehler = 1;
	$fehler_email = ''. $lang_artikel_kommentare_fehler_email .'';
  }
  if(!empty($url))
  {
	if(!preg_match("/[h][t]{2}[p][\:][\/]{2}[w.0-9]{0,4}[a-zA-Z0-9.-]{2,40}[.][a-zA-Z]{2,7}/", $url))
	{
	  $fehler = 1;
	  $fehler_url = ''. $lang_artikel_kommentare_fehler_url .'';
	}
  }
  if(empty($kommentar))
  {
	$fehler = 1;
	$fehler_kommentar = ''. $lang_artikel_kommentare_fehler_kommentar .'';
  }
  if($fehler === 1)
  {
	echo '<div class="kommentar_fehlermeldung">'. $lang_artikel_kommentare_fehler_fehlerhinweis .'</div>'."\n";
  }
  if($fehler != 1)
  {
	$select = "
	INSERT INTO `artikel_kommentare`
	(
	  `artikel_id`,
	  `name`,
	  `email`,
	  `url`,
	  `kommentar`
	)
	VALUES
	(
	  '". $id ."',
	  '". $name ."',
	  '". $email ."',
	  '". $url ."',
	  '". $kommentar ."'
	)
	";
	mysql_query($select);
	if(mysql_affected_rows () > 0)
	{
	  header('Location: '. $_GET['url'] .'?artikel_kommentare_sent_hinweis=1');
	}
	else
	{
	  header('Location: '. $_GET['url'] .'?artikel_kommentare_sent_fehler=1');
	}
	mail("$email_webseitenbetreiber", "$lang_artikel_kommentare_email_betreff","$lang_artikel_kommentare_email_nachricht","From: $email"."\r\n".'Content-Type: text/plain; charset="UTF-8"');
  }
}

// Input-Felder (hier nur Auszugsweise)
echo '<input type="text" name="name[' . $artikel['id'] . ']" value="'. $name .'" />'."\n";
echo '<input class="abschicken" type="submit" name="kommentar_sent" value="'. $lang_artikel_kommentare_abschicken .'" />'."\n";

Wenn jemand eine Idee hat, wo der Fehler liegen könnte oder wonach ich evtl. suchen sollte, so bin ich wirklich sehr dankbar.
 
Hi,

PHP:
echo '<input type="text" name="name[' . $artikel['id'] . ']" value="'. $name .'" />'."\n";
woher kommt denn $artikel['id']? Und warum erzeugst du aus name ein Array? Denke dass hier was nicht hinhaut! Da darf auch nichts drin stehen, also nur name[] ohne nen Index.

Übrigens der reguläre Ausdruck zum prüfen der eMail-Adresse erlaubt keine Toplevel-Domains länger als 4 Zeichen, sprich .museum oder sowas wären nicht nutzbar.

MfG
 
Für das Layout verwende ich keinerlei JavaScript. Die $artikel['id'] verwende ich für die Zuordnung der Kommentare zu den jeweiligen Artikeln.

Was mich jetzt komplett verwundert: ich habe ein ähnliches Skript geschrieben, um ein Kontaktformular zu verwenden. Dort klappt es auch bei der mobilen Webseitenansicht.

Hier mal das Kontaktformular (Komplettauszug) bei dem es Fehlerfrei funktioniert:
PHP:
<?php
if(isset($_POST['kontaktformular_sent']))
{
  $name       = $_POST['name'];
  $email      = $_POST['email'];
  $nachricht  = $_POST['nachricht'];
  $spamschutz = $_POST['spamschutz'];
  if(!empty($spamschutz))
  {
	$fehler = 1;
	$fehler_spamschutz = ''. $lang_kontaktformular_fehler_spamschutz .'';
  }
  if(empty($name))
  {
	$fehler = 1;
	$fehler_name = ''. $lang_kontaktformular_fehler_name .'';
  }
  if(empty($email) || !eregi("^[a-z0-9\._-]+@+[a-z0-9\._-]+\.+[a-z]{2,4}$", $email) || ctype_cntrl($email))
  {
	$fehler = 1;
	$fehler_email = ''. $lang_kontaktformular_fehler_email .'';
  }
  if(empty($nachricht))
  {
	$fehler = 1;
	$fehler_nachricht = ''. $lang_kontaktformular_fehler_nachricht .'';
  }
  if($fehler === 1)
  {
	echo '<div class="kontaktformular_fehlermeldung">'. $lang_kontaktformular_fehler_fehlerhinweis .'</div>'."\n";
  }
  elseif($fehler != 1)
  {
	header('Location: '. $_GET['url'] .'?kontaktformular_sent_hinweis=1');
	mail("$email_webseitenbetreiber", "$lang_kontaktformular_email_betreff","$nachricht","From: $email"."\r\n".'Content-Type: text/plain; charset="UTF-8"');
  }
  else
  {
	header('Location: '. $_GET['url'] .'?kontaktformular_sent_fehler=1');
  }
}
echo '<div class="kontaktformular">'."\n";
echo ''. $fehler_spamschutz .'<p><input class="spamschutz" type="text" name="spamschutz" value="'. $spamschutz .'" /></p>'."\n";
echo ''. $fehler_name .'<p>'. $lang_kontaktformular_name .'<input type="text" name="name" value="'. $name .'" /></p>'."\n";
echo ''. $fehler_email .'<p>'. $lang_kontaktformular_email .'<input type="text" name="email" value="'. $email .'" /></p>'."\n";
echo ''. $fehler_nachricht .'<p>'. $lang_kontaktformular_nachricht .'<textarea name="nachricht" rows="1" cols="1">'. $nachricht .'</textarea></p>'."\n";
echo '<input class="abschicken" type="submit" name="kontaktformular_sent" value="'. $lang_kontaktformular_abschicken .'" />'."\n";
echo '<p>'. $lang_kontaktformular_pflichtangaben .'<br />'."\n";
echo '<span class="text_9px">'. $lang_loginbereich_spamschutz .'</span></p>'."\n";
echo '</div>'."\n";
?>

Irgendwo muss evtl. der Fehler darin liegen, dass bei der Kommentarfunktion ja auch Eintragungen in die MySQL-DB vorgenommen werden. Aber eigentlich dürfte der Fehler doch nur irgendwo in der Fehlerprüfung liegen****** *Ich verzweifel hier bald...*
 
Die Kernfragen richten sich zunächst an die vorhandenen Abhängigkeiten.
Gibt es Javascripte o.ä? Sind neben einer Layout-Weiche auch damit verbundene andere Auswertung der Daten vorhanden?

Überprüfe ersteinmal was überhaupt übertragen wird, z.B. mit

PHP:
print_r($_REQUEST); 
//bzw. 
print_r($_POST);
//Für mehr Details nutze
var_dump($_REQUEST); 
//bzw. 
var_dump($_POST);

LG
 
Was ich meine ist, wenn du einem Textfeld im name-Attribut "name[]" gibst, dann wird daraus ein array erzeugt, sprich $_POST['name'] ist nun im PHP-Script vom Typ array und wenn da nun noch ein Zahlenwert drinsteht (also der aus $artikel['id']) könnte ich mir vorstellen dass da der Mobilbrowser streikt... (Nur geraten, nix fundiertes :) )
 
@drucko Du hast Recht, es klappt jetzt.

PHP:
if(isset($_POST['kommentar_sent']))
{
  $id         = $_POST['id'];
  $name       = $_POST['name']; // [$id] entfernt
  $email      = $_POST['email']; // [$id] entfernt
  $url        = $_POST['url']; // [$id] entfernt
  $kommentar  = $_POST['kommentar']; // [$id] entfernt
  $spamschutz = $_POST['spamschutz'];

// ...

// [' . $artikel['id'] . '] entfertn
echo '<input type="text" name="name" value="'. $name .'" />'."\n";

Jetzt stelle ich mir die Frage, warum ich das damals so gebaut habe? Denn auch ohne diese Angaben funktioniert die Zuordnung der Kommentare zu dem jeweiligen Artikel.

VIELEN DANK FÜR EURE UNTERSTÜTZUNG!

@drucko welche Lösung schlägst Du für die E-Mail-Überprüfung vor? Du hast Recht, ".museum" wird als fehlerhafte Mail deklariert.
 
Zurück