webForumDet fria alternativet

splitta sträng i en form...

4 svar · 334 visningar · startad av klockren

klockrenMedlem sedan sep. 200151 inlägg
#1

Hej,

hade för några veckor sedan lite frågor om hur man bygger en sökmotor. Min sökmotor är nu helt komplett förutom att det bara går att söka på ett enda ord.

Sökformuläret finns i search.php och skickar en söksträng till result.php så här:

search.php

<FORM ACTION="result.php" METHOD="post">
<INPUT TYPE="TEXT" NAME="key" SIZE="30">
<INPUT TYPE="SUBMIT" VALUE=" S&ouml;k! "><br>
</FORM>

result.php

mysql_connect("127.0.0.1", "rot", "rot");
mysql_select_db("big_db");
$resultat = mysql_query("SELECT bla bla bla FROM bla bla WHERE keyword LIKE '%$key%'");

Problemet är att om användaren skriver in "el gitarr" som söksträng hittas ingenting, men om han skriver "el" eller "gitarr" eller "elgitarr" så hittas filen "elgitarr".

Det jag tänkt göra är alltså att separera söksträngen vid varje mellanslag med split(). Men split lägger väl resultatet i en array? Hur ska jag då gå till väga för att ändra min mysql_query så att den kan söka på alla orden i arrayen var för sig i ett svep? Kodförslag mottages tacksamt!!!

MVH
.::J::.

SPiNMedlem sedan mars 20007 896 inlägg
#2

Som du säger får du en array med sökord om du använder split() ( Använd hellre explode(), den är snabbare ). Men det är ju inget hinder, du får då bygga upp frågan dynamiskt:

$sqlQueryStart = "SELECT blah FROM bluh WHERE";
$sqlQueryEnd = "";

if( strstr( trim( $_POST[ 'key' ] ), ' ' ) ) {
     $searchArray = explode( ' ', trim( $_POST[ 'key' ] ) );

     foreach( $searchArray as $searchKey ) {
          ( $sqlQueryEnd != "" ) ? $sqlQueryEnd .= " OR" : $sqlQueryEnd = "";

          $sqlQueryEnd .= " keyword LIKE '%" . $searchKey . "%'";
     }
}
else {
     $sqlQueryEnd .= " keyword LIKE '%" . $searchKey . "%'";
}

$sqlQueryEnd .= " ORDER BY keyword ASC";

$mysqlResult = mysql_query( $sqlQueryStart . $sqlQueryEnd );
...
klockrenMedlem sedan sep. 200151 inlägg
#3

Hej SPiN...
jag har försökt implementera ditt kodstycke, men får det ej att fungera!

För det första förstår jag inte exakt vad denna kod gör

if( strstr( trim( $_POST[ 'key' ] ), ' ' ) ) {
     $searchArray = explode( ' ', trim( $_POST[ 'key' ] ) );

Så här ser koden jag fick ut efter att jag försökt implementera den:

	$searchKey = str_replace("*", "%", $key);
	$sqlQueryStart = "SELECT namn, id FROM rec_db WHERE";
	$sqlQueryEnd = "";

	mysql_connect("127.0.0.1", "rot", "rot");
	mysql_select_db("rec_db");

	if(strstr(trim($_POST['key']), ' '))
	{
		$searchArray = explode(' ', trim($_POST['key']));

		foreach($searchArray as $searchKey)
		{
			($sqlQueryEnd != "") ? $sqlQueryEnd .= " OR" : $sqlQueryEnd = "";
			$sqlQueryEnd .= " namn LIKE '%" . $searchKey . "%'";
		}
	}
	else
	{
		$sqlQueryEnd .= " namn LIKE '%" . $searchKey . "%'";
	}

	$sqlQueryEnd .= " ORDER BY namn ASC";
	$result = mysql_query($sqlQueryStart . $sqlQueryEnd);

	mysql_close();

Dock fungerar allt precis som förut, skriver användaren in ett enda ord går det bra, skriver användaren flera ord hittas ingenting. Vad gör jag för fel, blir frustrerad!!!

(enda indataparametern är $key)

MVH
.::j::.

SPiNMedlem sedan mars 20007 896 inlägg
#4

För det första förstår jag inte exakt vad denna kod gör

kod:
if( strstr( trim( $_POST[ 'key' ] ), ' ' ) ) {
     $searchArray = explode( ' ', trim( $_POST[ 'key' ] ) );

Först görs en koll om användaren söker på fler än ett ord, alltså om det finns något mellanslag i texten. Finns det det, så sprängs strängen vid alla mellanslag till en array med alla sökorden. :)

$searchKey = str_replace("*", "%", $key);

Den här raden kan du helt ta bort, den gör ingen nytta.

Om du skriver ut din SQL-fråga innan du kör den i mysql_query(), vad skrivs ut?

$sqlQueryEnd .= " ORDER BY namn ASC";

die( $sqlQueryStart . $sqlQueryEnd ); // Det här lägger du till

$result = mysql_query($sqlQueryStart . $sqlQueryEnd);

mysql_close();

Hur ser SQL-frågan ut?

klockrenMedlem sedan sep. 200151 inlägg
#5

Hej,

så här ser SQL-frågan ut om jag skriver in tre olika ord:

SELECT namn, id FROM rec_db WHERE namn LIKE '%detta funkar icke%' ORDER BY namn ASC

Felet är allstå att

if(strstr(trim($_POST['key']), ' '))

ALLTID returnerar "false"!? Varför i hela världen gör den det???

Nåväl, så här ser nu koden ut i sin helhet:

	$sqlQueryStart = "SELECT namn, id FROM rec_db WHERE";
	$sqlQueryEnd = "";

	mysql_connect("127.0.0.1", "rot", "rot");
	mysql_select_db("rec_db");

	if(strstr(trim($_POST['key']), ' '))
	{
		$searchArray = explode(' ', trim($_POST['key']));

		foreach($searchArray as $searchKey)
		{
			($sqlQueryEnd != "") ? $sqlQueryEnd .= " OR" : $sqlQueryEnd = "";
			$sqlQueryEnd .= " namn LIKE '%" . $searchKey . "%'";
		}
	}
	else
	{
		$sqlQueryEnd .= " namn LIKE '%" . $key . "%'";
	}

	$sqlQueryEnd .= " ORDER BY namn ASC";
	$result = mysql_query($sqlQueryStart . $sqlQueryEnd);

	mysql_close();

...och så ett tack för tidigare hjälp!
Hoppas att någon kan se varför if-satsen trilskas!!!

.::j::.

133 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)