christophkoeln
Goto Top

PHPbzw.HTML-Formulare referenzieren

Liebe Gemeinde der Wissenden,

ist es möglich, ein HTML-Formular nach z.B. einer Fehleingabe mit PHP zu referenzieren, so dass z.B. bei Fehleingabe einer Mail-Adresse das Label des Eingabefeldes "Mail-Adresse" mit dem Text "Falsche Mail-Adresse" belegt wird und z.B. die Hintergrundfarbe des Eingabefeldes rot wird. Wie referenziert man ein Formularfeld im folgenden Code ? (oder geht das gar nicht ?).

Gruß aus Köln

Content-ID: 134795

Url: https://administrator.de/contentid/134795

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

48507
48507 31.01.2010 um 14:39:20 Uhr
Goto Top
Du meinst eine Plausibilitätsprüfung. Dazu gibt es viele Beispiele im Internet, siehe hier:

http://www.gaijin.at/scrphpcform.php

Und hier die Grundlagen: http://tut.php-q.net/de/post.html

Email-Adresse überprüfen:

http://www.php.de/php-fortgeschrittene/24-email-adresse-auf-korrektheit ...
christophkoeln
christophkoeln 31.01.2010 um 15:33:52 Uhr
Goto Top
Sorry - ich habe mich etwas unklar ausgedrückt und hoffe, es gelingt mir jetzt besser:

Die Plausibilität ist in meinem Programm bereits geprüft. Nun möchte ich dem User mitteilen, dass er die Mail-Adresse im falschen Format eingegeben hat. Folgende Möglichkeiten fallen mir ein:
1. Möglichkeit:
- per "Echo" schreibe ich die Nachricht irgendwo auf die Seite.
Beurteilung: geht zwar, sieht aber unprofessionell aus, finde ich.
2. Möglichkeit:
- eine MessageBox per JavaScript weist den User auf die Fehleingabe hin
Beurteilung: ich möchte kein JavaScript benutzen, da nicht jeder User dieses nutzt
3. Möglichkeit:
- Ich schreibe den Fehlertext direkt an die Stelle der Fehleingabe , z.B. als Label des betreffenden Input-Feldes. Hier soll die Ursprungsüberschrift "Bitte geben Sie Ihre Mailadresse ein." sich "wie von Zauberhand" in die Überschrift "Die eingegebene Mail-Adresse hat nicht das richtige Format" (oder Ähnliches) verwandeln
Beurteilung: würde ich mir wünschen, weiß aber nicht, wie man das Formular in dieser Form ändern kann.

Ich hoffe, jetzt ist's klarer geworden - hoffe auf positive Nachrichten
48507
48507 31.01.2010 um 17:18:58 Uhr
Goto Top
Na der letzte Link befasst sich genau mit deinem Problem. Du musst die entsrpechenden Codeschnipsel in dein Script einbauen und anpassen.

Bevor du ein "echo" senden kannst, musst du die Eingabe erst analysieren. Post doch deinen Quelltext hier, wenn er nicht zu lang ist.

Viele schalten JavaScript ab, entweder muss dies abfangen oder doch lieber auf PHP setzen. Die 3. Möglichkeit ist auch JavaScript.
christophkoeln
christophkoeln 31.01.2010 um 18:09:24 Uhr
Goto Top
Schön, dass Du Dir die Arbeit machen willst, den Code mal durchzusehen. Ich hoffe, er kommt auch richtig formatiert an (habe bisher noch keinen Code gepostet). Also:

