Zur Navigation

Verwendung von ">=" in Datenbankabfrage [2]

11 Jörg

Für Bruchzahlen kannst du "(float)" statt "(int)" verwenden:

$query_R1 .= " laderaumbreite >= " . (float) $_POST['laderaumbreite'] . " AND ";

Du kannst auch GetSQLValueString() (mit dem passenden Argument "double") verwenden - ich würde hier halt das kürzere "(float)" vorziehen

23.09.2010 22:18 | geändert: 23.09.2010 22:19

12 andehrl

hab den GetSQLValueString() mit dem typ "double" gelassen sieht jetzt auf der suchseite so aus:

$colname14_R1 = "NULL";
if (isset($_POST['laderaumbreite']) && $_POST['laderaumbreite'] != '') {
    $query_R1 .= " laderaumbreite >= " . GetSQLValueString($colname14_R1, 'double') . " AND ";
}

und auf der ergebnisseite so:

if (isset($_POST['laderaumbreite']) && $_POST['laderaumbreite'] != '') {
    $query_R1 .= " laderaumbreite >= " . GetSQLValueString($_POST['laderaumbreite'], 'double') . " AND ";
}

scheint auch zu funktionieren. ich hätte allerdings gerne das auch die datensätze angezeigt werden in denen das datenfeld der datenbank leer ist. ist das möglich?

23.09.2010 23:02 | geändert: 23.09.2010 23:03

13 Jörg

Was heißt "leer": enthält das Datenfeld den Wert NULL?

24.09.2010 12:38

14 andehrl

Zitat von Jörg
Was heißt "leer": enthält das Datenfeld den Wert NULL?

das datenfeld enthält als standardwert null.
um mich verständlicher zu machen:
ein nutzer kann bei der eingabe seiner daten bestimmte felder im eingabeformular einfach leer lassen (wie zb "laderaumbreite"). wenn nun ein anderer nutzer im suchformular bei "laderaumbreite" den wert 2.6 eingibt bekommt er momentan alle in der datenbank hinterlegten werte die gleich oder größer sind als 2.6. ich hätte nun gerne, daß dem suchenden in diesem fall auch die datensätze angezeigt werden die keinen wert enthalten, leer sind.

24.09.2010 15:17

15 Jörg

Wenn in den betreffenden Datensätzen das Feld `laderaumbreite` den Wert NULL aufweist, kann man diese mit der Bedingung "IS NULL" erfassen, siehe hierzu auch das MySQL-Handbuch:

http://dev.mysql.com/doc/refman/5.1/de/working-with-null.html

Du musst die beiden Bedingungen dann noch mit OR verknüpfen:

$query_R1 .= " (laderaumbreite >= " . GetSQLValueString($_POST['laderaumbreite'], 'double') . " OR laderaumbreite IS NULL) AND ";

ich hätte nun gerne, daß dem suchenden in diesem fall auch die datensätze angezeigt werden die keinen wert enthalten, leer sind.

Der umgangssprachliche Begriff "leer" ist in Bezug auf SQL mehrdeutig: ein leerer String ist z.B. etwas anders als der Wert NULL (siehe auch den Link oben) - und muss auch anders abgefragt werden

24.09.2010 16:14

16 andehrl

hallo jörg, ich habe die query wie von dir beschrieben verändert.
die suchseite sieht jetzt so aus:

$colname13_R1 = "NULL";
if (isset($_POST['laderaumhoehe']) && $_POST['laderaumhoehe'] != '') {
    $query_R1 .= " laderaumhoehe >= " . GetSQLValueString($colname13_R1, 'double') . " OR laderaumhoehe IS NULL) AND ";
}
$colname14_R1 = "NULL";
if (isset($_POST['laderaumbreite']) && $_POST['laderaumbreite'] != '') {
    $query_R1 .= " laderaumbreite >= " . GetSQLValueString($colname14_R1, 'double') . " OR laderaumbreite IS NULL) AND ";
}
$colname15_R1 = "NULL";
if (isset($_POST['laderaumlaenge']) && $_POST['laderaumlaenge'] != '') {
    $query_R1 .= " laderaumlaenge >= " . GetSQLValueString($colname15_R1, 'double') . " OR laderaumlaenge IS NULL) AND ";
}
$colname16_R1 = "NULL";
if (isset($_POST['laderaumvolumen']) && $_POST['laderaumvolumen'] != '') {
    $query_R1 .= " laderaumvolumen >= " . GetSQLValueString($colname16_R1, 'double') . " OR laderaumvolumen IS NULL) AND ";
}

und die ergebnisseite schaut so aus:

if (isset($_POST['laderaumhoehe']) && $_POST['laderaumhoehe'] != '') {
    $query_R1 .= " laderaumhoehe >= " . GetSQLValueString($_POST['laderaumhoehe'], 'double') . " OR laderaumhoehe IS NULL) AND ";
}
if (isset($_POST['laderaumbreite']) && $_POST['laderaumbreite'] != '') {
    $query_R1 .= " laderaumbreite >= " . GetSQLValueString($_POST['laderaumbreite'], 'double') . " OR laderaumbreite IS NULL) AND ";
}
if (isset($_POST['laderaumlaenge']) && $_POST['laderaumlaenge'] != '') {
    $query_R1 .= " laderaumlaenge >= " . GetSQLValueString($_POST['laderaumlaenge'], 'double') . " OR laderaumlaenge IS NULL) AND ";
}
if (isset($_POST['laderaumvolumen']) && $_POST['laderaumvolumen'] != '') {
    $query_R1 .= " laderaumvolumen >= " . GetSQLValueString($_POST['laderaumvolumen'], 'double') . " OR laderaumvolumen IS NULL) AND ";
}

wenn ich als benutzer in der suchseite die felder "lderaumlänge, -höhe, -breite und -volumen" unausgefüllt lasse bekomme ich nach wie vor ergebnisse. gebe ich aber einen suchwert in die felder ein erhalte ich folgende fehlermeldung.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AND laderaumbreite >= 1.2 OR laderaumbreite IS NULL) AND laderaumlaenge >= 1' at line 1

26.09.2010 17:59

17 Jörg

Ja, vergleich mal mit meinem Code: bei dir fehlt die öffnende Klammer.

26.09.2010 18:19

18 andehrl

... stimmt ... entschuldige ... jetzt funktioniert es :-)

26.09.2010 18:42

19 andehrl

hab noch eine frage bez. der abfrage mit ">=". ich habe die felder tag, monat, jahr, stunde und minute inzwischen auf "int" umgestellt.
wenn ich jetzt aber mit ">=" eine suche starte, zb. den 23.3.2010 bekomme ich als ergebnis natürlich alle datensätze angezeigt die gleich oder größer sind als der 23.3.2010, also vom 23 - 31.3.2010 und dann aber dummerweise auch erst ab dem 23.4. bis 30.4, 23.5 bis 31.5 usw. wie kann ich "tag" und "monat" in beziehung setzten, daß mir wie in diesem beispiel die tage 1-22 des folgemonats nicht verlohren gehen.
das selbe problem tritt natürlich bei stunde und minute auf.

27.09.2010 15:12