[php] searchform, zoeken in meerdere tabellen

Pagina: 1
Acties:
  • 130 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
Hallo,

heb een searchform gemaakt. Nu kan ik maar in 1 tabel zoeken maar zou graag in meerdere tabellen willen zoeken. De structuur van die andere tabellen is wel geheel anders. In totaal moet ik in 3 tabellen zoeken. Onderstaand scriptje heb ik al om te zoeken in 1 tabel en kom er maar niet uit hoe ik dat fatsoenlijk krijg om in meerdere tabellen te zoeken. Kan iemand me misschien wat meer op weg helpen?

Verder heb ik er ook nog iets ingemaakt die het aantal hits telt zodat in een balk kan worden aangegeven wat je "match-gehalte" is.

Dit is mn script:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<? 
include("include/php/db.inc.php"); 
$zoek2 = strtolower($_REQUEST['search']); 
$zoek2 = explode(" ",$zoek2); 

$like = "";  
$count = "";   
foreach($zoek2 as $zoek3)  { 
   
    if ($like <> "") { 
        $like = "$like OR content LIKE '%$zoek3%'"; 
    } 
    else { 
        $like = "LIKE '%$zoek3%'"; 
    }
    if ($count <> "") { 
        $count = "$count, $zoek3"; 
    } 
    else { 
        $count = "$zoek3"; 
    }    
} 

  
if ($like <> "") { 

   $qry = "SELECT content, name, ID FROM artikel WHERE content $like  "; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name = strtolower($row["name"]);
        $content = strtolower($row["content"]);
        $id = strtolower($row["ID"]);
        
        $count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content)) - 1; 
    }
    }
      $p = $n;
                      
      $artikel[$n] = "<!--" . $p . $id . "--><tr> <td>
<a class=nieuws_kopregel href=index2.php?parentID=1&id=". $id . ">" . $name. "
</td><td align=left>
<table width=170  border=0 cellspacing=0 cellpadding=0><tr>
<td width=" . $n * 100 ." class=search_result_blue>&nbsp;</td>
<td class=search_result_wit width=*>&nbsp;</td></tr></table></td></tr>" ;

    
rsort($artikel);
reset($artikel);
} 
      
while (list($key, $val) = each($artikel))

       echo  $val;
       
       }
?>


Het is niet de betse php die der is maar tot nu toe werkt het en ben nog lerende duss...

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Wat werkt er nu niet precies?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
bedoel je een join?

|>


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die code onder if ($like <> "") kun je in een functie zetten die een query als parameter neemt en de resultaten returnt. Dan kun je drie keer die functie aanroepen, et voila, resultaat.

Je mag je code wel eens wat beter uitlijnen, en in plaats van vergelijken met een lege string is het netter om te werken met if (!empty($like)). :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
en hoe doe ik dat ongeveer?

Waar moet ik beginnen?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoals ik in mijn vorige post al zei.
Waar moet ik beginnen?
Hier lijkt me een goed idee: http://nl3.php.net/manual/nl/functions.php

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

twisted2000 schreef op zondag 12 december 2004 @ 15:57:
en hoe doe ik dat ongeveer?

Waar moet ik beginnen?
Hoe doe je wat ongeveer?
Een join? Dat is in een beetje SQL tutorial wel te vinden :)

SQL:
1
2
select iets from tabel1
left join tabel2 on tabel2.id = table1.id

Zoiets dus :)

Als je tabellen helemaal geen relatie met elkaar hebben dan zul je 3 losse queries moeten uitvoeren op de manier zoals je dat nu al doet voor 1 tabel.

Maar wat werkt er nog niet? Wat heb je zelf al geprobeerd? Krijg je een foutmelding?

[ Voor 8% gewijzigd door Creepy op 12-12-2004 16:03 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
de tabellen hebben idd geen relatie met elkaar dus moet ik het met losse query's doen.

alleen is dan mijn vraag hoe ik krijg ik dan die 3 results netjes achter elkaar gesorteerd op het aantal hits.... :?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoals ik al zei. Functie maken. Die returnt resultaten in een array. Die resultaten merge je met array_merge() en kun je daarna sorteren hoe je wilt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
weer een paar dagen later.

Heb nu dit....weet alleen niet hoe ik moet sorteren op het aantal woorden dat overeenkomt met de content. Moet dus eerst tellen hoevaak n woord erin voorkomt en dan moet ik daarop sorteren.

Ook geeft hij een foutmelding als het woord niet in die tabel voorkomt. Want dit deel werkt niet echt:
PHP:
1
2
3
if (!empty($result)){
$name_total = array_merge($name_total, $name);
}

dit is het script, wel wat lang want ik doe per tabel het script herhalen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<? 
include("include/php/db.inc.php"); 
$zoek2 = strtolower($_REQUEST['search']); 
$zoek2 = explode(" ",$zoek2); 

$like = "";  
$count = "";   
$name_total = "<B>Search results</B>";
foreach($zoek2 as $zoek3)  { 
    //dus hier gaan we eerst het like gedeelte compleet maken 
    if ($like <> "") { 
        $like = "$like OR content LIKE '%$zoek3%'"; 
    } 
    else { 
        $like = "LIKE '%$zoek3%'"; 
    }
    if ($count <> "") { 
        $count = "$count, $zoek3"; 
    } 
    else { 
        $count = "$zoek3"; 
    }    
} 

  
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry = "SELECT content, name, ID FROM artikel WHERE content $like  "; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name[] = strtolower($row["name"]);
        $content[] = strtolower($row["content"]);

}
if (!empty($result)){
$name_total = array_merge($name_total, $name);
}
}

 
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry2 = "SELECT content, name FROM demo WHERE content $like  "; 
   $result2 = mysql_query($qry2) or die("Verbinding mislukt."); 
   while ($row2 = mysql_fetch_array($result2)) { 
   
        $name2[] = strtolower($row2["name"]);
        $content2[] = strtolower($row2["content"]);
        
        } 
