Suchen über mehrere MySQL-Felder

julia29

Erfahrenes Mitglied
Hi,
bei der Suche über mehrere Felder bin ich auf 2 Probleme gestoßen.

Problem 1
Die folgende, 'genaue' Suche über zwei Felder funktioniert noch einwandfrei

PHP:
$abfrage = "SELECT *
FROM table1
WHERE feld0 LIKE '$wert0'
    OR feld1 LIKE '$wert1'

ORDER BY feld1
LIMIT $start, $eintraege_pro_seite";

Möchte ich über mehrere Felder suchen, wird nur die gesamte SQL-Tabelle ausgegeben.
PHP:
$abfrage = "SELECT *
FROM table1
WHERE feld0 LIKE '$wert0'
    OR feld1 LIKE '$wert1'
    OR feld2 LIKE '$wert2'
    OR feld3 LIKE '$wert3'
ORDER BY feld1
LIMIT $start, $eintraege_pro_seite";

Statt 'LIKE' habe ich es auch mit '=' versucht, aber kein Unterschied.
Wie kann ich über über 4 oder mehr Felder suchen?


Problem 2
Möchte ich für feld1 auch nach größeren Werten suchen
z.B. '10' findet natürlich '10' aber auch 1011, 1012, 1013 usw.
und gebe ich dafür den Platzhalter "%" ein, werden dann jedoch wieder alle Datensätze gefunden, sogar die mit '30' oder anderen Werten beginnen. Dabei ist die Schreibweise egal, zumindest konnte ich keinen Unterschied ausmachen:
PHP:
   OR feld1 LIKE '$wert1%'
#oder auch diese Schreibweise
    OR feld1 LIKE '".$wert1."%'

Wie muss ich meinen Code ändern?
mfg
Julia
 
Hi yaslaw,

hier mal der gesamte Code bis zum Aufbau der HTML-Tabelle:

PHP:
<HTML> 
<HEAD> 
  <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />  
</HEAD> 
<BODY> 
<?PHP
define("DB_HOST","localhost"); // MySQL hostname
define("DB_NAME","xxx"); //MySQL db-name
define("DB_USER","xxx"); //MySQL User
define("DB_PASS","xxx"); // MySQL Passwort

// Datenbank Connect herstellen
$db = @MYSQL_CONNECT(DB_HOST,DB_USER,DB_PASS) or die("Datenbank-Connect fehlgeschlagen");
$db_check = @MYSQL_SELECT_DB(DB_NAME) or die("Datenbank momentan nicht erreichbar");
$table1 = haupt;
$seite = $_GET["seite"];  //Abfrage auf welcher Seite man ist

//Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1
if(!isset($seite))
   {
   $seite = 1;
   }

//Einträge pro Seite: Hier 25 pro Seite
$eintraege_pro_seite = 50;

//Ausrechen welche Spalte man zuerst ausgeben muss:

$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;
$x1= ("<FONT SIZE=\"-1\" FACE=\"Arial\">");
$x2= ("<FONT SIZE=\"-2\" FACE=\"Arial\">");
    echo "
<FONT SIZE=\"-2\" FACE=\"Arial\"><u>Liste der Datenbank-Artikel</u><br>
<br><br>

   <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\">
   <tr bgcolor=\"#cccccc\"><FONT SIZE=\"-1\" FACE=\"Arial\">
   <td width=45>$x2 id</td><td width=80></td><td width=120><FONT COLOR=#006600>$x2 EAN<FONT COLOR=#0033FF>/Art<FONT COLOR=#000000>/Kartogo</td>
   <td width=140>$x2 Titel</td></td>
   </tr>
   ";
//Werte vom Such-Formular
  $feld0 = $_POST["wert0"];	//Quelle	int(4)
  $feld1 = $_POST["wert1"];  //ArtNr	varchar(150)
  $feld2 = $_POST["wert2"];  //ean		varchar(150)
  $feld3 = $_POST["wert3"];  //Titel	varchar(150)

$abfrage = "SELECT * 
FROM haupt
WHERE 
feld0 LIKE '$feld0'
	OR feld1 LIKE '$feld1'
	OR feld2 LIKE '$feld2'
	OR feld3 LIKE '$feld3'

ORDER BY feld1
LIMIT $start, $eintraege_pro_seite";

# ab hier beginnt der Aufbau der HTML-Tabelle

Mit der Suche über 'feld0' und 'feld1' funktioniert noch alles.
Sowie ich jedoch noch weitere Felder zufüge findet keine Suche mehr statt, es werden alle DS aufgelistet.
 
Der Code ist im Moment uninteressant. Das generierte SQL sagt mehr aus.
-> http://wiki.yaslaw.info/wikka/PhpDebugMySqlQueries#QueryStringtesten
PHP:
echo $abfrage;

