zoek script

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Erwin b

Erwin b

21/12/2012 22:27:07
Quote Anchor link
Het wil nog niet zo lukken. Het bestand heet zoek.php ik heb de code zo ver ik weet goed aangepast. Maar nu krijg ik steeds de melding "niet gevonden" ik krijg wel het zoek invul veld maar hij vind niks. Dit is de code zoals ik hem nu heb, ben ik nog iets vergeten?
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
$dir
= '/httpdocs'; //zet hier het pad van de te doorzoeken directory
$baseUrl = 'http://www.mijn domeinnaam.nl/'; //zet hier de url van de te doorzoeken directory

if (isSet($_POST['zoek'])) {
    $zoekNaar = trim($_POST['zoekterm']);
    $woorden = explode(' ', $zoekNaar);
    $gevonden = zoekFiles($dir, $woorden);
}
else {
    $zoekNaar = '';
}

printFormulier($zoekNaar);
if ($zoekNaar) {
    if ($gevonden)
        printGevonden($gevonden, $baseUrl);
    else
        print "niets gevonden";
}

function
printFormulier($zoekNaar) {
    print '
    <form name="zoekformulier" method="POST" action="zoek.php" ENCTYPE="multipart/form-data" accept-charset="ISO-8859-15">
        <input type="text" name="zoekterm" value="'
;
    print htmlspecialchars($zoekNaar, ENT_QUOTES, 'ISO-8859-15');
    print '">
        <input type="submit" name="zoek" value="zoek">
    </form>'
;
}

function
printGevonden($gevonden, $baseUrl) {
    forEach($gevonden as $filePath) {
        $delen = explode('/', $filePath);
        print '<a href="';
        print $baseUrl; //moet eigenlijk ook geexplode en in delen urlEncoded, maar als je normale directorynamen hebt gaat dit wel goed
        forEach($delen as $i => $deel) {
            if ($i) print "/";
            print rawUrlEncode($deel);
        }

        print '">';
        print htmlspecialchars($filePath, ENT_QUOTES, 'ISO-8859-15');
        print '</a><br>';
    }
}

function
zoekFiles($dir, $woorden) {
    $files = getFilesFromDir($dir);
    $gevonden = array();
    $vanaf = strLen($dir) + 1;
    forEach($files as $filePath) {
        if (strToLower(subStr($filePath, -4)) == '.htm' || strToLower(subStr($filePath, -5)) == '.html') {
            $html = file_get_contents($filePath);
            //hier foutafhandeling toevoegen voor als de file niet in te lezen is
            $content = strip_tags($html);
            forEach($woorden as $woord) {
                $pos = stripos($content, $woord);
                if ($pos !== false) {
                    $gevonden[] = subStr($filePath, $vanaf);
                    break;
                }
            }
        }
    }

    return $gevonden;
}
function
getFilesFromDir($dir) {

  $files = array();
  if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            if(is_dir($dir.'/'.$file)) {
                $dir2 = $dir.'/'.$file;
                $files[] = getFilesFromDir($dir2);
            }

            else {
              $files[] = $dir.'/'.$file;
            }
        }
    }

    closedir($handle);
  }


  return array_flat($files);
}

function
array_flat($array) {

  foreach($array as $a) {
    if(is_array($a)) {
      $tmp = array_merge($tmp, array_flat($a));
    }

    else {
      $tmp[] = $a;
    }
  }


  return $tmp;
}

?>
 
PHP hulp

PHP hulp

12/05/2024 08:03:13
 
Tim S

Tim S

21/12/2012 22:49:46
Quote Anchor link
misschien kan je in de functies tussen de if en else even iets echoën,
zoals bij //hier foutafhandeling toevoegen voor als de file niet in te lezen is
even echo 'file is niet te lezen'; dan kun je misschien zien waar het fout gaat.
 
Henk Verhoeven

Henk Verhoeven

22/12/2012 10:34:39
Quote Anchor link
Ik ben het met Tim eens dat je die foutafhandeling wel handig zou zijn, maar ik denk niet dat dat dit probleem gaat oplossen. Als ik terugblader naar jouw reactie dd 14/12/2012 11:15:29 dan zie ik namelijk dat je allemaal .php bestanden hebt. Ik heb de functie zoekFiles() expres zo gemaakt dat hij alleen .htm en .html bestanden vindt. Om uit te proberen of het script wel .html bestanden vindt raad ik je aan om tijdelijk 1 of 2 html bestanden te uploaden en dan te kijken of ze gevonden worden.