<code type="html">
<!DOCTYPE html PUBLIC "-W3CDTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<style type="text/css">
/*Das Kontaktformular */
form {
background-color: #eee;
padding: 20px;
border: 1px solid #8c8c8c;
font-family: Verdana, Arial, Helvetica;
font-size: small;
margin-left: 160px;
width: 400px;
}
</style>
<form id="kontaktformular" name="kontaktformular" action="sub_kontaktformular.php" method="post">
<div>
<label for"name"> Ihr Name </label> <br>
<input type="text" id="name" name="name" size="62" value="<?php if (isset($_POST['name']))
{
echo htmlspecialchars (stripslashes($_POST['name']));
}
?>">
</div>
<div>
<label for"mail"> Ihre E-Mail-Adresse</label> <br>
<input type="text" id="mail" name="mail" size="62" value="<?php if (isset($_POST['mail']))
{
echo htmlspecialchars (stripslashes($_POST['mail']));
}
?>">
</div>
<div>
<label for "nachricht"> Ihre Nachricht an uns </label> <br>
<textarea id="nachricht" name="nachricht" cols="47" rows="3">
<?php
If (isset($_POST['nachricht']))
{
echo trim(htmlspecialchars(stripslashes($_POST['nachricht'])));
}
?>
</textarea>
</div>
<div>
<input type="submit" value="Senden" name="go" />
</div>
</form>
<?php
$name = $_POST['name'];
$mail = $_POST['mail'];
$nachricht = $_POST['nachricht'];
$RegXmail = "/^[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+\.[a-zA-Z]{2,4}$/";
/* -------------------------------------------------- */
/* FEHLERPRÜFUNG */
/* -------------------------------------------------- */
If (isset($_POST['go']))
{
$fehlerflag = false;
$fehlertext = "";
/* -------------------------------------------------- */
If (empty($name))
{
$fehlerflag = true;
$fehlertext .= " Bitte geben Sie einen Namen ein."; /* ... soll möglichst als Formularlabel ausgegeben werden */
}
/* -------------------------------------------------- */
If (empty($mail))
{
$fehlerflag = true;
$fehlertext .= " Bitte geben Sie eine Mailadresse an."; /* ... soll möglichst als Formularlabel ausgegeben werden */
}
elseif (strlen($mail)<5)
{
$fehlerflag = true;
$fehlertext .= " Die Mailadresse ist nicht komplett."; /* ... soll möglichst als Formularlabel ausgegeben werden */
}
elseif (preg_match($RegXmail, $mail)== 0)
{
$fehlerflag = true;
$fehlertext .= " Die Mailadresse ist nicht gültig."; /* ... soll möglichst als Formularlabel ausgegeben werden */
}
/* -------------------------------------------------- */
If (empty($nachricht))
{
$fehlerflag = true;
$fehlertext .= " Möchten Sie keine Nachricht senden?"; /* ... soll möglichst als Formularlabel ausgegeben werden */
}
If ($fehlerflag)
{
echo "<p>$fehlertext</p>";
}
else
{
/* mail("info@irgendwohin.de", $name, $nachricht, "From: $mail"); */
echo "Die Mail wurde versendet - wir werden Sie sobald wie möglich bearbeiten!"; /* und auch dieser Satz soll im Formular erscheinen ! */
}
}
?>
</body>
</html>
maretz
maretz 31.01.2010 um 18:14:07 Uhr
Goto Top
Naja - du könntest z.b. mit nem template system arbeiten (php-template-it sollte als suchbegriff reichen). da darfst du alles mit machen ;)
dog
dog 31.01.2010 um 20:03:39 Uhr
Goto Top
Das ist mal wieder so eine Frage, die ich nicht verstehe.
So ein Skeleton ist in 25 Minuten geschrieben (OK, ich wurde vom Telefon aufgehalten):
<?php

	class HTMLInput {
		protected $type;
		protected $attr = array();
		protected $sbmtRawValue = null;
		protected $vfunc = null;
		
		public function __construct($type,$name) {
			$this->type = $type;
			$this->attr['name'] = $name;  
			//prüfen ob wir ein abgeschicktes form haben
			if(array_key_exists($name, $_POST))
				$this->sbmtRawValue = $_POST[$name];
			return $this;
		}
		
		public function setAttribute($attribute,$value) {
			$this->attr[$attribute] = $value;
			return $this;
		}
		
		public function getAttribute($attr) {
			if(!array_key_exists($attr, $this->attr))
				throw new Exception('Trying to access unset attribute {'.$attr.'}');  
			return $this->attr[$attr];
		}
		
		public function validateFunction($closure) {
			$this->vfunc = $closure;
		}
		
		public function rawValue() {
			if(!$this->isSubmitted())
				throw new Exception('Form not yet submitted!');  
			return $this->sbmtRawValue;
		}
		
		public function validValue() {
			try {
				return $this->validate();
			} catch (Exception $e) {
				throw new Exception('No valid represenatation: {'.$e->getMessage().'}', 1);  
			}
		}
		
		public function isSubmitted() {
			return ($this->sbmtRawValue !== null);
		}
		
		public function getName() {
			return $this->getAttribute('name');  
		}
		
		public function validate() {
			return $this->vfunc($this->rawValue());
		}
		
		public function render() {
			$s = '<input type="'.$this->type.'"';  
			foreach ($this->attr as $key => $value) {
				$s .= ' '.$key.'="'.$value.'"';  
			}
			if($this->isSubmitted())
				$s .= ' value="'.htmlspecialchars($this->sbmtRawValue).'"';  
			$s .= ' />';  
			//validation
			if($this->isSubmitted() && $this->vfunc !== null) {
				try {
					$this->validate();
					//ok
				} catch (Exception $e) {
					echo '<div class="error">'.$e->getMessage().'</div>';  
				}
			}
			return $s;
		}
	}
	
	$email = new HTMLInput('text','email');  
	$email->validateFunction(function($mail) {
		if(!preg_match('/^.+@[a-z]+\.[a-z]{2,3}$/iD', $mail))  
			throw new Exception('Die eingebene E-Mailadresse ist ungültig!');  
		return strtolower($mail);
	});
	
?>
<html>
	<body>
		<form action="" method="post">  
			<?php echo $email->render(); ?>
		</form>
	</body>
