$_Post auswerten

inspiron8

Mitglied
Hallo,
in einem Formular befinden sich Dropdown Felder deren Inhalt aus einer DB gefüllt werden.
Abhängig von der Auswahl soll eine Auswertung gemacht werden ob
" ", = leer
"*", = Trenner für die Übersicht im Dropdown
"Bitte auswählen!" = erster Eintrag im Dropdown
ausgewält wurde.


...ein Problem ist, das bei der Auswahl "Bitte auswählen!" dieses nicht als Fehler erkannt und das Formular dann versendet wird.
Code:
Schicht ---> Bitte auswählen!
Ort ---> Bitte auswählen!
NULL
Array
(
    [schicht] => Bitte auswählen!
    [ort] => Bitte auswählen!
    [ueberpruefung] => 1
    [eintragen] => Absenden
)
Anbei ein Auszug als Testdatei:
PHP:
Gruß
<?php
error_reporting(E_ALL ^  E_NOTICE);

//  Datenbankzugriff
include 'config_db.php';

    
//Beim Senden eines Formulars die gewählte Auswahl in der Auswahlliste beibehalten.       
//--ist Eintrag selektiert? 
function isselected($value, $postvalue){ 
 $sel=""; 
  if(isset($postvalue) ){ 
    $sel = ($value== $postvalue) ? ' selected="selected"' : ""; 
  } 
    return ($sel); 
}

/* Formular mit Fehlerauswertung - Dieses Script überprüft ob alle Felder eines Formulars ausgefüllt wurden 
   und hebt nicht ausgefüllte hervor 
*/
$errorFelder = array(); 
$error = null; 
$felder = array("schicht", "ort"); 

// hier startet die Überpruefung der Eingabe im Formular 
if(isset($_POST['ueberpruefung'])) { 
  $error = false; 
    
  foreach($felder as $feld) { 
    if("" ==($_POST[$feld]) or "*" ==($_POST[$feld]) or "Bitte auswählen! " ==($_POST[$feld])) { 
      $error = true; 
      $errorFelder[$feld] = true; 
    } 
  } 
}
if($error === false) { 

  echo "Schicht ---> ".$_POST['schicht']; 
  echo "<br>"; 
  echo "Ort ---> ".$_POST['ort'];  

} else { 

  if($error === true) 
          echo "<b>Bitte die Rot markierten Felder ausf&uuml;llen!</b>";
?> 

<style type="text/css"> 
select.error { 
    border: red;
    border-style: solid; 
    border-top-width: 2px; 
    border-right-width: 2px; 
    border-bottom-width: 2px; 
    border-left-width: 2px; 
}

</style> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> 
  <body> 
    <form class="commentForm" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>">
        
        <label class="schicht">Schicht</label>
        <select name="schicht" id="schicht" <?php if(isset($errorFelder['schicht'])) echo 'class="error"'; ?>>    
        <?php //Beim Senden eines Formulars die gewählte Auswahl in der Auswahlliste beibehalten.
   
               $sql = "SELECT schicht FROM dropdown_schicht "; 
            $result = mysql_query($sql); 
            // für jeden Eintrag ein Option-Tag erstellen                 
            while ($arrschicht = mysql_fetch_array($result, MYSQL_ASSOC)) { 
             
            foreach ($arrschicht as $zeile) { 
              $sel = isselected($zeile, $_POST['schicht']); 
              echo '<option '.$sel .'>'.$zeile.'</option>'; 
            }
            } 
            ?> 
          </select>
          
          <label class="ort">Standort</label>
          <select name="ort" id="ort" <?php if(isset($errorFelder['ort'])) echo 'class="error"'; ?>>
               <?php
   
               $sql = "SELECT ort FROM dropdown_ort "; 
            $result = mysql_query($sql); 
            // für jeden Eintrag ein Option-Tag erstellen                 
            while ($arrort = mysql_fetch_array($result, MYSQL_ASSOC)) { 
             
            foreach ($arrort as $zeile) { 
              $sel = isselected($zeile, $_POST['ort']); 
              echo '<option '.$sel .'>'.$zeile.'</option>'; 
            }
            } 
            ?>
          </select>
          
        <input type="hidden" name="ueberpruefung" value="1">
        <input type="submit" class="Button" name="eintragen" id="eintragen" value="Absenden"/> 
    </form> 

  </body> 
</html>

<?php
}
echo "<pre>";
var_dump($errors);
print_r($_POST);
echo "</pre>";
?>
 
Hi

hast du mal geprüft bzw, ausgeben lassen, was da ankommt?
Ist wirklich ein Leerzeichen hinter dem ! bei "Bitte auswählen! " ?
 
