db Abfrage mit Formular

Larnhof

Mitglied
Hallo!

Ich habe eine DB erstellt wo ich mittels einen php/html Formular Daten einfügen kann.Dies funktioniert auch super.
So nun möchte ich zum einfachen auslesen der Daten wieder ein php/html Formular erstellen und nun steh ich gerade mit meinem wissen so ziemlich an.

Meine DB sieht wie folgt aus:
Spalte1->tester1, tester2, tester3
Spalte2->Firma1, Firma2, Firma3
Spalte3->Standort1, Standort2, Standort3
Spalte4->Datum1, Datum2, Datum3
Spalte5->Uhrzeit1, Uhrzeit2, Uhrzeit3
Spalte6->taetigkeit1, taetigkeit2, taetigkeit3

Mit meinem Formular zum auslesen dieser Daten hab ich mir vorgestellt das ich die Auswahl mit Auswahllisten mache.
Ich möchte das ich z.B. auswählen kann
Bitte wählen Sie einen Benutzer aus: (tester1)
Bitte wählen Sie eine Firma aus: ()
Bitte wählen Sie einen Standort aus: ()
...


nun sollen alle einträge ausgegeben werden wo tester1 vorkommt z.B.:
tester1->Firma1->Standort2->Datum1->Uhrzeit1->taetigkeit2

weiters sollte es möglich sein mehrere Auswahlkriterien zu treffen z.B.:
Firma3-Standort3-Datum2
nun sollen alle einträge ausgegeben werden wo die 3 Kriterien vorgekommen sind z.B.:
tester1->Firma3->Standort3->Datum2->......
tester3->Firma3->Standort3->Datum2->.....

So nun hab ich mir gedacht dies mit if/case anweisung zu lösen was ich aber nicht sehr für vorteilhaft halte.
Hab mir auch schon das Affenformular angeschaut aber ich weis nicht genau ob dies das richtige ist.

könnte mir vielleicht jemand Bitte tipps geben wie ich das am besten lösen könnte.
Vielen Dank schonmal im Voraus
Gruß
 
Im SQL das du an die DB schickst um die Daten abzurufen einen WHERE-Teil einabauen

SQL:
SELECT *
FROM myTable
WHERE
    spalte1 = 'wert1'
    AND spalte2 = 'wert2'
 
Zuletzt bearbeitet von einem Moderator:
Hallo!
Danke für deine Antwort!
Vielleicht hab ich meine Frage noch etwas blöd gestellt.
Bei den Auswahllisten sollte im prinzip nur nach dem gesucht werden was ich auch ausgewählt habe.

Bitte wählen Sie einen Benutzer aus: (tester1)
Bitte wählen Sie eine Firma aus: (Firma2)
Bitte wählen Sie einen Standort aus: ()

jetzt soll nur das angezeigt werden was meinen Auswahlkriterien entspricht.:
tester1->Firma2->standort1->...
tester1->Firma2->Standort3->...
...

ich hab mal ein script geschreiben das so ähnlich funktioniert nur kann ich eben nur eine Auswahl treffen:
PHP:
<?php
  
  require("logintemplate.php");
  require("index.php");
  
  ?>
<!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">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Listing 18.9</title>
    
    
    </style>
  </head>
  <body>
  <div>
  <h1>Kundenliste mit verbessertem Formular</h1>
<?php


  if(!isset($_REQUEST['set'])) {?>
    <form action="<?php $PHP_SELF ?>" method="post">
    <input type="hidden" name="set" value="TRUE" >
    <p><b>Suche nach:</b>
    <select size="1" name="spalte">
    <option value="Name">Name</option>
    <option value="Firma">Firma</option> 
    <option value="Standort">Standort</option>
    <option value="Datumv">Datum</option>
    </select>
    <b>Suchbegriff:</b>
    <input type="text" name="suche" size="40" /></p>
    <p><input type="submit" value="Suche starten..." /></p>   
  <?php
  }
  else {
    if($_REQUEST['suche'] == "")
      $sql = " SELECT * FROM projekte;";
    else
      $sql = "SELECT * FROM projekte WHERE " . $_REQUEST['spalte'] .
						 " LIKE '" . $_REQUEST['suche'] . "%';";
                              
   
      
        $erg = @mysql_query($sql);
        if($erg) {
          if(mysql_num_rows($erg) <= 0) { //Abfrage ob das Ergebniss der Datenbankabfrageungleich 0 ist dann echo
            echo "<p>Leider konnte kein Datensatz in der Kategorie<br /><b>"
                 . strtoupper($_REQUEST['spalte']) . "</b> mit dem Suchbegriff <b>"
                 . strtoupper($_REQUEST['suche']) . "</b> gefunden werden!</p>";
            unset($_REQUEST['set']);
            echo "<p><a href=\"" . $_SERVER['PHP_SELF'] . "\">Zur&uuml;ck zum Formular</a></p>";
          }
          else {          
            echo "<table border=3 bgcolor='#FFCC33'>";
            echo "<tr>";
            for($i=0; $i<mysql_num_fields($erg); $i++) { //mysql_num_fields() liefert die Anzahl der Felder in der Ergebnismenge, die mit dem Parameter Ergebnis-Kennung angegeben wurde.
              $feld = mysql_field_name($erg, $i);
              echo "<th>". ucfirst($feld) . "</th>"; //string ucfirst ( string $str ) Wandelt das erste Zeichen von str in einen Großbuchstaben um, wenn es ein Zeichen des Alphabets ist, und gibt den veränderten String zurück.
            }
            echo "</tr>";
            while($row = mysql_fetch_row($erg)) {
              echo "<tr>";
              for($i=0; $i<mysql_num_fields($erg); $i++)
                echo "<td>" . $row[$i] . "</td>";
              echo "</tr>";
            }
            echo "</table><p>";
            unset($_REQUEST['set']);
            ?><a href="test.php<?php session::showLink(true); ?>">Zurück zum Formular</a></p><?php
          }
        }      
        else
          echo "<h5>Es konnten keine Datens&auml;tze gefunden werden.</h5>";
        
     
  }
