# erweiterte Datenbank Suche (MySQL)



## sugar (27. November 2004)

Hallo zusammen,

habe ein kleines Problem: ich möchte eine MySQL Datenbank Suche machen. Jetzt möchte ich aber nicht nur nach einem Begriff suchen können sondern der User soll auch eine Checkbox anklicken können womit ein Wert (irgendeinwert) die Suche weiter filtert. Nach meiner jetztigen Lösung (siehe unten) kann es natürlich gar nicht gehen da die Variable "searchstring" nur einmal verwendet werden kann oder? Hat jemand vielleicht einen Lösungsvorschlag?


```
if ($searchstring)
{
$sql="SELECT * FROM inhalt WHERE $searchtype LIKE '%$searchstring%' ORDER BY name ASC";
(...)
<form>
<input name="searchtype" type="text" value="news" size="28">
<input name="searchstring" type="text" id="searchstring">
<input name="searchstring" type="checkbox" id="searchstring" value="irgendeinwert">
(...)
</form>
```


----------



## spirit (27. November 2004)

Hallo

Du bist doch schon auf dem richtigen Weg

Deinem Code entnehme ich aber, das dein Feldname mit $ anfängt. Das solltest du nicht tun, da in PHP das $-Zeichen als Variablenerkennung dient.

Ich benenne für mein Beispiel dein Feld "$searchstring" in "Rechnungsnummer" um.
Ich füge deiner Tabelle das Feld "Status" hinzu.
Die Tabelle sleber heisst "Inhalt"

Jetzt mache ich eine Abfrage auf die Tabelle:

"SELECT * from inhalt where Rechnungsnummer LIKE '%$searchstring%' order by Name"

Auf dieser Abfrage bekomme ich alle Datensätze die in der Rechnungsnummer deiner LIKE Angabe entsprechen. Soweit so gut.

Jetzt möchte ich aber die Suche weiter eingrenzen. Dafür frage ich das Feld 'Status' mit ab.

Die CheckBox wird geklickt und der Wert "unerledigt" soll die suche weiter eingrenzen

Dann sieht das so aus:

....where Rechnungsnummer like '%searchstring%' and status = 'unerledigt' order by Name"

Jetzt bekommst du nur die Datensätze angezeigt, die deinem Suchstring entsprechen UND unerledigt sind.


Ist es das was du gesucht hast


----------



## sugar (27. November 2004)

Danke für deine Antwort! Ich denke die Art und Weise ist genau das was ich gesucht habe, problematisch ist nur das es eine ganze Reihe von Checkboxen gibt. Wird die Abfrage dabei nicht zu lang? Wie kann man das Verknüpfen immer mit "and"?


----------



## spirit (27. November 2004)

Jau, die Abrage wird immer mit "and" weitergeführt. Das dabei eine ellenlange SQL-Syntax entsteht ist normal ;-)


----------



## spirit (27. November 2004)

Einen kleinen Zusatz noch:

Du musst natürlich das betreffende Feld mit angeben:

.....where Feld1 = '$variableCheckbox1' AND Feld2 = '$variableCheckbox2' AND Feld3 = '$variableCheckbox3' usw....

Du kannst auch die gleiche Abfrage mit OR oder LIKE machen


----------



## sugar (27. November 2004)

jetzt muss irgendwo ein fehler drin sein glaub ich, jetzt geht es gar nicht mehr.   

$sql="SELECT * FROM inhalt WHERE $searchtype LIKE '%$searchstring%' WHERE feld1 = '$akupunktur' AND feld2 = '$solarium' AND feld3 = '$fitness' ORDER BY name ASC";

vorher
$sql="SELECT * FROM inhalt WHERE $searchtype LIKE '%$searchstring%' ORDER BY name ASC";

hat es funktioniert?


----------



## Lukaro (28. November 2004)

sugar hat gesagt.:
			
		

> ```
> $sql="SELECT * FROM inhalt WHERE $searchtype LIKE '%$searchstring%' WHERE feld1 = '$akupunktur' AND feld2 = '$solarium' AND feld3 = '$fitness' ORDER BY name ASC";
> ```




```
$sql="SELECT * FROM inhalt WHERE $searchtype LIKE '%$searchstring%' AND WHERE feld1 = '$akupunktur' AND feld2 = '$solarium' AND feld3 = '$fitness' ORDER BY name ASC";
```
 
Ich denke so müsstes gehen...


----------



## sugar (1. Dezember 2004)

Ehrlich gesagt funktioniert das ganze immer noch nicht obwohl ich alle Ratschläge befolgt habe. Jetzt stehe ich komplett auf der Leitung und poste mal einfach den ganzen Code.