Als dit de oorzaak was dan heb je een nieuw probleem. Ik heb het script beperkt tot html bestanden omdat ik aannam dat je niet wilt dat iedereen straks ook je php scripts kan gaan doorzoeken. Want staan missien dingen in die je liever geheim houdt, bijvoorbeeld een database wachtwoord.

Waar het om draait is dat je een manier nodig hebt om je content (leesbare tekst) van je php programmacode te onderscheiden. Daartoe zou je natuurlijk in je .php bestanden op zoek kunnen gaan naar < ? php en ? > en wat daartussen staat niet doorzoeken, maar dat is vrij ingewikkeld. En content die in strings staat en met print of echo wordt verzonden gaat ie dan weer niet vinden.

Een andere optie zou kunnen zijn dat je de bestanden niet rechtstreeks doorleest als files, maar opvraagt via de http server. Dat kan waarschijnlijk ook met file_get_contents, maar dan met de url in plaats van het file path. Maar dan wordt het zoeken waarschijnlijk erg traag.

Je zou ook nog de content in aparte .html bestanden kunnen zetten en die vanuit de php scripts printen, bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
print file_get_contents('gele-kwikstaart.html');
Maar dan moet je in het zoekscript wel de functie printGevonden aanpassen zodat hij niet de url van het .html bestand produceert, maar die van het bijbehorende .php script. En je krijgt twee keer zo veel bestanden. Tenzij je het allemaal via 1 script weet te doen, maar dat is weer ingewikkeld, want je wilt natuurlijk wel zoekmachine-vriendelijke urls.

Of je zou toch je content in een database kunnen zetten. Die kun je dan in elk script oproepen met een simpele query en met echo of print naar de browser sturen. Dan wordt je zoekscript veel simpeler.
Gewijzigd op 22/12/2012 11:14:53 door Henk Verhoeven
 
Tim S

Tim S

22/12/2012 12:30:46
Quote Anchor link
Om te zorgen dat ze niet door je php bestande kunnen zoeken kun je de bestanden waar je doorheen wilt zoeken een andere extensie geven zoals .inc of in een andere map zetten. Ik weet niet hoeveel php wordt gebruikt maar je kan html ook in een php bestand include en ze dan laten zoeken in de html include map.
 
Erwin b

Erwin b

23/12/2012 23:06:01
Quote Anchor link
Ik gebruik wel de extensie .php maar ik gebruik (nog geen) php. Ik heb de extensie gebruikt omdat ik dacht, mocht ik het ooit nodig hebben dan kan het en met een html extensie niet. Of is er toch een manier om php te gebruiken ook al gebruik je de extensie .html?

Ik heb html bestanden toegevoegd aan mijn site en opnieuw geprobeerd een woord te zoeken waarvan ik wist dat het moest bestaan. Maar ook nu weer krijg ik de melding niet gevonden.

Ik zou terug kunnen gaan naar .html als het werkte maar zo ver ik nu kan zien is dit ook niet de oplossing. Ik heb de echo toegevoegd maar ik krijg de echo niet te zien.
 
Henk Verhoeven

Henk Verhoeven

24/12/2012 19:10:09
Quote Anchor link
Ik heb jouw versie van het script in een nieuw zoek.php bestand geplakt en bij mij werkt het wel. Maar ik krijg wel allemaal warnings. Misschien dat jouw server dan helemaal niets meer laat zien? Oh nee, je kreeg wel de melding "niets gevonden".