?>
  
    </div>
  </body>
</html>
 
Zuletzt bearbeitet:
Meisnt du sowas?
PHP:
$spalte = $_POST['spalte'];
$suche = $_POST['suche'];

$sql = "SELECT *
		FROM projekte
		WHERE {$spalte} LIKE '%{$suche}%'";

Ups, jetz verseth ich.. änderung meiens Beitrags folgt
 
Im SQL das du an die DB schickst um die Daten abzurufen einen WHERE-Teil einabauen

SQL:
SELECT *
FROM myTable
WHERE
    spalte1 = 'wert1'
    AND spalte2 = 'wert2'

Das was yaslaw geschrieben hat ist genau das, was du meinst.
Du suchst nach den Werten, die durch das Formular ausgegeben werden und gibst diese dann aus.

Zur Erklärung:
SQL:
SELECT *
FROM myTable
WHERE
    spalte1 = 'wert1'
    AND spalte2 = 'wert2'

SELECT * FROM myTable *Da sagst du, was er alles aus der angegebenen Tabelle myTable auslesen soll.

WHERE
spalte1 = 'wert1' *Erste Angabe was die Voraussetzung zur Ausgabe ist.
AND spalte2 = 'wert2' *Zweite Angabe was die Voraussetzung zur Ausgabe ist.

Und das kannst du beliebig oft fortführen, bis du alle Filterpunkte (Bedingungen) gesetzt hast.
 
Zuletzt bearbeitet von einem Moderator:
Er sucht eine elgante Lösung um die WHEREs zu setzen, je nachdem ob sie abgefüllt wurden oder nicht.

Ich hab hier mal ein kleines Beispiel erstellt.
PHP:
<?php
// Diese Zeile simuliert die Post-Übergabe eines Formulars
$_POST = array(
    'name'=>'user',     
    'firma'=>'GMBH', 
    'standort'=>'', 
    'datumv' =>'15.2.2010', 
    'unbekanntesFeld' => 'irgend was unerwünschtes');

/**
 * Funktion um aus den Werten je nach Datentyp einen richtigen SQL-WHERE - Teil zu bilden. 
 */
function createWherePart(&$wert, $spalte){
    switch($GLOBALS['allowedPost'][$spalte]){
        case 'date':
            //TODO: Format noch anpassen. Ist nicht umbedingt MySQL-Konform
            $wert = vsprintf('%02d-%02d-%04d', explode('.', $wert));
            break;
        case 'number':
            //Bei Number braucht es keine Formatierung "$spalte = 123"
            break;
        default:
            $wert = "'{$wert}%'";
    }
    $wert = "{$spalte} = {$wert}";    
}

//Erwartete Felder und ihr Datentyp
$allowedPost = array(
                    'name' => 'string', 
                    'firma' => 'string', 
                    'standort' => 'string', 
                    'datumv' => 'date');

//Array erstellen mit allen übergebenen Variablen die in $allowedPost definiert sind
//Mehr dazu: http://wiki.yaslaw.info/wikka/PhpPost2Var
//array_intersect_key entfernt nicht definierte Post-Values. In meinem Beipsiel 'unbekanntesFeld'
//array_filter ohne Filterfunktion filter alle leeren Einträge aus. in diesem Fall 'standort'
$wheres = array_filter(array_intersect_key($_POST, $allowedPost));

//Alle Wheres formatieren
array_walk($wheres, 'createWherePart');

//Alle Wheres mit 'AND' zusammenfügen ...
$where = implode(' AND ', $wheres);
//... und ggf den Befehl WHERE voranstellen
if($where) $where = "WHERE {$where}";

//SQL erstellen
$sql = "SELECT *
        FROM projekte
        {$where}";
        
echo $sql;        
?>
 
Zuletzt bearbeitet:
Danke djbergo für deine Antwort!