```
<table width="100%" border="0" align="center" cellpadding="5" cellspacing="0">
        <tr> 
          <td height="100">

            <?php 


    if ($searchstring)
    {

        $sql="SELECT * FROM inhalt WHERE news LIKE '%$searchstring%' AND WHERE news = '$check1' ORDER BY name ASC";

        $db = mysql_connect("****", "*****", "*****");
        mysql_select_db("******",$db);

        $result = mysql_query($sql,$db);
        $checked = mysql_num_rows($result);    // Ist ein Eintrag vorhanden?
           if ($checked == 0){
               print "<Table width=\"100%\"><TR><TD class=\"error\"><b>Keine Einträge gefunden!</b></TD></TR></table>";
           }

while($myrow = mysql_fetch_array($result)) 
{ 
echo "<table width=\"96%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr>
    <td><img src=\"box.gif\" width=\"548\" height=\"5\"></td>
  </tr><tr><td>";
echo "<TABLE BORDER=0 width='98%' align='center' cellpadding='3' cellspacing='0'>"; 
echo "<TR><TD class='text' width='60%'><b>".$myrow["subjekt"]."</b></TD></TR>";
echo "<tr><TD>".$myrow["adresse"]."</td></tr>";
echo "<tr><TD align=\"right\"><a href='index.php?option=news&aktion=newslang&ID=$myrow[ID]'>mehr Informationen</a>";

echo "</TD></TR></TABLE>"; 
echo "</td></tr><tr><td><img src=\"box.gif\" width=\"548\" height=\"7\"></td>
</tr></table>"; } 
}
else
{
?>
<form method="POST" action="<?php $PHP_SELF ?>">
<table width="60%" border="0" cellpadding="2" cellspacing="0">
<tr>
  <td class="heading">Detailsuche</td>
</tr>
<tr>
<td>
  <input name="searchstring" type="text" id="searchstring"></td>
</tr>
<tr>
  <td><table cellSpacing="0" cellPadding="0" width="98%" border="0">
      <tr>
        <td valign="top" class="text">
          <p>
  <input name="check1" type="checkbox" value="akupunktur"> Akupunktur<br>
            <input name="check2" type="checkbox" value="solarium"> Solarium</p>
          <p>etc...<br>
              </p></td>
        </tr>
    </table></td>
  </tr>
</table>
<p><input type="submit" value="Submit" name="B1" class="button">&nbsp;<input type="reset" value="Reset" name="B2" class="button"></p>
</form>
<?php
}
?>
         </td>
  </tr>
</table>
    
</html>
```

Ich hoffe jemand kann mir helfen!


----------



## knotensuppe (2. Dezember 2004)

ich klinke mich hier mal ein, da ich fast das gleiche Problem habe.

Hat niemand eine Idee? 

Ich denke es muss an der Auslesung der Checkboxen liegen.

Habe nach 24 Stunden herumprobieren leider immer noch keine Ahnung wie ich es anstellen muss :-(


----------



## xloouch (2. Dezember 2004)

> ```
> $sql="SELECT * FROM inhalt WHERE news LIKE '%$searchstring%' AND WHERE news = '$check1' ORDER BY name ASC";
> ```


Ich denke rein sql technisch, dass das zweite where unnötig ist. Sonst gib mal die Fehlermeldung, welche das System ausspuckt..


----------



## hpvw (2. Dezember 2004)

Bei Deinem Code ist das 2. WHERE falsch. Man schreibt immer nur einmal WHERE und verknüpft dann mit AND:

```
$sql="SELECT * FROM inhalt WHERE news LIKE '%$searchstring%' AND news = '$check1' ORDER BY name ASC";
```
Wenn ich nahezu beliebig viele Möglichkeiten zur Einschränkung habe betrachte ich die in PHP immer zuerst einzeln.
Ich suche mir also eine Eingrenzung nach der anderen und bilde dafür den Vergleich.
Diesen hänge ich dann in ein Array. Wenn ich damit Fertig bin, löse ich das Array mit [phpf]implode[/phpf] zu einem String auf:

```
$whereArray=array();
if (!empty($_REQUEST['chkBoxName'])) {
    $whereArray[]="name LIKE '%".$_REQUEST['textFeldName']."%'";
}
if (!empty($_REQUEST['chkBoxNews'])) {
    $whereArray[]="news LIKE '%".$_REQUEST['textFeldNews']."%'";
}
//usw.
$whereString = implode(" AND ",$whereArray);
if (empty($whereString)) {
    $sql="SELECT * FROM inhalt ORDER BY name ASC";
} else {
    $sql="SELECT * FROM inhalt WHERE ".$whereString." ORDER BY name ASC";
}
```
Du kannst natürlich auch umständlichere Vergleiche nehmen. Wenn jedoch ein Teilvergleich selbst schon Teilvergleiche enthält (z.B. mit OR verknüpft) musst Du den gesamten Teilvergleich so definieren, dass er mit Klammern umschlossen ist, bevor Du ihn in das Array einhängst.

Gruß hpvw


----------