if (!empty($result2)){
$name_total = array_merge($name_total, $name2);
}
}

 
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry3 = "SELECT content, titel FROM literatuur WHERE content $like  "; 
   $result3 = mysql_query($qry3) or die("Verbinding mislukt."); 
   while ($row3 = mysql_fetch_array($result3)) { 
   
        $name3[] = strtolower($row3["titel"]);
        $content3[] = strtolower($row3["content"]);
        
        
    } 
if (!empty($result3)){
$name_total = array_merge($name_total, $name3);
}
}

  
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry4 = "SELECT content, titel FROM nieuws WHERE content $like  "; 
   $result4 = mysql_query($qry4) or die("Verbinding mislukt."); 
   while ($row4 = mysql_fetch_array($result4)) { 
   
        $name4[] = strtolower($row4["titel"]);
        $content4[] = strtolower($row4["content"]);
        
        
    } 
if (!empty($result4)){
$name_total = array_merge($name_total, $name4);
}
}


while (list($key, $val) = each($name_total))


       echo  $val .  "<BR><BR>";
       
?>  


zou iemand me kunnen helpen hoe ik het aantal woorden kan tellen dat match en hoe ik die foutmelding wegkrijg??

had dit nog gemaakt voor het tellen van het aantal woorden maar weet niet hoe ik dat nu moet toepassen want dat was maar het zoeken in 1 tabel.

PHP:
1
2
3
4
5
6
7
8
9
10
$count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content)) - 1; 
    }
    }



alvast bedankt!

[ Voor 9% gewijzigd door twisted2000 op 14-12-2004 04:56 ]


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
ben ondertussen al een stuk verder.....

Alleen geeft hij nu maar 1 search result weer als er meerdere zijn. en nog altijd de foutmelding omdat dit blijkbaar niet klopt?

PHP:
1
2
3
4
if (!empty($result3)){
$name_total = array_merge($name_total, $name3);
$content_total = array_merge($content_total, $content3);
}



dit is mijn gehele script.....kan iemand me helpen want ik weet t echt ff niet meer\

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<? 
include("include/php/db.inc.php"); 
$zoek2 = strtolower($_REQUEST['search']); 
$zoek2 = explode(" ",$zoek2); 

$like = "";  
$count = "";   
$name_total = "<B>Search results</B>";
$content_total = "";
foreach($zoek2 as $zoek3)  { 
    //dus hier gaan we eerst het like gedeelte compleet maken 
    if ($like <> "") { 
        $like = "$like OR content LIKE '%$zoek3%'"; 
    } 
    else { 
        $like = "LIKE '%$zoek3%'"; 
    }
    if ($count <> "") { 
        $count = "$count, $zoek3"; 
    } 
    else { 
        $count = "$zoek3"; 
    }    
} 

  
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry = "SELECT content, name, ID FROM artikel WHERE content $like  "; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name[] = strtolower($row["name"]);
        $content[] = strtolower($row["content"]);

}
if (!empty($result)){
$name_total = array_merge($name_total, $name);
$content_total = array_merge($content_total, $content);
}
}

 
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry2 = "SELECT content, name FROM demo WHERE content $like  "; 
   $result2 = mysql_query($qry2) or die("Verbinding mislukt."); 
   while ($row2 = mysql_fetch_array($result2)) { 
   
        $name2[] = strtolower($row2["name"]);
        $content2[] = strtolower($row2["content"]);
        
        } 
if (!empty($result2)){
$name_total = array_merge($name_total, $name2);
$content_total = array_merge($content_total, $content2);
}
}

 
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry3 = "SELECT content, titel FROM literatuur WHERE content $like  "; 
   $result3 = mysql_query($qry3) or die("Verbinding mislukt."); 
   while ($row3 = mysql_fetch_array($result3)) { 
   
        $name3[] = strtolower($row3["titel"]);
        $content3[] = strtolower($row3["content"]);
        
        
    } 