naja es wird denk ich mal ein sehr sehr lange Code da ich ja sehr viele Bedingung und Abhängigkeiten habe.
viel. ist meine Beschreibung des Problems noch nicht genau aber ich versuch es am besten rüber zu bringen.
viel. hilft das:
es soll so ähnlich werden wie z.B. Flugdestinationen zu finden.
welches Land: Kroatien
so jetzt bekomme ich alles ausgegebn was mit der Spalte Kroatien zu tun hat
Kroatien->Krk->am 15.02.2010->von Berlin->192€->....
Kroatien->Dubrovnik->am 09.07.2010->von München->250€->....

wenn ich jetzt mehr Kriterien habez.B.:
welches Land: Italien
welche Region: Sizilien
welches Datum: 15.02.2010
so jetzt sollen alle Datensätze mit diesen Kriterien angezeigt werden
italien->Sizilien->am 15.02.2010->von Berlin->192€->....
italien->Sizilien->am 15.02.2010->von München->210€->....
oder
welcher Preis: >250€
Abflughafen: Köln
so jetzt sollen alle Datensätze mit diesen Kriterien angezeigt werden
251€->Köln->Bulgarien->Varna->24.12.2010
269€->Köln->Österreich->Innsbruck->31.07.2010
 
Guten Morgen!!:D

@yaslaw
Dein Script läuft so weit ganz gut!ist echt Total super *RESPEKT*!
Nur eins bekomm ich nicht ganz hin und zwar ist es die Ausgabe.
Viel. steh ich auch total auf der Seife aber wenn ich dein Script so ausführe bekomme ich folgende ausgabe:

SELECT *FROM projekte 'WHERE name = 'user%' AND firma = 'GMBH%' AND datumv = 15-02-2010'

dies würde ja auch richtig sein aber ich bekomm keine Daten:confused:
hab es jetzt auch schon so probiert:
PHP:
<?php
	
			$spalte = $_POST['Name'];  //erzeugen der Variablen. 
			$spalte = $_POST['Firma'];
			$spalte = $_POST['Standort'];
			$spalte = $_POST['Datum'];
			
			
						
			function createWherePart(&$wert, $spalte)
		{    
			switch($GLOBALS['allowedPost'][$spalte]) //Mit der Funktion switch lassen sich abhängig vom Inhalt einer Variablen verschiedene Code-Abschnitte ausführen
				{
				case 'date': 
         
				$wert = vsprintf('%02d-%02d-%04d', explode('.', $wert));              
				break;        
				case 'number':           
				//Bei Number braucht es keine Formatierung "$spalte = 123"            
				break;        
				default:            
					$wert = "'{$wert}%'";    
			
				}    
			$wert = "{$spalte} = {$wert}";    
		} 
		//Erwartete Felder und ihr Datentyp
			
		$allowedPost = array( 
									'Name' => 'string',
									'Firma' => 'string',
									'Standort' => 'string',
									'Datumv' => 'date'); 
				//Array erstellen mit allen übergebenen Variablen die in $allowedPost definiert sind
				//array_intersect_key entfernt nicht definierte Post-Values. In meinem Beipsiel 'unbekanntesFeld'
				//array_filter ohne Filterfunktion filter alle leeren Einträge aus. 
				$where = array_filter(array_intersect_key($_POST, $allowedPost)); 
				//Alle Wheres formatieren
				array_walk($where, 'createWherePart'); 
				//Alle Wheres mit 'AND' zusammenfügen ...
				$where = implode(' AND ', $where);
				//... und ggf den Befehl WHERE voranstellen
				if($where) $where = "WHERE {$where}"; 
					//SQL erstellen
					$sql = "SELECT * FROM projekte {$where}";
					$erg = @mysql_query($sql);
					echo "<table border=3 bgcolor='#FFCC33'>";
					echo "<tr>";
					for($i=0; $i<mysql_num_fields($erg); $i++) //mysql_num_fields() liefert die Anzahl der Felder in der Ergebnismenge, die mit dem Parameter Ergebnis-Kennung angegeben wurde.
					{ 
					$feld = mysql_field_name($erg, $i);
						echo "<th>". $feld . "</th>";
					}
						echo "</tr>";
					while($row = mysql_fetch_row($erg)) 
					{
						echo "<tr>";
					  
					  for($i=0; $i<mysql_num_fields($erg); $i++)
						echo "<td>" . $row[$i] . "</td>";
						echo "</tr>";
					}
            
					echo "</table><p>";
		
				
		
			
	
  ?>

Ich versteh nicht ganz warum keine Abfrage passiert bzw. ich keine Ausgabe der Daten bekomme.
Viel. denke ich auch schon wieder zu kompliziert.

Vielen Dank
Gruss Larnhof
 
Zuletzt bearbeitet:
Ich steig jetzt mal mitten drin ein ohne mir alles vorherige durchzulesen.

Code:
SELECT *FROM projekte 'WHERE name = 'user%' AND firma = 'GMBH%' AND datumv = 15-02-2010'

Also ich weiß nicht welche Datenbank du verwendest aber wenn es mySQL ist, ist die Abfrage meiner Meinung nach so nicht richtig.

Code:
SELECT * FROM projekte WHERE name LIKE 'user%' AND firma LIKE 'GMBH%' AND datumv = '15-02-2010'

So müsste es klappen.
 
Zurück