Avatar billede -kenner- Nybegynder
24. juni 2006 - 14:06 Der er 12 kommentarer

Optimering af søgefunktion og kald fra to tabeller i en sql..

Hej eksperter,

Jeg mangler noget hjælp til min søge funktion. Det er også sådan, at hvis jeg skriver " "(mellemrum) i søge boksen smider den bare en række fejl, så kan i ikke hjælpe mig med at optimere min kode?

Hvad er det lige der skal ændres i mit sql kald, så dette stykke kode kommer til at virke?

Kolonnen Titel skal udskrives som titel, beskrivelse, som beskrivelse og Kode_ID/ID som ID.

Tabeller:
koder:
  - Titel
  - Beskrivelse
  - Kode_ID

tutorial:
  - Titel
  - Beskrivelse
  - ID

Try Source:
$result_text = mysql_query("select koder.titel and tutorial.titel as Titel, koder.beskrivelse and tutorial.beskrivelse as Beskrivelse, koder.ID and tutorial.Kode_ID as ID from koder, tutorial where koder.Godkendt='A' or tutorial.Godkendt='A'") or die(mysql_error());
while($row = mysql_fetch_array($result_text)){
    echo "Titel: ".$row['Titel']."<br>";
    echo "Beskrivelse: ".$row['Beskrivelse']."<br>";
    echo "ID: ".$row['ID']."<br><br>";
}

Dette skulle så skrives ind i denne source, men da det ikke virker er det ikke pastet endnu. Nederståend source søger kun i tabellen koder, men den skal også søge i toturial.

Source:

<form action="index.php?H=Home&U=9" method="POST">
<table width="100%"><tr><td valign="center">
<input type="text" name="sSearch" value="<?php if(isset($_POST['sSearch'])) echo $_POST['sSearch'];?>" style="width: 85%">
<input type="submit" name="search" value="Søg" class="knap" style="width:35px"> <input type="button" name="help" value=" class="knap" style="width:15px"onclick="window.open('pop-up.php?Titel=Søgning&Tekst=For at søge paa mere end et ord skal du lave et MELLEMRUM imellem ordene!<br><br>Du kan ikke bruge X som seperator ved søgning på flere ord!','Eksempel','width=400,height=250');"><br>
</td></tr></table></form>
<?php
if(!empty($_POST['sSearch'])) {
$search_org=$_POST['sSearch'];
$search_titel="LOWER(Titel) LIKE '%".str_replace(" ", "%' OR LOWER(Titel) LIKE '%", $search_org)."%'";
$search_beskrivelse = "LOWER(Beskrivelse) LIKE '%".str_replace(" ", "%' OR LOWER(Beskrivelse) LIKE '%", $search_org)."%'";
$search_kode="LOWER(Kode) LIKE '%".str_replace(" ", "%' OR LOWER(Kode) LIKE '%", $search_org)."%'";
$query=mysql_query("SELECT * FROM koder WHERE $search_titel OR $search_beskrivelse OR $search_kode AND Godkendt = 'Y'") or die(mysql_error());
if(mysql_num_rows($query)>0) {
  $tCount=0; 
  $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0'>";

  $search=explode(" ",$search_org);
  while($row = mysql_fetch_array($query)) {
  $iCount=0;
  $Beskrivelse=$row['Beskrivelse'];
  for($k=0; $k<count($search); $k++) {
    $reg_exp1="/^(|.*\W{1})".strtolower($search[$k])."(\W{1}.*|)$/";
    if(preg_match($reg_exp1, strtolower($row['Beskrivelse']))) {
    $iCount+=substr_count(strtolower($row['Beskrivelse']),$search[$k]);
    $Beskrivelse=str_replace(strtolower($search[$k]),"<b>".strtolower($search[$k])."</b>",$Beskrivelse);
    $iCount+=substr_count(strtoupper($row['Beskrivelse']),$search[$k]);
    $Beskrivelse=str_replace(strtoupper($search[$k]),"<b>".strtoupper($search[$k])."</b>",$Beskrivelse);
    $iCount+=substr_count(ucwords($row['Beskrivelse']),$search[$k]);
    $Beskrivelse=str_replace(ucwords($search[$k]),"<b>".ucwords($search[$k])."</b>",$Beskrivelse); }
    if(preg_match($reg_exp1, strtolower($row['Titel']))) {
    $iCount+=substr_count(strtolower($row['Titel']), $search[$k]); }
    if(preg_match($reg_exp1, strtolower($row['Kode']))) {
    $iCount+=substr_count(strtolower($row['Kode']), $search[$k]); } }

    if($iCount!=0) {
    $oOutput.="<tr>\n<td class='tekst'><b>".$row['Titel']."</b><br>\n";
    $oOutput.=$Beskrivelse."<br>\n";
    $oOutput.="<a href='index.php?H=Koder&K=".$row['ID']."'>Gå til koden »</a></td>\n</tr>";
    $tCount+=$iCount; } }

  if($tCount>0) {
  $oOutput.="<tr>\n<td class=\"tekst\">Der blev fundet ialt ".$tCount." matches på : ".$search_org."</td>\n</tr></table>";
  } else {
  $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0' class=\"tekst\"><tr><td>Der var ingen matches på : ".$search_org."</td></tr></table>";
      }
  } else {
  $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0' class=\"tekst\"><tr><td>Der var ingen matches på : ".$search_org."</td></tr></table>";
      }
echo $oOutput;
  }