Op regel 50 die begint met met if (strToLower kun je trouwens bepalen met welke extensies hij zoekt. Maar hij zoekt niet binnen de tags. De woorden (of letters) die je zoekt moeten dus in de normale tekst staan.

Nu ik dit schrijf realiseer ik mij ineens dat alles tussen de php tags ook niet wordt doorzocht. Dat heb ik gelijk getest, en inderdaad! Pff, dat ik dat niet eerder heb bedacht...

OK, hier is een nieuwe regel 50:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
       if (strToLower(subStr($filePath, -4)) == '.php' || strToLower(subStr($filePath, -4)) == '.htm' || strToLower(subStr($filePath, -5)) == '.html') {

En om zeker te zijn dat die warnings geen roet in het eten (gaan) gooien zet je op lege regel 87:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
  $tmp = array();

Hopelijk helpt dit. Zo niet, dan vrees ik dat je dit toch zelf zult moeten debuggen.
Gewijzigd op 24/12/2012 19:13:59 door Henk Verhoeven
 
Erwin b

Erwin b

24/12/2012 23:36:41
Quote Anchor link
@Henk het werkt!!! :) Dat word een extra happy christmas .. het zelfde gewenst.

Ik moest wel de baseUrl weg halen anders komt bij de gevonden links 2x het domein ervoor te staan na het activeren. Ik gebruik nu alleen de $dir en het werkt perfect foto's, platte tekst, categorieën alles word gevonden.

Ik wil het nog een beetje mooier maken.
En een filter voor het uitsluiten van bepaalde pagina's. Moet ik me dan gaan verdiepen in filter_list() of filter_var_array() of misschien allebei helemaal niet?

Super bedankt alvast ik ben hier erg happy mee!
 
Henk Verhoeven

Henk Verhoeven

25/12/2012 12:38:07
Quote Anchor link
Bedankt, het zelfde! Leuk dat het werkt.

Die filters lijken me een beetje ingewikkeld. Het simpelst is volgens mij om de if voorwaarde op regel 50 uit te breiden met een extra voorwaarde:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
     if ((strToLower(subStr($filePath, -4)) == '.php' || strToLower(subStr($filePath, -4)) == '.htm' || strToLower(subStr($filePath, -5)) == '.html'
         ) && !in_array($filePath, array('../test/blog/dezenietdoorzoeken.php', '../test/dezeookniet.html')) ) {

|| betekent hier OF, && betekent EN, ! betekent NIET. Merk op dat ik de oude voorwaarde tussen haakjes heb gezet. Dat is nodig om er voor te zorgen dat in elk geval ook aan de nieuwe voorwaarde moet worden voldaan. Die houdt in dat $filePath niet mag voorkomen in de array. Dus als je nu de strings tussen de haakjes van array vervangt door strings met de paden van de bestanden die je wilt uitsluiten (includies $dir!) dan worden die als het goed is niet meer gevonden.
Gewijzigd op 25/12/2012 12:45:52 door Henk Verhoeven
 
Erwin b

Erwin b

26/12/2012 00:03:56
Quote Anchor link
Ook dit werkt mooi :) Ik heb niet zo'n hele grote site dus ik hoefde niet heel veel pagina's toetenvoegen.
Ik heb verschillende woorden gebruikt die mogelijk als zoek criteria gebruikt zouden kunnen worden en hij laat alles mooi zien :)
Het volgende stapje word het resultaat stylen en zorgen dat het bij mijn site past, maar dat gaat me denk ik wel lukken.

Super bedankt voor alle hulp tips en tijd die je er in heb gestoken. Ik hoop dat anderen ook wat aan dit script hebben, het werkt perfect!
 
Erwin b

Erwin b

27/12/2012 20:37:48
Quote Anchor link
Ik dacht.. de opmaak lukt me wel.

Ik heb de melding als er geen resultaat is in een class gezet.
Quote:
print '<div class="geenr">'."Er zijn geen resultaten gevonden.".'</div>';


In de html is de class wel te zien maar hij reageert niet op de css?
Quote:
.geenr a {
color:#B4CF67;
}

Kan je in php niet even een div plaatsen zoals bij html?

Ik heb de html helemaal onder het script staan. Eerst komt de header, menu, zoekveld, en dan de content. Hoe kan ik nu de melding "Er zijn geen resultaten gevonden." helemaal beneden in de <div id="content"> krijgen?


*de eerste vraag was beetje dom.. het is geen link dus met a weg werkt het wel.. ik was ook met de resultaten bezig en die moest wel een a'tje hebben excuses.
Gewijzigd op 27/12/2012 20:43:53 door Erwin b
 
Erwin b

Erwin b

28/12/2012 21:22:41
Quote Anchor link
Ik heb nu het hele script maar in de div content gezet en het werkt maar volgens mij is dit niet de "goede" manier. Mocht iemand betere oplossingen hebben dan hoor ik ze alsnog graag.

Groeten, Erwin
 

Pagina: « vorige 1 2



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.