Help - Search - Members - Calendar
Full Version: Search in DB with PHP
ieXbeta Board > Tech > Developer Center
Dutch2005
well In a previous tread i had some difficulties with a catalog, however, its still missing 1 feature...

a SEARCH function...

situation...

i already created the database...
QUOTE

ID int(5)
rubriek varchar(20)
schrijver varchar(80)
titel varchar(80)
jaar_uitgave int(4)
druk int(4)
herkomst varchar(80)
bijzonderheden longtext
prijs varchar(7)


Thats the layout of the database

zoeken2.php
CODE

<?PHP
    ////////////////////////////////////////////////
    // Script: DBsearch
    //
    // Door: Pieter van Linschoten
    // Datum: Zondag 11 maart 2006
    // Website: www.lapidi.nl
    // Tevens origineel beschikbaar:  www.phphulp.nl
    // Email: 'webmaster @ lapidi . nl'
    // Rechten: GNU General Public Licence
    // Download: www.lapidi.nl
    // Voorbeeld: www.lapidi.nl // tijdelijk: www.baracasino.com/new/zoeken2.php
    ////////////////////////////////////////////////

    /* BIJBEHORENDE TABEL:
    CREATE TABLE `teksten` (
      id smallint(11) NOT NULL auto_increment,
      tekst longtext NOT NULL,
      titel varchar(255) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT;
    */


// DATABASE CONNECTION. VUL HIER JE EIGEN GEGEVENS IN!
$db = Array();
$db['db'] = "boekjes";                    // DE DATABASE
$db['user'] = "boekjes";                // GEBRUIKERSNAAM
$db['pass'] = "b03q";                // WACHTWOORD
$db['host'] = "mysql15.servage.net";    // HOST

if (!mysql_select_db($db['db'],mysql_connect($db['host'], $db['user'], $db['pass']))){
    echo "Database connectie mislukt.";
    exit();
}

// VUL HIER JOUW PERSOONLIJKE INSTELLINGEN IN.
$naam = 'Corriovallum Boeken'; // MINIMAAL 6 LETTERS (NAAM DIE BOVEN DE ZOEKMACHINE KOMT)
$displaystyle = '1'; // ORIGINELE STYLE LATEN ZIEN? 1 = JA, IETS ANDERS IS NEE.
$nextpage = 'catalogus.php'; // PAGINA WAAR DE LINKS VAN DE ZOEKRESULTATEN HEEN VERWIJZEN

// LEUK GRAPJE IN HET SCRIPT :)
function google($var)
{
    if(strlen($var) >= 6){
        for($i=0;$i<(strlen($var)-3);$i++){
            $digit = substr($var,$i,1);
            switch($i){
                case 0: $color = "#0000FF";break;
                case 1: $color = "#FF0000";break;
                default: $color = "#EEEE00";break;
            }
            
            $str .= "<FONT COLOR='" . $color . "'>" . $digit . "</FONT>";    
        }    
        $str .= "<FONT COLOR='#0000FF'>" . substr($var,-3,1) . "</FONT>";
        $str .= "<FONT COLOR='#00FF00'>" . substr($var,-2,1) . "</FONT>";
        $str .= "<FONT COLOR='#FF0000'>" . substr($var,-1,1) . "</FONT>";
        $str = "<b>" . $str . "</b>";
    }
    return $str;
}

// DE ZOEKWOORDEN VETGEDRUKT MAKEN
function search_result($tekst,$str)
{
    $replace = strrev($str);
    $tekst = str_replace($str,"<b>".$replace."</b>",$tekst); // STRING OMDRAAIEN, OMDAT DEZE AND
    $tekst = str_replace($replace,"<b>".$str."</b>",$tekst);
    return $tekst;
}

// ORGINELE STYLE SHEET (LAYOUT)
// (DIT KAN WORDEN WEGGEHAALD ZONDER DAT HET DE WERKING VAN HET SCRIPT BEINVLOED){
if($displaystyle == '1'){
    $style  = "<style>\n";
    $style .= "body{\nbackground-color:#F4F4F4;\nfont-family:verdana;\nfont-size:8pt;\n}\n";
    $style .= "table{\n\nbackground-color:#FFFFFF;\nfont-family:verdana;\nfont-size:8pt;\nborder-collapse: collapse;\n}\n";
    $style .= "table.search{\nborder: 1px solid #000000;\n}\n";
    $style .= "input,select{\nfont-family:verdana;\nfont-size:8pt;\npadding:0px;\n}\n";
    $style .= "tr.header{\ncolor:#ffffff;\nbackground-color:#99CCFF;\n}\n";
    $style .= "</style>";
    echo $style;
}
// }