if (!empty($result3)){
$name_total = array_merge($name_total, $name3);
$content_total = array_merge($content_total, $content3);
}
}

  
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry4 = "SELECT content, titel FROM nieuws WHERE content $like  "; 
   $result4 = mysql_query($qry4) or die("Verbinding mislukt."); 
   while ($row4 = mysql_fetch_array($result4)) { 
   
        $name4[] = strtolower($row4["titel"]);
        $content4[] = strtolower($row4["content"]);
        
        
    } 
if (!empty($result4)){
$name_total = array_merge($name_total, $name4);
$content_total = array_merge($content_total, $content4);
}
}



foreach ($content_total as $content_total2){

$count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content_total2)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content_total2)) - 1; 
    }
    }
      $p = $n;
      }
      
      foreach ($name_total as $name_total2){
                      
      $artikel[$n] = "<!--" . $p . $id . "--><tr> <td>" . $name_total2. "</td><td align=left><hr color=#990000 size=10 width=" . $n * 100 ."></td></tr>" ;
    
    }
    
    
rsort($artikel);
reset($artikel);

      
while (list($key, $val) = each($artikel))

       echo  $val;

?>

Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
nog maar een vraag want ik kom er echt niet uit....ben wel al een stuk verder dus als iemand me een beetje verder op weg zou helpen zou ik dat wel relaxed vinden :)

dit heb ik
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$content4 = array();
$name4 = array();
$id4 = array();
   //kleine beveiliging voor als er niks is ingevult   
   $qry4 = "SELECT content, titel, id FROM nieuws WHERE content $like  "; 
   $result4 = mysql_query($qry4) or die("Verbinding mislukt."); 
   while ($row4 = mysql_fetch_array($result4)) { 
   
        $id4[] = strtolower($row4["id"]);
        $name4[] = strtolower($row4["titel"]);
        $content4[] = strtolower($row4["content"]);
    } 
        
 if (is_array($content4))$content_total = array_merge($content_total, $content4);
 if (is_array($name4))$name_total = array_merge($name_total, $name4);
 if (is_array($id4))$id_total = array_merge($id_total, $id4);

}
foreach($content_total as $content_total2){
      
      $count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        
$n = substr_count($content_total2, $count3) + $n;

}
}
      
while (list($key, $val) = each($name_total))

       echo  $val . "<BR><BR>";


boven dit script is er trouwens nog n stuk script voor het oproepen van de gegevens uit 3 andere tabellen uit de database.

en nu moet ik het zo krijgen dat $id_total en $n bij $val komen te staan maar de juiste id en $n moet dan wel bij de juiste $name_total horen.

Weet iemand hoe ik dat kan doen?

[ Voor 9% gewijzigd door twisted2000 op 14-12-2004 11:32 ]


Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
Wat je ook zou kunnen doen is de tabellen aan elkaar plakken met een Union, hierdoor hoef je nog maar 1 sql query uit te voeren op de database, ik zou het dan zoiets doen.


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?
include("include/php/db.inc.php");

$searchTables = array();
$searchTables["artikel"] = array( "searchColumn" => "content", "selectColumns" => array("content", "name", "id"));
$searchTables["demo"] = array( "searchColumn" => "content", "selectColumns" => array("content", "name", "id"));
$searchTables["literatuur"] = array( "searchColumn" => "content", "selectColumns" => array("content", "titel", "id"));
$searchTables["nieuws"] = array( "searchColumn" => "content", "selectColumns" => array("content", "titel", "id"));

$searchWords = preg_split("/ +/", strtolower($_REQUEST['search'])); //preg_split ipv explode om lege array items te voorkomen
$like = "";

if (count($searchWords) > 0)
{
    foreach( $searchTables as $searchTableName=>$searchTable )
    {
        if ($qry <> "")
        {
            $qry .= "\nUNION\n";
        }
        foreach($searchWords as $searchWord)
        {
            if (!get_magic_quotes_gpc())
            {
                $searchWord = mysql_escape_string($searchWord);
            }
            if ($like <> "")
            {
                $like .= " OR ";
            }
            $like .= $searchTable['searchColumn'] . " LIKE '%" . $searchWord . "%'";
        }
        $qry .= "SELECT '" . $searchTableName . "' AS 'resultType'," . implode ( ", " , $searchTable['selectColumns']) . " FROM " . $searchTableName . " WHERE " . $like;
    }

    $result = mysql_query($qry) or die("Zoekopdracht mislukt");
    echo "Gezocht naar: " . implode ( ", " , $searchWords) . "<BR>";

    while ($row = mysql_fetch_array($result))
    {
        $resultType = $row['resultType'];
        $id = strtolower( $row['id'] );  
        $name = $row['name'];
        $content = strtolower( $row['content'] );

        $count = 0;
        foreach($searchWords as $searchWord)
        {
            $count += substr_count($content, $searchWord);
        }
        echo $resultType . ": " . $id . " - "  . $name . " : " . $count . "<br>";
    }
}
?>
Pagina: 1