Just nu i M3-nätverket
Jump to content

Sökning i flera kolumner


zug

Recommended Posts

Jag försöker få en sökfuntion att funka.

 

SELECT * FROM users WHERE namn like '%".$namn."%'

...jag vill ersätta namn så att sökningen sker i samtliga kolumner.

 

Hoppas att ni förstår vad jag menar ;-)

Link to comment
Share on other sites

Det går ju alltid att inkludera de andra kolumnerna i sökvillkoren. Alltså så här:

 

WHERE kolumn1 LIKE 'sökvillkor' OR kolumn2 like 'sökvillkor'

 

Det borde väl fungera enligt dina önskemål, eller?

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

[inlägget ändrat 2002-08-08 02:47:27 av MagicBoy (Almir)]

Link to comment
Share on other sites

Jo, givetvis men det var just det jag ville undvika.

 

Vill gärna ha en "allmän" funktion som funkar på fler tabeller.

 

Link to comment
Share on other sites

Jag vet tyvärr inte om det finns någon enkel universallösning, så jag borde egentligen inte svara, men om du vill ha en halvsnygg (inte säker på att det finns snyggare) lösning säg till så skriver jag den nu...

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

Link to comment
Share on other sites

SÅ bråttom har jag inte ;-)

 

Men det är klart, har du inget annat för dig...

 

Av någon anledning (trötthet?) lyckades jag sova bort hela - bokstavligt talat hela - dagen igår så just nu är jag hur pigg som helst. Sitter istället och "lär mig" PHP, så din fråga är som en liten utmaning som jag gärna löser både för din och min utbildnings skull.

 

Är alltså ingen expert i PHP, men det här kändes som att jag kunde lösa lätt. Det här behöver därför inte vara det bästa sättet att löse problemet, men det fungerar i alla fall.

 

Kod:

 

<?php

// Anslut till databasen.
mysql_connect ("hostnamn.se", "******", "*****");

// Välj databas
mysql_select_db ("databasnamn");

//$sokvillkor innehåller påhittade 
//sökvillkor för testets skull.
$sokvillkor = "blå";

//Plockar in informationen om tabellen till arrayen $data
$data = mysql_query("DESC tabellnamn");

//Räknar fram hur många kolumner tabellen innehåller
$antalKolumner = mysql_num_rows($data);

$i = 0;

//Letar efter kolumnnamnen till slutet av $data
while ($rad = mysql_fetch_array ($data))
{
//Bygger del av SQL satsen (kolumn1 OR kolumn2 osv...)
if ($i == 0)
{
$sql_del[$i] = " ".$rad[0];
}
else
{
$sql_del[$i] = $sql_del[$i-1]." OR ".$rad[0];
}
$i++;
}

//Bygger färdiga SQL-satsen.
$SQL_SATS = "SELECT * FROM tabbelnamn WHERE ".$sql_del[$i-1]." LIKE '%".$sokvillkor."%'";

//Skriver ut SQL-satsen
echo $SQL_SATS;

//Stänger anslutningen
mysql_close();


?>

 

Koden bygger alltså en söksats för en tabell vars namn är känd och som innehåller kolumner med, för oss, okända namn. På liknande sätt kan man ju bygga en söksats för en databas där vi inte ens känner till tabellernas namn.

 

Om du finner svaret någorlunda vettigt och till hjälp, får du gärna ge mig en liten poäng. ;) Annars får du skälla ut mig :)

 

Nu ska jag fortsätta med mina egna PHP-grejer. Blir intressant att läsa reaktionerna från PHP-proffsen imorgon och inse om jag gjort det här på krångligast möjliga sätt (känns lite så). ;)

 

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

 

 

[inlägget ändrat 2002-08-08 05:40:10 av MagicBoy (Almir)]

Link to comment
Share on other sites

Tackar för din kod. Fungerade inte riktigt så jag gjorde en liten ändring:

$sql_del[$i] = " ".$rad[0]." LIKE '%".$namn."%'";

}

else

{

$sql_del[$i] = $sql_del[$i-1]." OR ".$rad[0]." LIKE '%".$namn."%'";

}

$i++;

}

 

//Bygger färdiga SQL-satsen.

$SQL_SATS = "SELECT * FROM users WHERE ".$sql_del[$i-1]."";

 

 

 

Link to comment
Share on other sites

Bra att den koden var till någon hjälp. Det som du säger inte fungerade är alltså att jag hade:

 

...kolumn1 OR kolumn2 LIKE...

 

dvs en enda LIKE för alla kolumner, istället för att ha en för varje. Det fungerade hemma hos mig i MySQL 3.23, så det är kanske olika i olika versioner, eller något sånt.. ingen aning :)

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

[inlägget ändrat 2002-08-08 13:16:45 av MagicBoy (Almir)]

Link to comment
Share on other sites

Den tidigare koden fungerar säkert jättebra, men följande är kanske aningens mer optimerad. Det bör påpekas att jag ej har testat den, men den borde fungera. Nån felskrivning kan förekomma :)

 

// Anslut
mysql_connect("localhost", "användare", "lösenord");

// Tabell som ska sökas i
$tabell = "users";

// Hämtar lista över alla tillgängliga fält
$fält = mysql_list_fields("databas", $tabell);
$antal_fält = mysql_num_fields($fält);

$where_sats = array();

// Gör where-delar
for ($i = 0; $i < $antal_fält; $i++) {
$typ = mysql_field_type($fält, $i);
// Sök endast i textfält
if ($typ == "string" || $typ == "text" || $typ == "blob") {
 $where_sats = mysql_field_name($fält, $i) . " LIKE '%" . addcslashes($namn, "'") . "%'";
}
}

// Gör frågan
$sql_fråga = "SELECT * FROM {$tabell} WHERE " . implode(" OR ", $where_sats);

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...