Folgendes habe ich geändert:
PHP:
function isselected($value, $postvalue){ 
 $sel=""; 
  if(isset($postvalue) ){ 
    $sel = ($value== $postvalue) ? ' selected="selected"' : ""; 
  } 
    return ($sel); 
}
zu:
PHP:
function is_selected($val, $post)
{
	return (isset($post) && $post == $val) ? 'selected="selected"' : '';
}
Vor jedem $_POST die trim Funktion gesetzt.

Desweiteren habe ich gesehen das deine <select> <option> Element garkein Wert hatten.
PHP:
echo '<option '.$sel .'>'.$zeile.'</option>';
was eigentlich so aussehen sollte:
PHP:
echo '<option value="'.$zeile.'"'.$sel .'>'.$zeile.'</option>';

Probier den Code mal aus:
PHP:
<?php

ini_set('display_errors', 1);
error_reporting(~0);


//  Datenbankzugriff
include 'config_db.php';


$ueberpruefung	= (isset($_POST['ueberpruefung'])) ? trim($_POST['ueberpruefung']) : '';
$schicht	      = (isset($_POST['schicht']))       ? trim($_POST['schicht']) : '';
$ort		      = (isset($_POST['ort']))           ? trim($_POST['ort']) : '';

function is_selected($val, $post)
{
	return (isset($post) && $post == $val) ? 'selected="selected"' : '';
}

$errorFelde   = array();
$error		= false;
$felder       = array("schicht", "ort");

// hier startet die Überpruefung der Eingabe im Formular 
if($ueberpruefung != "")
{
  foreach($felder as $feld)
  {	
    if("" == trim($_POST[$feld]) or 
	   "*" == trim($_POST[$feld]) or
	   "Bitte auswählen!" == trim($_POST[$feld])
      )
      {
        $error = true;
        $errorFelder[$feld] = true;
      }
  }
}

if($error === false)
{
  echo "Schicht ---> ".$schicht;
  echo "<br>";
  echo "Ort ---> ".$ort;
}
else
{ 

  if($error === true){ echo "<b>Bitte die Rot markierten Felder ausf&uuml;llen!</b>"; }
?> 

<style type="text/css"> 
select.error { 
    border: red;
    border-style: solid; 
    border-top-width: 2px; 
    border-right-width: 2px; 
    border-bottom-width: 2px; 
    border-left-width: 2px; 
}

</style> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> 
  <body>
    <form class="commentForm" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>">
        <label class="schicht">Schicht</label>
        <select name="schicht" id="schicht" <?php if(isset($errorFelder['schicht'])) echo 'class="error"'; ?>>
        <?php
            $sql = "SELECT schicht FROM dropdown_schicht"; 
            $result = mysql_query($sql); 
			
            // für jeden Eintrag ein Option-Tag erstellen                 
            while ($arrschicht = mysql_fetch_array($result, MYSQL_ASSOC))
			{
				foreach ($arrschicht as $zeile)
				{
				  $sel = is_selected($zeile, $_schicht);
				  
				  echo '<option value="'.$zeile.'"'.$sel .'>'.$zeile.'</option>';
				}
            }
            ?>
          </select>
          <label class="ort">Standort</label>
          <select name="ort" id="ort" <?php if(isset($errorFelder['ort'])) echo 'class="error"'; ?>>
               <?php
   
               $sql = "SELECT ort FROM dropdown_ort";
            $result = mysql_query($sql);
            // für jeden Eintrag ein Option-Tag erstellen
            while ($arrort = mysql_fetch_array($result, MYSQL_ASSOC))
			{
				foreach ($arrort as $zeile)
				{ 
				  $sel = is_selected($zeile, $ort);
				  
				  echo '<option value="'.$zeile.'"'.$sel .'>'.$zeile.'</option>'; 
				}
            } 
            ?>
          </select>
        <input type="hidden" name="ueberpruefung" value="1">
        <input type="submit" class="Button" name="eintragen" id="eintragen" value="Absenden"/> 
    </form> 

  </body> 
</html>

<?php

}

echo "<pre>";
var_dump($error);
print_r($_POST);
echo "</pre>";
?>
 
Wow,
danke erst einmal. Ich werde es heute Nachmittag mal in Ruhe testen.
Ich melde mich

Gruß

Hi

hast du mal geprüft bzw, ausgeben lassen, was da ankommt?
Ist wirklich ein Leerzeichen hinter dem ! bei "Bitte auswählen! " ?

Hallo,
im DB Eintrag befindet sich hinter "Bitte auswählen! " ein Leerzeichen. Ist noch eine Altlast, habe es entfernt.

Die Ausgabe wenn kein Fehler erkannt wird:

Schicht ---> Bitte auswählen!
Ort ---> Bitte auswählen!


var_dump($error);
print_r($_POST);

NULL
Array
(
[schicht] => Bitte auswählen!
[ort] => Bitte auswählen!
[ueberpruefung] => 1
[eintragen] => Absenden
)
Gruß

