PHP + MSSQL: Selektierung

Vielen Dank. Mit dem praktischen Beispiel konnte ich viel mehr anfangen und habe es auch auf Anhieb verstanden.
Ich habe jetzt noch eine weitere Selektionsoptionen hinzugefügt. Neben der Kundennummer steht nun auch noch die Artikelnummer als Selektionsoption zur Verfügung. Dazu habe ich jetzt noch eine Frage. Momentan ist es ja so, dass wenn beide Textfelder leer sind, einfach alles ausgespuckt wird. Trage ich was in eines der beiden Felder ein, wird nur das Ausgewählte ausgespuckt. Nur wie kann ich nun die beiden Felder miteinander verbinden? Sprich ich habe zwei Felder, aber nur ein "submit-button". Wenn ich in das eine Feld etwas eingeb und das andere bleibt leer, wird nur das eine beachtet. Wenn ich jetzt aber in beide auf einmal was eingebe, soll beides auf einmal beachtet werden und die Abfrage somit weiter selektiert werden. Wie stell ich das an, bitte? Kann mir da jemand weiterhelfen?
 
Hallo,

eigentlich ganz einfach:
Dein Formular sieht ungefähr so aus:

HTML:
<form action="<?$_SERVER['PHP_SELF']?>" method="post">
<input type="text" name="kdnummer">
<input type="text" name="artnummer">
<input type="submit" name="senden" value="senden">
</form>

Dann erweiterst du deine if-Abfrage:
PHP:
if(empty($_POST['kdnummer']) && empty($_POST['artnummer'])){
  //Selektiere alles
   $query = "SELECT testspalte, testspalte_2 FROM testtabelle";
} elseif(!empty($_POST['kdnummer']) && empty($_POST['artnummer'])){
  //Selektiere nur Kundennummer
  $query = "SELECT testspalte, testspalte_2 FROM testtabelle WHERE spaltenname = '".$_POST['kdnummer']." ' ";
} elseif(empty($_POST['kdnummer']) && !empty($_POST['artnummer'])){
  //Selektiere nur Artikelnummer
  $query = "SELECT testspalte, testspalte_2 FROM testtabelle WHERE spaltenname2 = '".$_POST['artnummer']." ' ";
} else {
  //Selektiere, wo beide Felder gesetzt sind
  //Bei Bedarf kann AND auch durch OR ersetzt werden
  $query = "SELECT testspalte, testspalte_2 FROM testtabelle WHERE spaltenname = '".$_POST['kdnummer']." ' AND spaltenname2 = '".$_POST['artnummer']." ' ";
}

Das Ganze könnte man natürlich schöner machen, aber funktionieren sollte es. Es setzt allerdings auch voraus, dass kdnummer und artnummer in einer Datenbanktabelle stehen, was meiner Meinung nach nicht logisch ist?

Gruß.
 
Ich danke Dir schonmal sehr! Hast mir sehr weitergeholfen.
Ich habe es jetzt nochmals um eine weitere Selektionsoption erweitert. (Eine vierte kommte ebenfalls noch dazu). Eine einzelne Selektion funktioniert, nur wenn ich zwei bzw. drei Selektionsfelder gleichzeitig ausfülle, spuckt er garnichts aus. Kannst Du mir bitte sagen was ich falsch gemacht habe?

Hier das Formular: (Das Layout spielt hier ja keine Rolle)

HTML:
<form action="<?$_SERVER['PHP_SELF']?>" method="post">
Kundennr<input type="text" name="kdnr">
Artikelnr<input type="text" name="artikelnr">
Lieferantenname<input type="text" name="lieferant">
<input type="submit" name="senden" value="senden">
</form>

Die If-Abfrage:

PHP:
// Abfrage der Spalten aus der Tabelle