Zudem. Was heisst ghet nicht:
Gibt es ein Fehler?
Oder werden keine Daten zurückgegeben?
Oder woran erkennst du das es nicht geht?

Nachtrag:
Bei wert0 der ein int ist, nicht mit LIKE und '' abfragen
Hier eine Beispielaufstellung
SQL:
WHERE
  int_field=123
  OR varchar_field_1 = 'text'
  OR varchar_field_2 LIKE 'text%'
 
Zuletzt bearbeitet von einem Moderator:
dies wird ausgegeben:

SELECT * FROM haupt WHERE feld0 LIKE '' OR feld1 LIKE '1007' OR feld2 LIKE '' OR feld3 LIKE '' ORDER BY feld1 LIMIT 0, 50

ich habe nur im feld1 nach "1007" gesucht, die anderen Felder waren leer.
Gefunden / aufgelistet wurde alles, bzw. die 50 limitierten Datensätze.

Gibt es ein Fehler? NEIN keine Fehlermeldung
Oder werden keine Daten zurückgegeben? DOCH ALLE
Oder woran erkennst du das es nicht geht? ALLE DS DIESER TABELLE WERDEN GEZEIGT, also findet keine Selektion statt.

Wenn ich feld0 statt so
PHP:
feld0 LIKE '$feld0'

jetzt so schreibe
PHP:
feld0 = $feld0

dann erscheint folgende Fehlermeldung:
SELECT * FROM haupt WHERE feld0 = OR feld1 LIKE '1007' OR feld2 LIKE '' OR feld3 LIKE '' ORDER BY feld1 LIMIT 0, 50

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 'OR feld1 LIKE '1007' OR feld2 LIKE '' OR feld3 LIKE '' ORDER BY feld1 LIMIT 0, 50' at line 5

Damit kann ich jetzt nicht soviel anfangen.
 
Zuletzt bearbeitet:
Dadurch das du die einzelnen Suchbegriffe mit OR unterscheidest bekommst du klar alles ausgegeben.
Es heißt ja entweder dieser Wert oder dieser Wert oder ..... und da du z.B. im ersten keine Vorgabe machst entsprechen somit auch alle Datensätze den Vorgaben.

Du mußt mal überlegen ob du anstatt OR nicht AND als Verknüpfung der einzelnen Felder nehmen musst.

Gruß Thomas
 
@tombe
nein geht nicht, denn wenn in meiner Suche im feld0 ' ' AND feld1'1007' stehen würde, kann er nichts finden, da im feld0 immer einen Wert steht, niemals ' '. Deshalb bin ich auf OR gekommen.
 
Gut aber in deinem Beispiel oben hast du folgende SQL Anweisung angegeben:

Code:
SELECT * FROM haupt WHERE feld0 LIKE '' OR feld1 LIKE '1007' OR feld2 LIKE '' OR feld3 LIKE '' ORDER BY feld1 LIMIT 0, 50

da war nicht nur das "feld0" leer. Aber mal ganz abgesehen davon, normalerweise ergibt LIKE '' ohne Joker (%) kein Ergebnis. Irgendwie kann die Anweisung also gar icht funktionieren.
Mach mal ein Beispiel wo du wirklich alle Felder so befüllst wie es dann in Echt auch ist und gib die SQL Anweisung dann hier nochmal aus.
 
Wenn ich feld0 statt so
PHP:
feld0 LIKE '$feld0'

jetzt so schreibe
PHP:
feld0 = $feld0

dann erscheint folgende Fehlermeldung:
SELECT * FROM haupt WHERE feld0 = OR feld1 LIKE '1007' OR feld2 LIKE '' OR feld3 LIKE '' ORDER BY feld1 LIMIT 0, 50

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 'OR feld1 LIKE '1007' OR feld2 LIKE '' OR feld3 LIKE '' ORDER BY feld1 LIMIT 0, 50' at line 5

Damit kann ich jetzt nicht soviel anfangen.
$feld0 ibeinhaltet einen leeren String. Du solltest nur Fleder abfragen die etwas beinhalten

Was du brauchst ist etwas, das ich gerade vor Kurzer Zeit für jemand anderes zusammengestellt habe. Eine Methode um das WHERE so zusammenzusetzen, dass nur Felder berücksichtigt werden die einen Suchbegriff haben.

In meinem Beispiel ist es AND anstelle von OR. Das kann man jedoch ändern
http://wiki.yaslaw.info/wikka/PhpVariableWhereFromPost
 
Ich habe es jetzt so gelöst, dass ich zwei unterschiedliche Suchen starte.
Alles in einer Suche ist doch etwas verzwickter.
Auseinandergezogen klappt es nun einwandfrei.

Vielen Dank für die Hilfen.
mfg
Julia
 
Zurück