Suche ohne leere Felder

atlantyz

Erfahrenes Mitglied
Hallo Leute,

ich habe ein Problem mit meiner Datenbanksuche.

Also: ich lass auf meiner PHP Seite in meiner Datenbank nach Feldern suchen. Das Problem ist jetzt nur, wenn ein Feld leer ist, sucht der mir auch alle Datensätze, die "leer" sind. Ein Beispiel:

Ich will nach Hans Schmidt suchen, Standort ist leer.

Nun meine Abfrage:
Code:
select * from kunde where (kunde_telefonnummer like '%" . $_POST["kundetelefon"] . "%' or kunde_name like '%" . $_POST["kundename"] . "%' or kunde_standort like '%" . $_POST["kundestandort"] . "%') and gueltig = 'j'

So... nun kommen alle Kunden mit dabei heraus, die irgendwo was leeres in ihren Feldern stehen haben. Ich will aber, dass der mir nur Kunden anzeigt, die mit den gefüllten Feldern was zu tun haben...

Hat jemand ne Idee?
 
Hi.

Erstmal ist das manuelle Zusammenbasteln von solchen Ausdrücken mit Eingaben direkt vom Anwender der Seite gefährlich => SQL Injektion.

Dann solltest du eigentlich für Felder in denen keine Daten drin sind, NULL eintragen. Dann würden diese bei der Suche auch nicht betrachtet werden.

Bei der Suche selbst solltest du einfach alle Suchkriterien die leer sind ignorieren.

Gruß
 
Also ich hab in der Datenbank eingetragen, dass die Felder Standardmäßig Null sind. Dann müsste der doch eigentlich, wenn keine Daten ankommen die Felder automatisch null setzen, oder etwa nicht Oder muss ich beim Insert sagen, dass der Wert null ist? Und wenn ja, wie mach ich das? Schreib ich dann einfach "Null" als Wert rein oder interpretiert der mir das dann wieder als nen Text
 
Also ich hab in der Datenbank eingetragen, dass die Felder Standardmäßig Null sind. Dann müsste der doch eigentlich, wenn keine Daten ankommen die Felder automatisch null setzen, oder etwa nicht Oder muss ich beim Insert sagen, dass der Wert null ist? Und wenn ja, wie mach ich das? Schreib ich dann einfach "Null" als Wert rein oder interpretiert der mir das dann wieder als nen Text
Du mußt einfach beim INSERT die entsprechenden Spalten explizit angeben:
SQL:
INSERT INTO table(spalte1, spalte4) values('adsf', 'asdf');
Dann trägt er für die anderen Spalten, die nicht angegeben wurden, die Standardwerte ein.

Oder du gibst explizit NULL an, das geht auch:
SQL:
INSert into table values('asdf', NULL, 'asdf', NULL, NULL);
Gruß
 
Also, das mach ich ja:

Code:
insert kunde (kunde_id, kunde_name, kunde_vorname, kunde_telefonnummer, pc_id, kunde_standort, kunde_mail, gueltig) values ('" . $kundeid . "', '" . $_POST["nachname"] . "', '" . $_POST["vorname"] . "', '" . $_POST["telefon"] . "', '" . $_POST["geraet"] . "',  '" . $_POST["standort"] . "', '" . $_POST["mail"] . "', 'j')

Ich weiß ja halt nicht, ob die Felder leer sind oder nicht... :)
 
Also, das mach ich ja:

Code:
insert kunde (kunde_id, kunde_name, kunde_vorname, kunde_telefonnummer, pc_id, kunde_standort, kunde_mail, gueltig) values ('" . $kundeid . "', '" . $_POST["nachname"] . "', '" . $_POST["vorname"] . "', '" . $_POST["telefon"] . "', '" . $_POST["geraet"] . "',  '" . $_POST["standort"] . "', '" . $_POST["mail"] . "', 'j')

Ich weiß ja halt nicht, ob die Felder leer sind oder nicht... :)
Ja, das mußt du eben prüfen. Du mußt den SQL Befehl so zusammenbauen, das nur die gefüllten Felder eingetragen werden.

Generell solltest du das Skript gegen SQL Injection schützen: http://de.wikipedia.org/wiki/SQL_Injection#PHP

Gruß
 
Das ist ja übelst kompliziert... dann hab ich ja vorher hundert Abfragen (Kunde ist ja net das einzige, was null sein kann), ob das Feld null ist und je nachdem ob ja oder nein muss ich nen anderen SQL Befehl ausführen...

Das mit den SQL Injections ist im Moment egal, das Programm läuft nur in der Testphase und ist gegen jegliche Benutzerfalscheingaben ebenfalls noch nicht abgesichert. Ich hätt halt nur gern erstmal die wichtigen Funktionen am Laufen...
 
Leere Felder findet er vor allem auch deshalb, weil die einzelnen Teile mit OR verknüpft sind. Dadurch findet er alle Hans und alle Schmidt usw. Eine Verknüpfung mit AND würde nur alle Hans Schmidt bringen.

Falls das OR aber gewollt ist wäre eine Möglichkeit, die einzelnen Suchkriterien außerhalb des SQL Strings zusammenzubauen und wenn ein Eingabefeld leer geblieben ist, dieses auf die Datensätze einzuschränken, wo das DB Feld nicht leer ist..
PHP:
if (!empty($kundetelefon))
  $sqltel = "kunde_telefonnummer like '%" . $_POST["kundetelefon"] . "%'";
else
  $sqltel = "kunde_telefonnummer != '' ";
Und dann anschließend des SQL String aus diesen Teilen zusammensetzen.
 
Das mit dem Or ist schon gewollt... Er soll wirklich alles finden, wo eben der Vorname oder der Nachname oder der standort, der eingegeben wurde enthalten ist.

Ich werd das mit dem zusammenbauen des SQL-Befehls mal ausprobieren.
 
Hi.

Das mit dem Zusammenbauen würde ich in einer Schleife machen. Ungefähr so:
PHP:
// map sql columns to form element names
$columns = { 
  'kunde_telefonnummer' => 'kundetelefon',
  'kunde_vorname' => 'vorname',
  ... };

$cmd = 'INSERT INTO table(';
$values = '(';

foreach($columns as $col => $field) {
  if (!empty($_POST[$field])) {
    $cmd .= "$col, ";
    $values .= "$_POST[$field], ";
  } else {
    ...
  }
}
Gruß
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück