Avatar billede old-faithful Praktikant
18. juli 2006 - 19:45 Der er 15 kommentarer og
1 løsning

PHP søgning i CSV-fil

Hej,
Er der nogen der kender (eller evt. kan lave) et simpelt PHP-script til at søge i en komma-separeret fil (CSV) og vise resultaterne i en HTML-tabel?

Jeg forestiller mig et simpelt script, hvor man kan indtaste søgeord i en tekstboks, og så få alle resultaterne i en tabel som viser de fundne linjer (inkl. alle kolonner i den række).

Andre krav:
- Må ikke benytte CGI/Perl
- Må ikke kræve MySQL
- Skal kunne søge i CSV-filer (almindelige, komma-separerede tekstfiler)
- Man må meget gerne kunne konfigurere sin egen "delimiter"

Et eksempel:
Søgning efter "æbler" giver en tabel:

Genstand:      Sort:              Farve:
------------------------------------------------------------
Æbler          Granny Smith      Grønt
Æbler          Onkel Benny's      Rød
Avatar billede coderdk Praktikant
18. juli 2006 - 19:51 #1
Avatar billede old-faithful Praktikant
18. juli 2006 - 19:56 #2
Tak for links men jeg må hellere uddybe lidt...

Jeg har kun meget lidt erfaring med PHP (dvs. implementering, men ikke programmering), så jeg søger et relativt færdigt script.
Avatar billede coderdk Praktikant
18. juli 2006 - 20:15 #3
Ok :) Men dette område er hjælp-til-selvhjælp - Dit indlæg hører så vist mere til her: http://www.eksperten.dk/spm/Opgaver/Programmeringsopgaver/PHP/
Avatar billede old-faithful Praktikant
18. juli 2006 - 20:33 #4
Måske .. men det kan jo være at der er nogen der kender et færdigt script :-)
Avatar billede coderdk Praktikant
18. juli 2006 - 21:30 #5
Jeg tror det er så simpelt at ingen har et færdigt et. Måske du skulle prøve at lære PHP så ;) Her er et nogenlunde færdigt et du kan kigge på:

<form method="post">
    Adskiller: <input type="text" name="del" value=","><br>
    Strengadskiller: <input type="text" name="str" value="\""><br>
    Søg efter: <input type="text" name="srch">
    <input type="submit" value="Søg">
</form>
<?php

    if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    {
        // Kun når man har trykket submit
       
        // Her sættes nogle defaults
        $delim = ( empty( $_POST['del'] ) ? ',' : $_POST['del'] );
        $str = ( empty( $_POST['str'] ) ? '"' : $_POST['str'] );
        $srch = ( empty( $_POST['srch'] ) ? '' : $_POST['srch'] );
        if ( empty( $srch ) )
        {
            // Brugeren har ikke søgt efter noget
            die( 'Du skal søge efter noget.' );
        }
        $row = 0;
        if ( $handle = @fopen( "din_fil.csv", "r" ) )
        {
            // Her er filen åbnet
            while ( ( $data = fgetcsv( $handle, 1000, $delim, $str ) ) !== FALSE)
            {
                $fields = count($data); // Antal kolonner
                $found = false;
                for ( $i = 0; $i < $fields; $i++ )
                {
                    // I dette loop søger vi
                    if ( $data[ $i ] == $srch )
                    {
                        // Et af felterne matcher!
                        $found = true;
                        break;
                    }
                }
                if ( $found )
                {
                    // Kun hvis vi har fundet noget
                    $row++;
                    for ($c=0; $c < $num; $c++)
                    {
                        // Udskriv hele rækken
                        echo $data[$c] . "<br />\n";
                    }
                }
            }
            if ( $row == 0 )
            {
                echo "Ingen rækker fundet";
            }
        }
        else
        {
            echo "Kunne ikke åbne filen";
        }
    }

?>
Avatar billede old-faithful Praktikant
18. juli 2006 - 23:03 #6
Hej, tak for koden.

Jeg prøvede at uploade den og oprettede en testfil "din_fil.csv" på min side, men jeg får fejlen "405 - Ressourcen er ikke tilladt" når jeg trykker på "Søg". Har du nogle idéer om hvad der kan være galt?

Hvis det hjælper, har min HTML-fil koden:
--------------------------------------------
<html>

<head>
</head>
<body>
<form method="post">
    <p>Adskiller: <input type="text" name="del" value=","><br>
    Strengadskiller: <input type="text" name="str" value="\""><br>
    Søg efter: <input type="text" name="srch">
    <input type="submit" value="Søg">
</p>
</form><br>

<!-- PHP CODE START -->
<?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        // Kun når man har trykket submit
       
        // Her sættes nogle defaults
        $delim = (empty($_POST['del']) ? ',' : $_POST['del']);
        $str = (empty( $_POST['str'] ) ? '"' : $_POST['str']);
        $srch = (empty($_POST['srch']) ? '' : $_POST['srch']);
        if (empty($srch))
        {
            // Brugeren har ikke søgt efter noget
            die( 'Du skal søge efter noget.' );
        }
        $row = 0;
        if ( $handle = @fopen("din_fil.csv", "r" ))
        {
            // Her er filen åbnet
            while (($data = fgetcsv($handle, 1000, $delim, $str)) !== FALSE)
            {
                $fields = count($data); // Antal kolonner
                $found = false;
                for ($i = 0; $i < $fields; $i++)
                {
                    // I dette loop søger vi
                    if ($data[ $i ] == $srch)
                    {
                        // Et af felterne matcher!
                        $found = true;
                        break;
                    }
                }
                if ($found)
                {
                    // Kun hvis vi har fundet noget
                    $row++;
                    for ($c=0; $c < $num; $c++)
                    {
                        // Udskriv hele rækken
                        echo $data[$c] . "<br />\n";
                    }
                }
            }
            if ($row == 0)
            {
                echo "Ingen rækker fundet";
            }
        }
        else
        {
            echo "Kunne ikke åbne filen";
        }
    }

?></font></body></html>
Avatar billede coderdk Praktikant
19. juli 2006 - 01:32 #7
Prøv at ændre:

<form method="post">

til:

<form method="post" action="<?= $_SERVER['SCRIPT_NAME'] ?>">

Hvis det ikke virker så ændr:

<form method="post">

til:

<form method="get" action="<?= $_SERVER['SCRIPT_NAME'] ?>">

og ændr alle $_POST til $_GET samt:

if ($_SERVER['REQUEST_METHOD'] == 'POST')

til:

if (!empty( $_GET['srch'] ) )
Avatar billede old-faithful Praktikant
19. juli 2006 - 16:09 #8
Hmm.. nu får jeg en Error 404 i stedet, hvad enten jeg bruger første eller anden mulighed.

I adressebaren i IE står der hhv.:
- http://www.minside.dk/test/<?=%20$_SERVER['SCRIPT_NAME']%20?>
- http://www.minside.dk/test/<?del=%2C&str=%5C&srch=apple

Nogle andre forslag? P.S. Jeg bruger iflg. mit kontrolpanel PHP version 4, hvis det gør en forskel.
Avatar billede coderdk Praktikant
19. juli 2006 - 16:17 #9
Weird, prøv lige at ændre :

action="<?= $_SERVER['SCRIPT_NAME'] ?>">

til:

action="<? echo $_SERVER['SCRIPT_NAME']; ?>">
Avatar billede old-faithful Praktikant
19. juli 2006 - 23:01 #10
Det hjælper stadig ikke. Jeg får stadig en 404 fejl.


En af de løsninger jeg har prøvet:
----------------------------------------------
<html>

<head>
</head>
<body>
<form method="get" action="<? echo $_SERVER['SCRIPT_NAME']; ?>">
    <p>Adskiller: <input type="text" name="del" value=","><br>
    Strengadskiller: <input type="text" name="str" value="\""><br>
    Søg efter: <input type="text" name="srch">
    <input type="submit" value="Søg">
</p>
</form><br>

<!-- PHP CODE START -->
<?php
    if (!empty( $_GET['srch'] ) )
    {
        // Kun når man har trykket submit
       
        // Her sættes nogle defaults
        $delim = (empty($_GET ['del']) ? ',' : $_GET ['del']);
        $str = (empty( $_GET ['str'] ) ? '"' : $_GET ['str']);
        $srch = (empty($_GET ['srch']) ? '' : $_GET ['srch']);
        if (empty($srch))
        {
            // Brugeren har ikke søgt efter noget
            die( 'Du skal søge efter noget.' );
        }
        $row = 0;
        if ( $handle = @fopen("din_fil.csv", "r" ))
        {
            // Her er filen åbnet
            while (($data = fgetcsv($handle, 1000, $delim, $str)) !== FALSE)
            {
                $fields = count($data); // Antal kolonner
                $found = false;
                for ($i = 0; $i < $fields; $i++)
                {
                    // I dette loop søger vi
                    if ($data[ $i ] == $srch)
                    {
                        // Et af felterne matcher!
                        $found = true;
                        break;
                    }
                }
                if ($found)
                {
                    // Kun hvis vi har fundet noget
                    $row++;
                    for ($c=0; $c < $num; $c++)
                    {
                        // Udskriv hele rækken
                        echo $data[$c] . "<br />\n";
                    }
                }
            }
            if ($row == 0)
            {
                echo "Ingen rækker fundet";
            }
        }
        else
        {
            echo "Kunne ikke åbne filen";
        }
    }

?></font></body></html>
Avatar billede coderdk Praktikant
19. juli 2006 - 23:10 #11
Det lyder som din server slet ikke fortolker PHP... Prøv lige, aller øverst i filen at skrive:

<? phpinfo(); ?>
Avatar billede old-faithful Praktikant
19. juli 2006 - 23:38 #12
Jeg prøvede at indsætte ovennævnte i toppen af min HTML-fil, men det ændrer desværre ikke på noget. Siden vises som den hele tiden er blevet vist.

Det skulle undre mig meget hvis serveren slet ikke fortolker, da jeg før har haft PHP scripts på den og for tiden har et funktionsdygtigt (php) CMS oppe at køre. :-(
Avatar billede flashbordon Nybegynder
20. juli 2006 - 11:23 #13
det kan ske at den ikke fortolker <? som <?php
Avatar billede coderdk Praktikant
20. juli 2006 - 11:58 #14
Ja, prøv at ændre <? til <?php - hvis det ikke virker, så virker PHP ikke ordentligt på din server. Den sidste linje jeg bad dig sætte ind skulle give en kæmpe oversigt over php-installationen på serveren.
Avatar billede old-faithful Praktikant
20. juli 2006 - 13:12 #15
Underligt der sker stadig ikke noget... jeg giver op!

Du får points for indsatsen ;-)
Avatar billede old-faithful Praktikant
26. september 2006 - 21:44 #16
Hey.. jeg fik det til delvist at virke. Jeg har dog oprettet et relateret spørgsmål som du er velkommen til at kigge med/svare på ;-) http://www.eksperten.dk/spm/734863
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