</html>
(PHP 5.3.0 vorrausgesetzt, ungetestet)
christophkoeln
christophkoeln 31.01.2010 um 20:28:00 Uhr
Goto Top
Ok - ich gebe es zu, Du spielst in einer anderen PHP-Klasse - da komme ich nicht ran - was "Klassen" in PHP angeht, fehlt mir noch die Erfahrung. Einfacher geht's für den Newbi nicht, oder ?
Ich find' es wirklich bewundernswert, wie Du das in 25 Minuten aus dem Ärmel schüttelst, aber dafür spiel ich Dich fußballtechnisch in einer Telöefonzelle schwindelig - wetten ? So hat halt jeder seine Stärken face-wink) - Danke Dir trotzdem face-wink.
48507
48507 31.01.2010 um 20:41:02 Uhr
Goto Top
Füge diese Funktion irgendwo oben hinzu:

function checkmail($email){
if (! ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $email))  
{$i="0";}  
else {$i="1";}  
return $i;
}

Dann ändere

elseif (preg_match($RegXmail, $mail)== 0)
{
$fehlerflag = true;
$fehlertext .= " Die Mailadresse ist nicht gültig."; /* ... soll möglichst als Formularlabel ausgegeben werden */  
}

in

elseif (checkmail($mail)==0)
{
$fehlerflag = true;
$fehlertext .= " Die Mailadresse ist nicht gültig."; /* ... soll möglichst als Formularlabel ausgegeben werden */  
}
christophkoeln
christophkoeln 31.01.2010 um 22:51:00 Uhr
Goto Top
Hallo spytnik,

danke für Deine Mühe, aber soweit ich sehe, ändert sich durch Deine Funktion nichts an der Art und Weise und v.a. am Ort der Fehlermeldung - und nur darum geht es mir hier. Die Plausibilitätsprüfung steht ja schon fest.

Also - noch mal ganz simpel

Ich habe ein Formular auf einer Seite und möchte, dass sich nach Mausklick auf den Submit-Botton - ganz unabhängig von irgendwelchen Daten, egal, ob Eingaben geschehen sind, oder nicht - sich alle Überschriften über den Formularfeldern in "Hallo Welt" ändern und alle Inputfeld-Hintergründe rot werden.

Geht das auf simple Weise oder nicht ?

Gruß aus Köln
Edi.Pfisterer
Edi.Pfisterer 01.02.2010 um 08:05:26 Uhr
Goto Top
Hallo!
Ja, das geht!
Da ich in Eile bin ohne Code - nur die Idee:

Du greifst ab, ob der user den Submit-Button betätigt hat (in dem Du die länge der Benutzereingabe submit überprüfts (der Input-type submit hat ja auch einen value).

Wenn er das Formular also abgesendet hat, dann lädst Du einfach ein anderes CSS-File. Fertig.

Vielleicht gehts eleganter, aber nachdem Dir niemand mehr geantwortet hat, empfehle ich Dir mal diese Lösung, die
1.) einfach zu realisieren ist und
2.) sicher funtkioniert.

lg
nxclass
nxclass 01.02.2010 um 09:14:50 Uhr
Goto Top
Datei: default.css
form {
    background-color: #eee;
    padding: 20px;
    border: 1px solid #8c8c8c;
    font-family: Verdana, Arial, Helvetica;
    font-size: small;
    margin-left: 160px;
    width: 400px;
}
div.err_name { }
div.err_mail { }
div.err_nachricht { }

Datei: sub_kontaktformular.php
<?php
    // Das Template für dein Formular mit HTML Kopf und Fuss
    $tpl_html = <<<__HTML__
<!DOCTYPE html PUBLIC " -W3CDTD XHTML 1.0 Transitiona lEN" "http:www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html>
<head>
    <title></title>
    <link href="default.css" type="text/css" />  
</head>
<body>

<form id="kontaktformular" name="kontaktformular" action="sub_kontaktformular.php" method="post">  
    <div class="{CSS_NAME}">  
        <label for"name"> Ihr Name {ERR_NAME}</label> <br />  
        <input type="text" id="name" name="name" size="62" value="{NAME}" />  
    </div>
    <div class="{CSS_MAIL}">  
        <label for"mail"> Ihre E-Mail-Adresse {ERR_MAIL}</label> <br />  
        <input type="text" id="mail" name="mail" size="62" value="{MAIL}" />  
    </div>
    <div class="{CSS_NACHRICHT}">  
        <label for "nachricht"> Ihre Nachricht an uns {ERR_NACHRICHT}</label> <br />  
        <textarea id="nachricht" name="nachricht" cols="47" rows="3">{NACHRICHT}</textarea>  
    </div>
    <div> <input type="submit" value="Senden" name="go" /> </div>  
</form>

</body>
__HTML__;


// alle Ersetzungs Tags raussuchen
$aReplace = array();
if (preg_match_all('/(\{[A-Z0-9\_]*\})/', $tpl_html, $list)) {  
    foreach (array_keys($list) as $key) {
        $aReplace[$key] = '';  
    }
}

// @todo ...
// Inhalte prüfen und Inhalte zu den Tags in das $aReplace Array speichern
// ggf Email versenden

// Inhalte ersetzen
$tpl_html = str_replace(array_keys($aReplace), array_values($aReplace), $tpl_html);
// und ausgeben
echo $tpl_html;

?>