if(empty($_POST['kdnr']) && empty($_POST['artikelnr']) && empty($_POST['lieferant'])){
  //Selektiere alles
   $query = "SELECT * FROM testtabelle";
   
} elseif(!empty($_POST['kdnr']) && empty($_POST['artikelnr']) && empty($_POST['lieferant'])){
  //Selektiere nur Kundennummer
  $query = "SELECT * FROM testtabelle WHERE testspalte = '".$_POST['kdnr']." ' ";
  
} elseif(!empty($_POST['artikelnr']) && empty($_POST['kdnr']) && empty($_POST['lieferant'])){
  //Selektiere nur Artikelnummer
  $query = "SELECT * FROM testtabelle WHERE testspalte_2 = '".$_POST['artikelnr']." ' ";
  
} elseif(!empty($_POST['lieferant']) && empty($_POST['kdnr']) && empty($_POST['artikelnr'])){
  //Selektiere nur Lieferantenname
  $query = "SELECT * FROM testtabelle WHERE testspalte_6 = '".$_POST['lieferant']." ' ";
  
} else {
  //Selektiere mehrere Felder
  $query = "SELECT * FROM testtabelle WHERE testspalte = '".$_POST['kdnr']." ' OR testspalte_2 = '".$_POST['artikelnr']." ' OR testspalte_6 = '".$_POST['lieferant']." '  ";
}
 
Hallo,

deine Schachtelung bei den if-Abfragen stimmt nicht.

empty($wert) überprüft ja ob ein Wert gesetzt ist oder nicht. Der Rückgabewert ist true oder false. Durch die &&-Verknüpfung bekommst du bei zwei oder drei Werte halt kein Ergebnis.

Gruß.
 
Hm, ich habe jetzt ewig rumprobiert, bekomme es aber nicht hin. Kannst Du mir bitte genau sagen wie ich es richtig sein muss?
 
Hallo,

ich würde es dann wohl so machen:

PHP:
// Abfrage der Spalten aus der Tabelle
// Jeder per post übergebene Wert wird zu einer Variable
foreach ($_POST as $key => $value){
	$$key = $value;
}

// Selektieren alles.
// Dies ist auch für alle anderen Abfragen die Grundlage
$query = "SELECT * FROM testtabelle";

//Ist eines der Textfelder gesetzt...
if(isset($kdnr) || isset($artikelnr) || isset($lieferant)){
	$query .= " WHERE ";
	
	//... dann muss auch der Abfrage-String erweitert werden.
	//nachfolgend kann AND auch durch OR ersetzt werden
	if(!empty($kdnr))
		$query .= " kdnr = '$kdnr' AND ";
	
	if(!empty($artikelnr))
		$query .= " artikelnr = '$artikelnr' AND ";
		
	if(!empty($lieferant))
		$query .= " lieferant = '$lieferant' AND ";
	
	//Am Ende ist noch zu überprüfen, dass nicht AND am Schluss steht,
	//daher wird einfacher der String gekürtzt.
	//Bei OR muss die 4 durch 3 ersetzt werden.
	$query = substr($query, 0, strlen($query)-4);
}

Allerdings wie ich schon oben geschrieben habe, ist noch zu klären ob du wirklich die felder kundennummer, artikelnummer und lieferant in einer Tabelle stehen hast?

Gruß.
 
Ja, die Felder bzw. Spalten stehen alle in einer Tabelle.

Dein Vorschlag kommt meiner Vorstellung schon etwas näher, allerdings nur bedingt.
Ich versuche es etwas genauer zu erklären:
- Ich habe zum Beispiel eine Spalte (ein Feld) namens Kundennummer
- Ich habe zum Beispiel eine Spalte (ein Feld) namens Artikelnummer

Wenn ich jetzt zum Beispiel nach einer bestimmten Kundennummer selektieren möchte, sollen nur die Datensätze angezeigt werden, die zu der Kundennummer passen. Selektiere ich jetzt noch eine Stufe weiter, sprich ich gebe eine Kundennummer und eine Artikelnummer ein, sollen nur die Datensätze mit der eingegebenen Artikelnummer, die mit der eingegebenen Kundennummer übereinstimmen, angezeigt werden.
Momentan ist es aber so, dass wenn ich nach der Kunden- und Artikelnummer gleichzeitig selektiere, beides ausgespuckt wird. Soll heissen, zum einen die Datensätze, die zur eingegebenen Kundennummer passen und zum anderen die Datensätze, die zur eingegebenen Artikelnummer passen.
Ich hoffe Du verstehst mich.

/EDIT: Vergess bitte was ich hier geschrieben habe. Ich Dussl hatte anstatt OR AND hingeschrieben. OR hat zum oben beschriebenen Ergebnis geführt (welches ich ja nicht wollte) und AND setzt meine Vorstellung vollkommen um.
Nur noch eine letzte Frage zu dem Thema: In der Tabelle ist ebenfalls eine Spalte angelegt, die das Datum speichert und zwar so: jjjjmm
Wie kann ich das jetzt in der Selektierung mit zwei Feldern umsetzen? Sprich ich habe ein Feld "von" und ein Feld "bis". Mit einem wo man lediglich das Datum wie jjjjmm eingibt ist ja einfach, aber das ganze wie oben beschrieben umzusetzen, habe ich meine Schwierigkeiten. Hast Du mir da einen praktischen Denkanstoß, bitte?
 
Zuletzt bearbeitet:
Hallo.

Also wenn ich dich richtig verstehe, dann willst du einen Zeitraum eingrenzen.

HTML:
datum > '$_POST['von']' AND datum < '$_POST['bis']'

sollte dir weiterhelfen.

Gruß.
 
Dank Dir, nur irgendwie komm ich mit dem Einbauen nicht so richtig zurecht.

Formular:

HTML:
<form action="<?$_SERVER['PHP_SELF']?>" method="post">
   <td class="content1">Kundennr<input class="eingabe" size="15" type="text" name="kdnr"></td>
   <td class="content1">Artikelnr<input class="eingabe" size="15" type="text" name="artikelnr"></td>
   <td class="content1">Liefname<input class="eingabe" size="25" type="text" name="lieferant"></td>
   <td class="content1">Von<input class="eingabe" size="10" type="text" name="von"></td>
   <td class="content1">Bis<input class="eingabe" size="10" type="text" name="bis"></td>
   <td class="content1"><input class="button" type="submit" name="senden" value="Anzeigen"></td>
  </form>

DB-Abfrage:

PHP:
// Abfrage der Spalten aus der Tabelle
// Jeder per post übergebene Wert wird zu einer Variable
foreach ($_POST as $key => $value){
    $$key = $value;
}

// Selektieren alles.
// Dies ist auch für alle anderen Abfragen die Grundlage
$query = "SELECT * FROM testtabelle";

//Ist eines der Textfelder gesetzt...
if(isset($kdnr) || isset($artikelnr) || isset($lieferant) || isset($von) || isset($bis)){
    $query .= " WHERE ";
    
    //... dann muss auch der Abfrage-String erweitert werden.
    //nachfolgend kann AND auch durch OR ersetzt werden
    if(!empty($kdnr))
        $query .= " testspalte = '$kdnr' AND ";
    
    if(!empty($artikelnr))
        $query .= " testspalte_2 = '$artikelnr' AND ";
        
    if(!empty($lieferant))
        $query .= " testspalte_6 = '$lieferant' AND ";
        
    if(!empty($von)) && (!empty($bis))
        $query .= " testspalte_7 = 'datum > '$von' AND datum < '$bis'";
    
    //Am Ende ist noch zu überprüfen, dass nicht AND am Schluss steht,
    //daher wird einfacher der String gekürtzt.
    //Bei OR muss die 4 durch 3 ersetzt werden.
    $query = substr($query, 0, strlen($query)-4);
}

Kannst Du mir bitte sagen wie es richtig geht?
 
Hallo,

PHP:
if(isset($von)) && (isset($bis))
        $query .= " testspalte_7 > '$von' AND testspalte_7 < '$bis' AND ";

Gruß.
 
Zurück