Avatar billede Slettet bruger
22. januar 2007 - 21:03 Der er 12 kommentarer og
1 løsning

Søgefunktion med flere rækker

Hvordan laver jeg et script hvori jeg kan vælge, at søge blandt ALLE tilgængelige rækker, men også blot nogle af dem?

Jeg vil have de mulige kategorier i et array.

$possibleRows = array(
    "film",
    "billeder",
    "spil",
    "brugere"
);
Avatar billede hmortensen Nybegynder
22. januar 2007 - 21:35 #1
Hvad vil du søge igennem og efter hvad?
Avatar billede coderdk Praktikant
22. januar 2007 - 21:45 #2
Noget i stil med:

<?php

$possibleRows = array( "film", "billeder", "spil", "brugere" );

if ( !empty( $_GET['doit'] ) )
{
    $srch = array();
    if ( !empty( $_GET['srch'] ) && is_array( $_GET['srch'] ) && count( $_GET['srch'] ) > 0 )
    {
        $searchFor = mysql_escape_string( $_GET['q'] );
        foreach ( $possibleRows as $row )
        {
            if ( in_array( $row, $_GET['srch'] ) )
            {
                $srch[] = "$row LIKE '%$searchFor%'";
            }
        }
        $srch = implode( " OR ", $srch );
        echo $sql = "SELECT * FROM tabel WHERE $srch";
        $qh = mysql_query( $sql ) or die( mysql_error() );
        while ( $row = mysql_fetch_assoc( $qh ) )
        {
            var_dump( $row );
        }
    }
}

echo '<form method="get">
    Search for: <input type="text" name="q"><br>
    Search in categories:<br>
    ';

foreach ( $possibleRows as $row )
{
    echo "<input type=\"checkbox\" name=\"srch[]\" value=\"$row\"> $row<br>";
}
   
echo '<input type="hidden" name="doit" value="1"><input type="submit" name="sbmit" value="Search"></form>';

?>

?
Avatar billede Slettet bruger
23. januar 2007 - 12:40 #3
Undskyld min ukorrekthed. Den skal søge over flere tabeller.

Men ellers ser det rigtigt nok ud, coderdk! Men hvis der ikke er valgt en tabel, så skal den søge i allesammen! - og under resultaterne skal den jo så fortælle hvilken tabel det pågældende resultat kommer fra.
Avatar billede Slettet bruger
23. januar 2007 - 12:48 #4
Og hvordan kan jeg fikse så jeg kan fortælle hvilke felter den må søge i, og så den ikke melder fejl hvis et felt ikke eksisterer i en tabel?
Avatar billede coderdk Praktikant
23. januar 2007 - 13:08 #5
<?php

$possibleRows = array(
        "film" => array( "felt1", "felt2" )
        ,"billeder" => array( "felt3", "felt4" )
        ,"spil" => array( "felt5", "felt6" )
        ,"brugere" => array( "felt7", "felt8" )
    );

if ( !empty( $_GET['doit'] ) )
{
    $srch = array();
    $targ = ( empty( $_GET['srch'] )
            || !is_array( $_GET['srch'] )
            || count( $_GET['srch'] ) == 0
                ?
                $_GET['srch']
                : array_keys( $possibleRows ) );
    $searchFor = mysql_escape_string( $_GET['q'] );
    foreach ( $possibleRows as $table => $fields )
    {
        if ( in_array( $table, $targ ) )
        {
            foreach ( $fields as $field )
            {
                $srch[] = "$table.$field LIKE '%$searchFor%'";
            }
        }
    }
    $srch = implode( " OR ", $srch );
    $sql = "SELECT * FROM tabel WHERE $srch";
    $qh = mysql_query( $sql ) or die( mysql_error() );
    while ( $row = mysql_fetch_assoc( $qh ) )
    {
        var_dump( $row );
    }
}

echo '<form method="get">
    Search for: <input type="text" name="q"><br>
    Search in categories:<br>
    ';

foreach ( $possibleRows as $row => $dummy )
{
    echo "<input type=\"checkbox\" name=\"srch[]\" value=\"$row\"> $row<br>";
}
 
echo '<input type="hidden" name="doit" value="1"><input type="submit" name="sbmit" value="Search"></form>';

?>
Avatar billede Slettet bruger
23. januar 2007 - 13:19 #6
Det ser godt ud, men hvad skal 'tabel' byttes ud med?

$sql = "SELECT * FROM tabel WHERE $srch";
Avatar billede coderdk Praktikant
23. januar 2007 - 13:19 #7
En af de andre tabeller burde gøre det...
Avatar billede Slettet bruger
23. januar 2007 - 13:27 #8
Kan man gøre så et af angivne felter bliver DÈT felt som der udskrives med?

Det er fordi jeg skal bruge det til både at søge blandt brugere og nyheder. Så hvis nu det er et resultat fra brugerne skal det være 'brugernavn' og hvis det er fra nyhederne skal det være 'titel'.
Avatar billede coderdk Praktikant
23. januar 2007 - 13:28 #9
Du kan vel bare undersøge hvad der er i den række der bliver hentet ud - Evt. behandle hver tabel forskelligt.
Avatar billede Slettet bruger
23. januar 2007 - 13:29 #10
Hvordan? Og hvordan får jeg udskrevet hvilken tabel mit resultat kom fra?
Avatar billede coderdk Praktikant
23. januar 2007 - 14:05 #11
Hvis brugertabellen har feltet brugerid så er det vel ikke null hvis det er et resultat fra den ;)
Avatar billede Slettet bruger
28. januar 2007 - 23:38 #12
Hvordan sørger jeg for at den søger i alle de mulige tabeller hvis ingen specielle er krydset af?
Avatar billede coderdk Praktikant
28. januar 2007 - 23:46 #13
Det troede jeg min sidste kode gjorde, men ret:

    $targ = ( empty( $_GET['srch'] )
            || !is_array( $_GET['srch'] )
            || count( $_GET['srch'] ) == 0
                ?
                $_GET['srch']
                : array_keys( $possibleRows ) );

til:

    $targ = ( empty( $_GET['srch'] )
            || !is_array( $_GET['srch'] )
            || count( $_GET['srch'] ) == 0
                ?
                array_keys( $possibleRows )
                : $_GET['srch'] );

Så burde det virke
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