# Erweiterte MySQL Suche



## tushkan (14. Dezember 2010)

Hallo! Ich habe eine ziemlich große Datenbank erstellt und habe dafür ein Ajax LiveSearch-Funktion geschrieben. Die Suche funktioniert super, jetzt möchte ich aber die Suche einwenig erweitern: 
1) Volltextsuche: mit allen angegebenen Worten
2) Teilsuche: mit einem der Wörter, der in der Tabelle vorkommen kann.
3) Durch Checkboxen möchte ich den 2 erweiterten Suchfeldern(Volltextsuche, Teilsuche) mitteilen in welche Tabelle(Kostenstelle, Auftrag, etc...) gesucht wird.

Ich habe dafür bereits ziemlich viel Zeit investiert, habe aber bis jetzt nur Pech...
Ich würde mich sehr freuen, wenn jemand mir dabei helfen könnte! SOS******

Hier ist der gesamte Code(Formular, JavaScript, PHP):




```
<html>
<head>
	<title>Ajax Suche</title>
	
</head>
<body>
<script type="text/javascript" src="suche.js"></script>
<script language="javascript">

	
Suche <input type="text" onkeyup="searchFor(this.value);"/>		

<input type="checkbox" id="checkbox1" name="checkbox1">
<label for="erweitert">Erweiterte Suche</label>
	
	<ul>
			 		<label for="Suchein"><b>Suche in:</b></label>
			 		<hr>
	

<p align=left>Volltextsuche <input type="text" onkeyup="searchFor(this.value);"/>  
<p align=left>Teilsuche <input type="text" onkeyup="searchFor(this.value);"/>  

	
			 		
	 		</ul>

	<ul>
<label for="Kostenstelle">Kostenstelle</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
	<ul>
<label for="Auftrag">Auftrag</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
			 			<ul>
<label for="Hierarchien">Hierarchien</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
			 			<ul>
<label for="Kostenart">Kostenart</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
			 			
		 			<ul>
<label for="Organisation">Organisation</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
			 			
			 					 			<ul>
<label for="Profitcenter">Profitcenter</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
			 			
			 					 			<ul>
<label for="Leitfaden">Leitfaden</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
			 			
			 					 			<ul>
<label for="SAP-GB">SAP-GB</label>
<input type="checkbox" id="checkbox" name="checkbox" >
			 					 		
			 		</ul>
			 				
	
	<div id="ergebnis"></div>
</body>
</html>
```


```
function searchFor(suchbegriff){
			var xmlHttp = null;
			// Mozilla, Opera, Safari sowie Internet Explorer 7
			if (typeof XMLHttpRequest != 'undefined') {
				xmlHttp = new XMLHttpRequest();
			}
			if (!xmlHttp) {
				// Internet Explorer 6 und älter
				try {
					xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
				} catch(e) {
					try {
						xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
					} catch(e) {
						xmlHttp  = null;
					}
				}
			}
			// Wenn das Objekt erfolgreich erzeugt wurde			
			if (xmlHttp) {
				var url = "suche.php";
				var params = "suchbegriff="+suchbegriff;
				
				xmlHttp.open("POST", url, true);
				
				//Headerinformationen für den POST Request
				xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				xmlHttp.setRequestHeader("Content-length", params.length);
				xmlHttp.setRequestHeader("Connection", "close");					
			
				xmlHttp.onreadystatechange = function () {
					if (xmlHttp.readyState == 4) {
						// Zurückgeliefertes Ergebnis wird in den DIV "ergebnis" geschrieben
						document.getElementById("ergebnis").innerHTML = xmlHttp.responseText;
					}
				};				
				xmlHttp.send(params);
			}			
		}
```


```
<?php
//-- pre-condition ---------------------------------------------------------------------------------

error_reporting(E_ALL);

mysql_connect('localhost', 'root', '');
mysql_select_db('elko');

//-- example input ---------------------------------------------------------------------------------

$sSearch = $_POST["suchbegriff"];


//--------------------------------------------------------------------------------------------------

function mysqlSearch($sSearch)
{
    // replace multiple whitespaces with a simple blank
    $aSearch = explode(' ', preg_replace('#\s+#', ' ', $sSearch));
    // count search words once
    $iSearch = count($aSearch);
    if ($iSearch == 0) {
        return array();
    }
    // remove addslashes (automatically executed by php) and use mysql_real_escape_string instead. it's more secure against sql injection
    if (get_magic_quotes_gpc()) {
        $aSearch = array_map('stripslashes', $aSearch);
    }
    $aSearch = array_map('mysql_real_escape_string', $aSearch);
    
    // get all tables in selected database
    $sSQL1 = 'SHOW TABLES';
    $rRes1 = mysql_query($sSQL1);
    
    // save hits
    $aHits = array();
    while ($aTable = mysql_fetch_array($rRes1)) {
        $sTable = $aTable[0];
        
        // get all columns from each table
        $sSQL2 = "SHOW COLUMNS FROM `$sTable`"; 
        $rRes2 = mysql_query($sSQL2);
        
        // combine search words with columns
        $aPermutation = array();
        while ($aColumn = mysql_fetch_assoc($rRes2)) {
            $sColumn = $aColumn['Field'];
            for ($i = 0; $i < $iSearch; $i++) {
                $sSearchword = $aSearch[$i];
                $aPermutation[] = "`$sColumn` LIKE '%$sSearchword%'";
            }
        }
        
        // combine as OR-condition
        $sSQL4 = "SELECT * FROM `$sTable` WHERE " . implode(' OR ', $aPermutation);
        $rRes4 = mysql_query($sSQL4);
        
        // collect result
        while ($aHit = mysql_fetch_assoc($rRes4)) {
        
        
        $aHits[$sTable][] = $aHit;
          
        }
    }
    
    return $aHits;
}

//-- example output --------------------------------------------------------------------------------

echo print_r(mysqlSearch($sSearch), true);


//--------------------------------------------------------------------------------------------------
?>
```


Vielen Dank im Vorab!!


----------



## Yaslaw (14. Dezember 2010)

Scheiterst du im SQL oder im PHP?
Wenns SQL ist, dann zeig doch mal ein fertiges SELECT

Und was heisst gescheitert? Fehlermeldungen?


----------



## tushkan (14. Dezember 2010)

Vielen Dank für die Antwort! 
Die Volltextsuche habe ich mir ungefähr so vorgestellt:
"SELECT * FROM `$sTable` WHERE " . implode(' AND ', $aPermutation);
Teilsuche:
SELECT * FROM '$sTable' WHERE " .implode ('LIKE', $aPermutation);

Das gibt leider nichts aus, auch keine Fehlermeldungen(


----------



## Yaslaw (14. Dezember 2010)

Da die diese Art von Fragen sehr oft kommt, habe ich mal ein Tutorial geschrieben wie man am besten auf Fehlersuche geht.
PHP MySQL Debug Queries
Geh es doch mal durch und falls du die Lösung nicht findest, poste mal das ausgegebe SQL-Statement ins Forum.


----------

