Was falsch an AND bzw. OR Suchabfrage /-formular?
Sascha
- datenbank
Hallo,
ich will unter MySQL per PHP-Script eine Suchfunktion einbauen, und zwar mit folgenden Bedingungen:
Dazu ist folgendes noch anzumerken:
Es soll pro Wort in 2 Feldern / Spalten gesucht werden, und zwar in titel und beschreibung.
Hierzu habe ich folgende Scripte geschrieben:
Inhalt von Suchformularseite:
<?php
require("config-softdatabase.php4");
echo "<h1><font color="#FFFF00" face="Arial">Suchen</font></h1>
<form method="POST" action="index.php4">
<input type=hidden name="session" value="gefunden_mich.php4">
<p><font face="Arial" color="#FFFF00" size="2">Nach welchem Begriff soll gesucht werden?<br><br>
1. Suchbegriff:
<input type="text" name="wort1" size="40" maxlength="490"><br>
<br>
Operator (Bitte wählen!): <select name="operator1" size="1">
<option value="">----
<option value="UND">UND
<option value="ODER">ODER
</option>
</select><br><br>
2. Suchbegriff:
<input type="text" name="wort2" size="40" maxlength="490"><br>
<p><font face="Arial" size="2"><input type="submit" value="Abschicken" name="B1"><input type="reset" value="Zurücksetzen" name="B2"></font></p>
</form>
";
?>
Inhalt von Verarbeitungsscript:
[....]
// Suche für 1 Wort ohne AND bzw. OR
if ($operator1 == "" AND $wort2 == ""){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%'",$verbindung);
}
// Suche für 2 Wörter mit Operator AND
if ($operator1 == "UND"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%' AND LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
}
// Suche für 2 Wörter mit Operator AND
if ($operator1 == "ODER"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%'OR beschreibung LIKE '%$wort1%'OR LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
}
//$a= fetch_result($datencounter);
//echo "<div align=center><font color="#ffff00"><h3>Es wurden $a //Einträge gefunden ... </h3></font></div>";
while($row = mysql_fetch_array($daten)) { [....]
=> Ergebnis:
Eingabe von 1 Suchbegriff im Formularfeld für 1. Wort
=> funktioniert bestens und fehlerfrei
Eingabe von 2 Suchbegriffen im Formularfeld für 1. Wort und 2. Wort (je 1 Wort/Feld) mit Operatorauswahl AND (UND) bzw. OR (ODER)
führt zu einem Fehler!
=> Warning: Supplied argument is not a valid MySQL result resource in ... [zeigt auf while($row.... ]
Kann mir jemand sagen was ich falsch gemacht habe, bzw. einen Tipp zur Problemlösung nennen? Im voraus besten Dank.
Mfg.
Sascha
Hallo,
if ($operator1 == "UND"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%' AND LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
Oft hilt es, mal ein bißchen umzuformatieren:
SELECT * FROM downloadprogramme
WHERE titel LIKE '%$wort1%'
OR beschreibung LIKE '%$wort1%'
AND LIKE '%$wort2%'
OR beschreibung LIKE '%$wort2%'
uups, In Zeile 4 hat sich ein Fehler eingeschlichen;-)
Abgesehen davon, Du solltest wenn, dann schon etwas schalteln, weil ich denke eigentlich willst Du ja daß wort1 und wort2 in entweder titel oder beschreibung vorkommen. Hui klingt das jetzt kompliziert.
Also
SELECT * FROM downloadprogramme
WHERE ( titel LIKE '%$wort1%'
OR beschreibung LIKE '%$wort1%')
AND ( titel LIKE '%$wort2%'
OR beschreibung LIKE '%$wort2%')
Und noch was,
wenn Du
SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
WHERE suchtext LIKE '%$wort1%'
AND suchtext LIKE '%$wort2%'
b
verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
und viertens von mir mal so hingeschrieben und nicht getestet :-(
Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.
if ($operator1 == "ODER"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%'OR beschreibung LIKE '%$wort1%'OR LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
}
"SELECT * FROM downloadprogramme
WHERE titel LIKE '%$wort1%'
OR beschreibung LIKE '%$wort1%'
OR LIKE '%$wort2%'
OR beschreibung LIKE '%$wort2%'"
Und schon wieder die vermaledeite Zeile 4.
Und noch was,
wenn Du
SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
WHERE suchtext LIKE '%$wort1%'
AND suchtext LIKE '%$wort2%'
bzw.
SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
WHERE suchtext LIKE '%$wort1%'
OR suchtext LIKE '%$wort2%'
verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
und viertens von mir mal so hingeschrieben und nicht getestet :-(
Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.
Grüße
Klaus
PS.: vielleicht siehst Du Dir auch noch REGEXP/RLIKE in der Doku an. Steht irgendwo bei der Whereklausel, nicht weit vom LIKE
Hallo Klaus,
also besten Dank.
Das war mal eine Antwort, mir fehlen echt die Worte, die war sehr gut! Zum einen war sie sehr lehrreich fand ich, zum anderen wurde das Problem beseitigt und man hat zugleich auch noch was verstanden und gelernt dabei ...
... mach weiter so!
Mfg.
Sascha
Hallo,
if ($operator1 == "UND"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%' AND LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
Oft hilt es, mal ein bißchen umzuformatieren:
SELECT * FROM downloadprogramme
WHERE titel LIKE '%$wort1%'
OR beschreibung LIKE '%$wort1%'
AND LIKE '%$wort2%'
OR beschreibung LIKE '%$wort2%'
uups, In Zeile 4 hat sich ein Fehler eingeschlichen;-)
Abgesehen davon, Du solltest wenn, dann schon etwas schalteln, weil ich denke eigentlich willst Du ja daß wort1 und wort2 in entweder titel oder beschreibung vorkommen. Hui klingt das jetzt kompliziert.
Also
SELECT * FROM downloadprogramme
WHERE ( titel LIKE '%$wort1%'
OR beschreibung LIKE '%$wort1%')
AND ( titel LIKE '%$wort2%'
OR beschreibung LIKE '%$wort2%')
Und noch was,
wenn Du
SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
WHERE suchtext LIKE '%$wort1%'
AND suchtext LIKE '%$wort2%'
b
verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
und viertens von mir mal so hingeschrieben und nicht getestet :-(
Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.
if ($operator1 == "ODER"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%'OR beschreibung LIKE '%$wort1%'OR LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
}
"SELECT * FROM downloadprogramme
WHERE titel LIKE '%$wort1%'
OR beschreibung LIKE '%$wort1%'
OR LIKE '%$wort2%'
OR beschreibung LIKE '%$wort2%'"
Und schon wieder die vermaledeite Zeile 4.
Und noch was,
wenn Du
SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
WHERE suchtext LIKE '%$wort1%'
AND suchtext LIKE '%$wort2%'
bzw.
SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
WHERE suchtext LIKE '%$wort1%'
OR suchtext LIKE '%$wort2%'
verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
und viertens von mir mal so hingeschrieben und nicht getestet :-(
Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.
Grüße
Klaus
PS.: vielleicht siehst Du Dir auch noch REGEXP/RLIKE in der Doku an. Steht irgendwo bei der Whereklausel, nicht weit vom LIKE
Hallo,
*grmpflml* Ich denke ich sollte wieder an meiner Cut&Paste-Technik arbeiten:-(
Sowas aber auch. Naja, also wenn Ihr die doppelten Zeilen ins richtige Verhältnis bringt, könnte das Ganze auch wieder Sinn machen.
Grüße
Klaus