Zur Navigation

Verwendung von ">=" in Datenbankabfrage

1 andehrl

[Edit Jörg: der folgende Beitrag wurde abgetrennt aus diesem Thread]

hätte noch eine frage. ich hätte gerne das für laderaumbreite, -höhe, -länge und -volumen sowohl das vom benutzer eingegebene als auch höhere in der datenbank hinterlegte werte angezeigt werden. das selbe wäre auch für das datum gut, so daß das gesuchte und auch spätere dati angezeigt werden.

du hast in einem der beiträge einen vergleich mit

if (isset($_POST['marke']) && $_POST['marke'] != '') {
    $query_R1 .= " marke LIKE '%" . mysql_real_escape_string($_POST['marke']) . "%' AND ";
}

gestellt.

kann ich in diesem code auch so etwas wie


>=
einbauen und dadurch mein gewünschtes resultat erhalten?

17.09.2010 00:59 | geändert von Jörg: 17.09.2010 11:17

2 Jörg Kruse

Ja, das kannst bei den Zahlenwerten machen, wobei in der SQL-Abfrage zwei Dinge zu beachten sind:

1. im Gegensatz zu Strings, die zum Schutz vor SQL-Injection mit mysql_real_escape_string() behandelt werden, sollte auf Integer (Ganzzahlen) (int) oder intval() angewandt werden.

2. Integer werden in SQL nicht in Hochkommata eingeschlossen.

Der betreffende SQL-Abschnitt würde dann in etwa so ausschauen:

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

Das funktioniert aber nur, wenn das Datenfeld `laderaumbreite` in der Datenbank als Integer definiert ist (TINYINT, MEDIUMINT, INT etc). Strings lassen sich nicht mit ">=" vergleichen

Auch bei dem Datum kommt es darauf an, in welcher Form es in der Datenbank abgespeichert ist

17.09.2010 11:31 | geändert: 17.09.2010 11:43

3 andehrl

hallo jörg,
ich muss überraschend nach münchen und kann dummerweise erst nächsten mittwoch wieder an meiner webseite arbeiten. danke dir vielmals. ich stell dann meine offenen fragen sobald ich wieder da bin,
andre.

17.09.2010 13:34

4 andehrl

hallo jörg, ich habe die vergleichsparameter wie von dir beschrieben geändert. funktioniert scheinbar auch. das problem, dass ich jetzt habe ist, dass bei der dateneingabe des benutzers in die datenbank immer nur der erste wert der zahlen in der datenbank erscheint. gebe ich z.b. 3,7 im suchfeld ein kommt in der datenbank nur 3 an. ich habe den typ der einzelnen datenbankfelder auf decimal(3,0) bzw (4;0) umgeändert. dasselbe ergebnis bekomme ich, wenn ich den typ auf INT umstelle.
ich habe dann auch in der eingabeseite den typ der entsprechendenden felder in "decimal" geändert. vorher sah der code so aus:

<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "erweiterte Angaben")) {
  $insertSQL = sprintf("INSERT INTO Eingabe (abfahrtsort, zielort, tag, monat, jahr, stunde, `minute`, hinfahrtladeflaeche, hilfeeinausladen, rueckfahrt, rueckfahrtladeflaeche, beschreibung, preis, marke, model, laderaumhoehe, laderaumbreite, laderaumlaenge, laderaumvolumen, treibstoff, getriebe, tempo, nutzername, mail, handy, tel) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['abfahrtsort'], "text"),
                       GetSQLValueString($_POST['zielort'], "text"),
                       GetSQLValueString($_POST['tag'], "text"),
                       GetSQLValueString($_POST['monat'], "text"),
                       GetSQLValueString($_POST['jahr'], "text"),
                       GetSQLValueString($_POST['stunde'], "text"),
                       GetSQLValueString($_POST['minute'], "text"),
                       GetSQLValueString($_POST['hinfahrtladeflaeche'], "text"),
                       GetSQLValueString($_POST['hilfeeinausladen'], "text"),
                       GetSQLValueString($_POST['rueckfahrt'], "text"),
                       GetSQLValueString($_POST['rueckfahrtladeflaeche'], "text"),
                       GetSQLValueString($_POST['beschreibung'], "text"),
                       GetSQLValueString($_POST['preis'], "text"),
                       GetSQLValueString($_POST['marke'], "text"),
                       GetSQLValueString($_POST['model'], "text"),
                       GetSQLValueString($_POST['laderaumhoehe'], "text"),
                       GetSQLValueString($_POST['laderaumbreite'], "text"),
                       GetSQLValueString($_POST['laderaumlaenge'], "text"),
                       GetSQLValueString($_POST['laderaumvolumen'], "text"),
                       GetSQLValueString($_POST['treibstoff'], "text"),
                       GetSQLValueString($_POST['getriebe'], "text"),
                       GetSQLValueString($_POST['tempo'], "text"),
                       GetSQLValueString($_POST['nutzername'], "text"),
                       GetSQLValueString($_POST['mail'], "text"),
                       GetSQLValueString($_POST['handy'], "text"),
                       GetSQLValueString($_POST['tel'], "text"));

  mysql_select_db($database_Eingabe, $Eingabe);
  $Result1 = mysql_query($insertSQL, $Eingabe) or die(mysql_error());

  $insertGoTo = "sDankesicher.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}
?>

im fett markierten teil habe ich dann aus "text" jeweils "decimal" gemacht:

GetSQLValueString($_POST['laderaumhoehe'], "decimal"),
GetSQLValueString($_POST['laderaumbreite'], "decimal"),
GetSQLValueString($_POST['laderaumlaenge'], "decimal"),
GetSQLValueString($_POST['laderaumvolumen'], "decimal"),

daraufhin habe ich diese fehlermeldung erhalten:

Column count doesn't match value count at row 1







23.09.2010 18:10 | geändert: 23.09.2010 18:14

5 Jörg Kruse

Dezimalzahlen in MySQL (wie auch in anderen Datenbank-, Script- und Programmuiersprachen) enthalten kein Komma, sondern einen Punkt, also z.B. "3.7"

GetSQLValueString($_POST['laderaumhoehe'], "decimal"),

Die Funktion GetSQLValueString kennt für das zweite Arguument keinen Wert "decimal", dafür aber den Wert "double":

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }

Der Typ "double" ist in deinem Fall wohl der passende, weil mit doubleval() Strings in Bruchzahlen umgewandelt werden

23.09.2010 19:51 | geändert: 23.09.2010 19:52

6 andehrl

ich hab in der datenbank die entsprechenden felder mit dem typ "double" belegt und in der eingabeseite den code entsprechend angeglichen:

 GetSQLValueString($_POST['laderaumhoehe'], "double"),
GetSQLValueString($_POST['laderaumbreite'], "double"),
GetSQLValueString($_POST['laderaumlaenge'], "double"),
GetSQLValueString($_POST['laderaumvolumen'], "double"),

bekomme dann diese fehlermeldung angezeigt:

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /is/htdocs/wp10548565_XUUKREW8G9/www/s5EingabeErweiterteAngabensicher.php on line 63

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /is/htdocs/wp10548565_XUUKREW8G9/www/s5EingabeErweiterteAngabensicher.php on line 64

zeile 63 und 64 sind die hier:

  mysql_select_db($database_Eingabe, $Eingabe);
  $Result1 = mysql_query($insertSQL, $Eingabe) or die(mysql_error());


23.09.2010 20:52

7 Jörg Kruse

Die Fehlermeldung "not a valid MySQL-Link resource" deutet auf falsche Datenbankzugangsdaten hin. Das zweite Argument $Eingabe ist hier auch gar nicht definiert?

23.09.2010 21:12

8 andehrl

also ich hab das ganze rückgängig und nochmal gemacht. jetzt kommen die daten ohne fehlermeldung an. allerdings bekomme ich nach wie vor 2 statt 2,7.
muss ich bei "double" auch einen punkt statt einem komma verwenden?

23.09.2010 21:34

9 andehrl

ok, mit punkt statt komma funktioniert es ...

23.09.2010 21:40

10 andehrl

in beitrag 2 hast du geschrieben da s die query etwa so ausschauen müsste:

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

in der suchseite sieht die query momentan noch so aus:

$query_R1 .= " laderaumbreite >= " . GetSQLValueString($colname14_R1, 'text') . " AND ";

wenn ich das in der von dir beschriebenen weise ändere geht doch die "colname" verlohren ?????

oder muss ich die query nur in der ergebnisseite ändern, die momentan noch so ausschaut:

$query_R1 .= " laderaumbreite = " . GetSQLValueString($_POST['laderaumbreite'], 'text') . " AND ";

23.09.2010 21:59