So,
ich habe den Code getestet.
Beim aufrufen der Seite wechselt diese gleich in die echo Anzeige:

Schicht --->
Ort --->

bool (false)
Array
(
)
 
Ok. Ändere mal bitte das:
PHP:
$errorFelder   = array();
$error        = false;
$felder       = array("schicht", "ort");

// hier startet die Überpruefung der Eingabe im Formular 
if($ueberpruefung != "")
{
  foreach($felder as $feld)
  {    
    if("" == trim($_POST[$feld]) or 
       "*" == trim($_POST[$feld]) or
       "Bitte auswählen!" == trim($_POST[$feld])
      )
      {
        $error = true;
        $errorFelder[$feld] = true;
      }
  }
}
zu
PHP:
$errorFelder   = array();
$error        = "";
$felder       = array("schicht", "ort");

// hier startet die Überpruefung der Eingabe im Formular 
if($ueberpruefung == "1")
{
  $error = false;
  foreach($felder as $feld)
  {
    if("" == trim($_POST[$feld]) or 
       "*" == trim($_POST[$feld]) or
       "Bitte auswählen!" == trim($_POST[$feld])
      )
      {
        $error = true;
        $errorFelder[$feld] = true;
      }
  }
}

So wird bei mir das Formular angezeigt
 
Vielleicht auch mal var_dumpen. Damit erkennt man liecht nicht druckbare zeichen im String (Zeichen zählen!)
 
Ich habe mal in einer DB-Tabelle den Eintrag "Bitte auswaehlen!" das ä in ae geändert, dann im ersten Select ein "*" und im zweiten "Bitte auswaehlen!" ausgewählt.
Das Formular wird nicht versendet und beide Selectfelder werden rot markiert. Wie kann man nun das Problem mit dem Umlaut lösen?

bool(true)
array(2) {
["schicht"]=>
bool(true)
["ort"]=>
bool(true)
}

bool(true)
array(2) {
[0]=>
string(7) "schicht"
[1]=>
string(3) "ort"
}

Array
(
[schicht] => *
[ort] => Bitte auswaehlen!
[ueberpruefung] => 1
[eintragen] => Absenden
)
 
Zuletzt bearbeitet:
Umwandlung von Umlauten kannst du wie folgt durchführen:

str_replace
PHP:
$umlaute = array(
        'ä' => '&auml;',
        'Ä' => '&Auml;',
        'ß' => '&szlig;',
        'ö' => '&ouml;',
        'Ö' => '&Ouml;',
        'Ü' => '&Uuml;',
        'ü' => '&uuml;',
    );

$text = str_replace(array_keys($umlaute), array_values($umlaute), $text);
htmlentities
PHP:
htmlentities($string);

Genauere details kannst du dir aus dem PHP-Manual erlesen.
 
Also, damit ich es endlich mal verstehe:

Formular --> Input, Select, Textfeld: Text mit Umlaut geschrieben --> zum speichern in DB "ä" umwandeln in "ae"
DB ---> Werte auslesen "ae" umwandeln in "ä" ---> Anzeige im Formular

Ist das so richtig?

Groß
 
Ich habe mal ein Beispiel für dich:

Im HTML-Code benutzt du für "ä,ö,ü,ß,usw..." die htmlentities also "&auml; | &ouml; | &uuml; | &szlig; | usw..."
Wird das Formular abgesendet via POST weiß PHP das es sich um ein ä handelt und du kannst dementsprechend auch im PHP-Code mit diesem ä arbeiten.

HTML:
<form action="" method="post">
<select name="schicht">
	<option value="Bitte Ausw&auml;hlen">Bitte Ausw&auml;hlen</option>
	<option value="Test">Test</option>
</select>
<input type="submit" name="senden" value="Senden">
</form>
PHP:
<?php

$schicht = (isset($_POST['schicht'])) ? trim($_POST['schicht']) : '';

if($schicht == "Bitte Auswählen")
{
	echo "ja";
}

?>

Beim speichern des Wertes also "Bitte auswählen" in die Datenbank verwendest du die Umwandlung.
PHP:
$value = htmlentities("Bitte auswählen");
$sql = "INSERT INTO `schicht` (`id`, `value`) VALUES ('1', $value)";
mysql_query($sql) or die(mysql_error());

Lädst du jetzt die Datenbankeinträge aus und lässt sie in HTML anzeigen wie im obigen HTML-Code Block
schließt sich der Kreis. Bei auslesen aus der Datenbank muss somit keine Umwandlung mehr geschehen.

  • DB: &auml; -> HTML
  • HTML: &auml; -> PHP
  • PHP-Code: erkennt &auml; und wandelt es selbst in ä um
    und es kann mit $_POST['schicht'] == "Bitte auswählen" verglichen werden
  • PHP -> DB: Umwandlung ä -> &auml; siehe obiges PHP-Beispiel
 
Zurück