if(!isset($oOutput)){
    echo"Du skal intaste et søgeord.";
    }
?>

</body>
</html>
Avatar billede jakobdo Ekspert
24. juni 2006 - 14:51 #1
Hvad hvis du retter:
if(!empty($_POST['sSearch']))
til:
if(!empty(trim($_POST['sSearch'])))
Avatar billede -kenner- Nybegynder
24. juni 2006 - 15:38 #2
Parse error: parse error, expecting `T_VARIABLE' or `'$'' in line 7

som er if(!empty(trim($_POST['sSearch']))).

Men problemet opstår lige meget hvad man søger på, bare der bliver smidt et mellemrum før teksten..
Avatar billede -kenner- Nybegynder
24. juni 2006 - 15:42 #3
Jeg ændrede linie 7 til

$ssearchstring =trim($_POST['sSearch']);
if(!empty($ssearchstring))

Hvis jeg søger på noget med mellemrun som første karakter ser det sådan ud:

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 25

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 27

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 29

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 25

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 27

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 29

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 25

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 27

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 29

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34

Warning: substr_count(): Empty substring. in c:\programmer\easyphp1-8\www\hjemmesider\hotml.dk_2d\ssoeg.php on line 34
Avatar billede jakobdo Ekspert
24. juni 2006 - 15:42 #4
Prøv lige ret ret:
if(!empty($_POST['sSearch'])) {
$search_org=$_POST['sSearch'];
til:
if(!empty(trim($_POST['sSearch']))) {
$search_org=trim($_POST['sSearch']);
Avatar billede -kenner- Nybegynder
24. juni 2006 - 15:47 #5
Den del virker nu :D Tak.

Så mangler vi bare at fikse delen med database kaldene.
Avatar billede jakobdo Ekspert
24. juni 2006 - 15:54 #6
Hvad med at lav 2 søgninger?
En søgning i tutorial og en i koder.
Avatar billede -kenner- Nybegynder
24. juni 2006 - 16:18 #7
Det var også det jeg blev fortalt før, men hvordan vil du kode det ind i søgefunktionen?
Avatar billede jakobdo Ekspert
24. juni 2006 - 16:59 #8
Hvad hvis du bare retter din SQL fra:
SELECT * FROM koder WHERE ....
til:
SELECT * FROM koder, tutorial WHERE ....
Avatar billede -kenner- Nybegynder
25. juni 2006 - 20:45 #9
Ja, men hvordan får jeg den så til at smide $row['ID'] som $row['Kode_ID'] (fra tabellen koder) istedet for?
Avatar billede jakobdo Ekspert
25. juni 2006 - 22:29 #10
Hmmm, det ved jeg faktisk ikke lige... :o(
Avatar billede -kenner- Nybegynder
26. juni 2006 - 12:53 #11
kan man ikke betinge inde i selve whilen, sådan at det liger noget a la det her:

if($iCount!=0) {
if(isset($row['Kode_ID'])){
    $oOutput.="<tr>\n<td class='tekst'><b>".$row['Titel']."</b><br>\n";
    $oOutput.=$Beskrivelse."<br>\n";
    $oOutput.="<a href='index.php?H=Koder&K=".$row['Kode_ID']."'>Gå til koden »</a></td>\n</tr>";
    $tCount+=$iCount; }else{
$oOutput.="<tr>\n<td class='tekst'><b>".$row['Titel']."</b><br>\n";
    $oOutput.=$Beskrivelse."<br>\n";
    $oOutput.="<a href='index.php?H=Koder&K=".$row['ID']."'>Gå til koden »</a></td>\n</tr>";
}
$tCount+=$iCount;
}
Avatar billede jakobdo Ekspert
26. juni 2006 - 13:10 #12
Du kunne måske også kigge på UNION -> http://www.mysqlfreaks.com/statements/13.php
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester