PHP + MSSQL: Selektierung

Hm, das will nicht:

PHP:
// Ist eines der Textfelder gesetzt ...
if(isset($kdnr) || isset($artikelnr) || isset($lieferant) || isset($von) || isset($bis)){
    $query .= " WHERE ";
    
    // ... dann wird der Abfrage-String erweitert
    if(!empty($kdnr))
        $query .= " testspalte = '$kdnr' AND ";
    
    if(!empty($artikelnr))
        $query .= " testspalte_2 = '$artikelnr' AND ";
        
    if(!empty($lieferant))
        $query .= " testspalte_6 = '$lieferant' AND ";
        
    if(isset($von)) && (isset($bis)) 
        $query .= " testspalte_7 > '$von' AND testspalte_7 < '$bis' AND ";

Es wird folgende Fehlermeldung ausgespuckt:

Parse error: syntax error, unexpected T_BOOLEAN_AND in *** on line 95

Line 95 ist diese:

PHP:
if(isset($von)) && (isset($bis))

Wenn ich dem o.g. Codeschnipsel aus der 2. Zeile "|| isset($von) || isset($bis)" entferne, ändert das auch nichts am Sachverhalt.
Wie kann ich das Problem beheben, bitte?
 
Hallo

Wenn es sich um diese Zeile handelt:
PHP:
if(isset($von)) && (isset($bis))

dann liegt hier auch der Fehler.

Achte auf die Klammersetzung:

PHP:
if ( ( isset( $von ) ) && ( isset( $bis ) ) )

Gruß.
 
Jetzt wird garnix mehr ausgespuckt.

Bisher hatten wir immer "oben" isset benutzt (wenn eines der Textfelder gesetzt ist) und "unten" (wenn der Abfrage-String erweitert wird) !empty. Jetzt benützen wir auf einmal beides mal isset.
 
Hallo

Hast du dir mal den sql-Query ausgeben lassen?

In welcher Form ist dein Datum in der DB gespeichert und welche Form lässt du im Textfeld zu?

Gruß.
 
Wenn ich mir die normale SQL-Query ausgeben lasse, dann geht es. Also wenn ich keine Selektierung wähle bzw. alle Textfelder freilasse.

Das Datum wird in der DB so gespeichert: jjjjmm, sprich so zB 200608.
Welche Form ich im Textfeld zulasse? Ich habe das nicht begrenzt. Sollte ich? Wenn ja, wie mache ich das, bitte?
 
Zuletzt bearbeitet:
Hallo.

Dann poste bitte noch mal deinen kompletten Code.
In meinem Testbeispiel funktioniert es nämlich...

Hast du vielleicht keine Werte in entsprechender Selektierung.

Ja, Formularfelder sollte man eigentlich immer überprüfen. Bei dir würde sich da z.B. die Länge (6 Zeichen) und dann auch die Gültigkeit anbieten.

Gruß.
 
Hier der "komplette" Code, zumindest der, der für die Query verantwortlich ist:

PHP:
// Verbindung zur Datenbank herstellen
$dbverbindung = mssql_connect ($sqlhost, $sqluser, $sqlpass) or die (mssql_get_last_message());
mssql_select_db ($database, $dbverbindung) or die (mssql_get_last_message());

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

// Alles wird selektiert
// Gleichzeitig die Grundlage fuer alle anderen Abfragen
$query = "SELECT * FROM testtabelle";

// Ist eines der Textfelder gesetzt ...
if(isset($kdnr) || isset($artikelnr) || isset($lieferant) || isset($von) || isset($bis)){
    $query .= " WHERE ";
    
    // ... dann wird der Abfrage-String erweitert
    if(!empty($kdnr))
        $query .= " testspalte = '$kdnr' AND ";
    
    if(!empty($artikelnr))
        $query .= " testspalte_2 = '$artikelnr' AND ";
        
    if(!empty($lieferant))
        $query .= " testspalte_6 = '$lieferant' AND ";
        
    if ( ( isset( $von ) ) && ( isset( $bis ) ) )    
        $query .= " testspalte_7 > '$von' AND testspalte_7 < '$bis' AND ";
        
    // Abfrage-String wird gekuerzt um das AND am Schluss zu entfernen
    $query = substr($query, 0, strlen($query)-4);
}  


$sql = mssql_query($query) or die (mssql_get_last_message());

// Auslesen des Ergebnisses
while ($result = mssql_fetch_object($sql)){

//---> MS SQL Datenbank Spaltennamen <---\\
 $dbspalte_1 = $result -> testspalte;     
 $dbspalte_2 = $result -> testspalte_2;  
 $dbspalte_3 = $result -> testspalte_3;  
 $dbspalte_4 = $result -> testspalte_4;  
 $dbspalte_5 = $result -> testspalte_5; 
 $dbspalte_6 = $result -> testspalte_6;  
 $dbspalte_7 = $result -> testspalte_7; 
//---> MS SQL Datenbank Spaltennamen <---\\

// Ausgabe ueber echo
 echo "<tr>";
 echo "<td class=\"content2\">$dbspalte_1</td>";
 echo "<td class=\"content2\">$dbspalte_2</td>";
 echo "<td class=\"content2\">$dbspalte_3</td>";
 echo "<td class=\"content2\">$dbspalte_4</td>";
 echo "<td class=\"content2\">$dbspalte_5</td>";
 echo "<td class=\"content2\">$dbspalte_6</td>";
 echo "<td class=\"content2\">$dbspalte_7</td>";
 echo "</tr>";
}

mssql_close() or die (mssql_get_last_message());
?>
 
So hat es letztlich funktioniert:

PHP:
// Alles wird selektiert
// Gleichzeitig die Grundlage fuer alle anderen Abfragen
$query = "SELECT * FROM testtabelle";

// Ist eines der Textfelder gesetzt ...
if(!empty($kdnr) || !empty($artikelnr) || !empty($lieferant) || !empty($von) || !empty($bis)){
    $query .= " WHERE ";

    // ... dann wird der Abfrage-String erweitert
    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 > '$von' AND testspalte_7 < '$bis' AND ";

    // Abfrage-String wird gekuerzt um das AND am Schluss zu entfernen
    $query = substr($query, 0, strlen($query)-4);
}

Es besteht diesbzgl. nur noch ein "Schönheitsproblem": Wenn ich das Datum eingrenze, also zB von Januar bis Juni, dann werden nur die Monate dazwischen angezeigt, also Februar, März, April und Mai.
Wie kann ich es jetzt bewerkstelligen, dass ebenso die Monate Januar und Juni bei der o.g. Auswahl angezeigt werden, bitte?
 
Das war, wie ich eben rausfand, ja ganz einfach.

Anstatt nur größer und gleicher als zu benützen, hab ich größer, kleiner als oder gleich benützt, sprich >= und <=.
 
Zurück