// BEGIN BEREKENING TIJD NODIG VOOR ZOEKEN
$time_start = microtime(true);
?>
<FORM METHOD=GET ACTION="zoeken2.php">

<TABLE class='search'>
<TR class='header'>
    <TD colspan='2' align='center'><B><?=google($naam)?>-Zoeken</B></TD>    
</TR>

<TR>
    <TD>Zoeken:</TD>
    <TD><INPUT TYPE="text" NAME="zoek" value="<?=htmlspecialchars($_GET['zoek']);?>">&nbsp;<INPUT TYPE="submit" value='zoek'></TD>
</TR>
<TR>
    <TD>tekst</TD>
    <TD>
        <SELECT NAME="position">
            <option value="middle">bevat</option>
            <option value="start">begint met</option>
            <option value="end">eindigd op</option>
        </SELECT> zoekwoord
    </TD>
</TR>
<TR>
    <TD>Resultaten</TD>
    <TD>
        <SELECT NAME="result">
            <option value="10">10 per pagina</option>
            <option value="20">20 per pagina</option>
            <option value="30">30 per pagina</option>
            <option value="40">40 per pagina</option>
            <option value="50">50 per pagina</option>
        </SELECT></TD>
</TR>
</TABLE>
</FORM>
<?PHP
    // KIJKEN OF ER WAARDEN ZIJN
    if(!empty($_GET['zoek']) && isset($_GET['position'])){
        
        // CONTROLE VAN DE 'GET' WAARDEN
        $_GET['zoek'] = htmlspecialchars($_GET['zoek']);

        if(!is_numeric($_GET['result']) || !isset($_GET['result'])){
            $_GET['result'] = '10';
        }
        if(!is_numeric($_GET['start']) || !isset($_GET['result'])){
            $_GET['start'] = '0';
        }

        // ZOEK-BEREDENERING
        switch($_GET['position']){
            case 'start':
                $opdracht = $_GET['zoek'] . '%';
                $text='beginnen met de woorden <B>' . $_GET['zoek'] . '</B>';
            break;
            case 'end':
                $opdracht = '%' . $_GET['zoek'];
                $text='eindigen op de woorden <B>' . $_GET['zoek'] . '</B>';
            break;
            case 'middle':
                $opdracht = '%' . $_GET['zoek'] . '%';
                $text='de woorden <B>' . $_GET['zoek'] . '</B> bevatten';
            break;
            default:
                $opdracht = '%' . $_GET['zoek'] . '%';
                $text='de woorden <B>' . $_GET['zoek'] . '</B> bevatten';
            break;
        }

        echo "<p>U zoekt naar teksten die " . $text . ". Er worden <B>" . $_GET['result'] . "</B> zoekresultaten per pagina weergeven</p>";
    
        // SELECTIE VAN DE TEKSTEN UIT DE DATABASE
        $sql = "SELECT * FROM 'overzicht' WHERE * LIKE '" . $opdracht . "' OR tekst LIKE '" . $opdracht . "' ";
        $aantal = mysql_num_rows(mysql_query($sql));
        
        // GEEN RESULTATEN
        if($aantal < 1){
            echo "<p><I>Er zijn geen zoekresultaten in de database van " . google($naam) . " van teksten die " . $text . "</I></p><p>Suggestie:<br>* Zorg ervoor dat alle woorden goed gespeld zijn.<br>* Probeer andere zoektermen.<br>* Maak de zoektermen algemener.<br>* Gebruik minder zoekwoorden.</p>";
        }else{
            // HET RESULTAAT

            // BEREKENINGEN
            $pages = ceil($aantal/$_GET['result']);
            $limit = "ORDER BY titel ASC LIMIT " . $_GET['start'] . "," . ($_GET['start'] + $_GET['result']);
            $res = mysql_query($sql . " " . $limit);
            
            echo "<p>Er zijn <B>" . $aantal . "</B> zoekresultaten.</p>";

            //ZOEKRESULTATEN WEERGEVEN
            while($row = mysql_fetch_array($res)){
                
                // DE TITEL
                echo "<p><A HREF='".$nextpage."?tid=" . $row['id'] . "'>".search_result($row['titel'],$_GET['zoek']) . "</a><br>";
                
                $row['tekst'] = search_result($row['tekst'],$_GET['zoek']);

                // WEERGEEF EERSTE 70 WOORDEN VAN DE TEKST
                if(strlen($row['tekst']) > 70){ $dots = '..';}
                echo "<i>" . substr($row['tekst'],0,70) . "</i>".$dots."<br>";
                
                // LAATSTE 70 WOORDEN WEERGEVEN, INDIEN TEKST MEER DAN 140 TEKENS HEEFT
                if(strlen($row['tekst']) > 140){
                    echo ".. <i>" . substr($row['tekst'],-70,70) . "</i>";
                }
                echo "</p>";
            }


            // VORIGE PAGINA LINK
            $start =  $_GET['start'] - $_GET['result'];
            if($start <= 0){
                echo "<FONT COLOR='#DBDBDB'><< Vorige</FONT> ";
            }else{
                echo "<A HREF='zoeken2.php?zoek=" . $_GET['zoek'] . "&position=" . $_GET['position'] . "&start=" . $start . "&result=" . $_GET['result'] . "'><< Vorige</A> ";
            }
                
            echo "&nbsp;<A HREF='zoeken2.php?zoek=" . $_GET['zoek'] . "&position=" . $_GET['position'] . "&start=" . 0 . "&result=" . $_GET['result'] . "'>" . (1) . "</A>&nbsp;\n";

            // PAGINA NUMMERING
            for($i=1; $i<($pages);$i++){
                $start = $_GET['result'] * $i;
                echo "&nbsp;<A HREF='zoeken2.php?zoek=" . $_GET['zoek'] . "&position=" . $_GET['position'] . "&start=" . $start . "&result=" . $_GET['result'] . "'>" . ($i+1) . "</A>&nbsp;\n";
            }

            // VOLGENDE PAGINA LIMK
            $start = $_GET['result'] + $_GET['start'];
            if($start >= $aantal){
                echo " <FONT COLOR='#DBDBDB'>Volgende >></FONT>\n";
            }else{
                echo " <A HREF='zoeken2.php?zoek=" . $_GET['zoek'] . "&position=" . $_GET['position'] . "&start=" . $start . "&result=" . $_GET['result'] . "'>Volgende >></A>\n";
            }
        }
    
    // BEREKENING VAN DE TIJD NODIG VOOR ZOEKRESULTAAT
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo "<p><FONT COLOR='DBDBDB'>De " . google($naam) . " zoekmachine vond <B>" . number_format($aantal,0,'','.') . "</B> zoekresultaten in " . $time . " seconden.</FONT></p>";

    }
?>



problem: it will not find anything i want to look for (yes there is stuff in the db so i can check ;-))
problem2: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /mounted-storage/home20a/sub001/sc20147-CFJH/coriovallumboeken.nl/zoeken2.php on line 162


I think problem1 is due to problem 2, already DISABLED safe mode & register globals on server so i guess thats NOT the issue...


any suggestions on what the problem might be? (and perhaps a sullution?)
quantumAlpha
in re your PM, no problem

i know from experience mysql_num_rows() is very picky but i forget why. im currently moving to college this weekend, but when im unpacked, ill have a look at the backup from my old site and see what i did to get it to work
President Killer
Wouldn't a FULLTEXT search be more appropriate for what you want to do?

Google Results:

http://www.google.com/search?hl=en&q=F...G=Google+Search
Dutch2005
QUOTE(quantumAlpha @ Aug 19 2006, 00:16) *

in re your PM, no problem

i know from experience mysql_num_rows() is very picky but i forget why. im currently moving to college this weekend, but when im unpacked, ill have a look at the backup from my old site and see what i did to get it to work



thnx lick.gif biggrin.gif
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2008 Invision Power Services, Inc.