SlideShare a Scribd company logo
How to build a PHP Search Engine
                                                                                                               Kiril Iliev




How to build a PHP Search Engine
Introduction or a tale of how easy a search engine could work
Five years ago your site may have had five or six pages. However, over the time it has grown and one day
you wake up with 2 GB of content, more than a thousand links and no way to sort them by relevance. You
need a way for you and your visitors to get information about your services and products faster. A search
engine could help you and your site visitors find that precious piece of information on your extensively
growing site.

Anyway, let us explain how a search engine works in general. Typically, a search engine works by sending
out a ‘spider‘ to fetch as many documents as possible. Then another program, called an indexer, reads
these documents and creates an index based on the words contained in each document. Each search
engine uses a proprietary algorithm to create its indices such that, ideally, only relevant results are returned
for each query.

In the following tutorial we are going to create a PHP search engine with a MySQL database. We are
building our search engine on PHP 5.2.3. PHP 5.2.3 includes the latest additions such as embedded SQLite
database, support for the MySQL 4.1 client library with the introduction of the mysqli extension, etc.




PHP Search Engine

Why should we use MySQL? Well, this pretty gem will help us organize, fetch and store our data in a quite
simple way, so that we will not need to create our own spider and indexer. MySQL would do the hard work
for us!

Note: For information on how to install and configure MySQL on Windows you can refer to Gareth Downes-
Powell’s article “Installing MySQL on a Windows PC”.
For installing PHP 5.x.x on Windows you might want to refer to Allan Kent’s Article “Installing PHP 5 under 
Windows”.

Ok, assuming that you have already installed PHP, MySQL with the appropriate server platform of your
choice, IIS or Apache, you have a fully operational web server. Now, let’s get into the details.

For the search engine we are going to build in this tutorial, I chose to use a table with 3 columns named ID,
title, and article, where I have stored the information the user will be searching for. You can enter some data
to your table or even make your own table. The ID field is the primary key for the table, while title and article
are fields in which we plan to search. To make it easier for you, I`ve prepared a query to create the table.
You just need to copy and paste the following code into the MySQL interface in a database. In order to do
that, access your PHPMyAdmin from your favourite browser, then select your database and table
respectively. There you should notice a tab named “SQL”. You have to paste the following code there:


                                   Copyright © 2007 DMXzone.com All Rights Reserved
                                           To get more go to DMXzone.com
                                                   Page 1 of 10
How to build a PHP Search Engine
                                                                                                               Kiril Iliev




CREATE TABLE `news` (
        `id` tinyint(4) NOT NULL auto_increment,
        `title` varchar(200) NOT NULL default ‘‘,
        `article` text NOT NULL,
        UNIQUE KEY `id` (`id`),
        FULLTEXT KEY `title` (`title`,`article`)
             ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Under the “Browse” tab you can see the entries in your table. In order to insert new entries go to “Insert” tab
and add new values to the fields Title and Article. Surely, you can extend your table and add additional
fields, or change the type of the current fields, in a whole to change the entire table for your own
convenience.

How are we going to proceed? We will start creating the search form, then setting up our connection to the
database, go through the search function itself, and finally test our search engine. In addition, we are going
to design additional features such as paging and displaying the search time.



Beginning of the search page…
Firstly let’s create our search page with a form where site visitors will enter keywords to search content. Let’s
open our favourite web editor and create a new page. Then insert a new form called searchbox and a
button with value Search. Finally save the page as Search.php. You may want to use the POST method
instead of the GET method for your form since it is more secure. For this tutorial I chose using the GET method
since this allows me to check if the search engine is working properly.

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=“http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=utf-8” />
<title>Untitled Document</title>
</head>

<body>
<h1>Search Engine with PHP</h1>
<form method=“get” action=“ “>
    <input type=“text” name=“search_term” title=“Search…” value=“Search...”>
    <input type=“submit” name=“search” title=“Search Now!
    “value=“Search” class=“searchbutton” />
</form>
</body>
</html>

As you can see this is just simple code for a form with a text field and a button.

Connecting...

Now let’s make the connection string. Open a new PHP document, name it connectionstring.php and save
it in the same directory in which Search.php is located. For example, you can name it
MySearchEngineWithPHP. Later on you will upload the entire folder to your server. Add the following code to
connectionstring.php:



                                   Copyright © 2007 DMXzone.com All Rights Reserved
                                           To get more go to DMXzone.com
                                                   Page 2 of 10
How to build a PHP Search Engine
                                                                                                             Kiril Iliev




<?php
      $hostname_MyConnectionPHP = “localhost”;
      $database_MyConnectionPHP = “database”;
      $username_MyConnectionPHP = “usrname”;
      $password_MyConnectionPHP = “mypassword”;
      $connections = mysql_connect($hostname_MyConnectionPHP,
$username_MyConnectionPHP, $password_MyConnectionPHP) or die ( “Unabale to connect to
the database” );
?>

Replace “database”, “usrname” and “mypassword” with the respective data that you use for the MySQL
database.

Time to search!

The following code is the core of our search engine. We will calculate the search time using a function,
make a database connection with another function, and finally we will check for matches with an
appropriate algorithm running a query to select a table to look for matches. Add the following code to your
Search.php page:

<?PHP
function getmicrotime()
{
    list($usec, $sec) = explode(“ “, microtime());
    return ((float)$usec + (float)$sec);
}

$connection_string = dirname(__FILE__) . “/connectionstring.php”;

require_once($connection_string);

mysql_select_db(“test”) or die ( ‘Unable to select database.’ );

$RESULTS_LIMIT=10;

if(isset($_GET[‘search_term’]) && isset($_GET[‘search_button’]))
{
      $search_term = $_GET[‘search_term’];

    if(!isset($first_pos))
    {
        $first_pos = “0”;
    }

    $start_search = getmicrotime();
    $sql_query = mysql_query(“SELECT * FROM news WHERE MATCH(title,article)
AGAINST(‘$search_term’)”);

many mathces (too many matches cause returning of 0 results)
    if($results = mysql_num_rows($sql_query) != 0)
            {
                $sql = “SELECT * FROM news WHERE MATCH(title,article)
AGAINST(‘$search_term’) LIMIT $first_pos, $RESULTS_LIMIT”;
                  $sql_result_query = mysql_query($sql);

              }
                                 Copyright © 2007 DMXzone.com All Rights Reserved
                                         To get more go to DMXzone.com
                                                 Page 3 of 10
How to build a PHP Search Engine
                                                                                                               Kiril Iliev




     else
               {
                  $sql = “SELECT * FROM news WHERE (title LIKE
‘%”.mysql_real_escape_string($search_term).”%’ OR article LIKE ‘%”.$search_term.”%’) “;
                  $sql_query = mysql_query($sql);
                  $results = mysql_num_rows($sql_query);
                  $sql_result_query = mysql_query(“SELECT * FROM news WHERE (title LIKE
‘%”.$search_term.”%’ OR article LIKE ‘%”.$search_term.”%’) LIMIT $first_pos,
$RESULTS_LIMIT “);
            }

     $stop_search = getmicrotime();
     $time_search = ($stop_search - $start_search);
}
?>

Let’s take a closer look at the code. On the second line we initialize function to calculate the time for the
search.
The require_once function initializes a connection to the database – we simply call the connectionstring.php
file that we created earlier. With the line “mysql_select_db(“test”) or die ( ‘Unable to select database.’ );” we
select our database table called test in our case. However, if for some reason a database is not selected the
“die” statement will bring a message that a database is not able to be selected. $RESULTS_LIMIT variable is
used to specify how many results to display per page.

Next we use an “if clause” to check if any phrase or word is set in the search field form. This is done with
$search_query. Then we check if our marker for page listing exists with $first_pos variable – if not we start from
the first page. Then we need to initialize a SQL query – simply with $sql_query. As you may know mysql_query
is a keyword in MySQL. Unfortunately, using that keyword has a major drawback. MySQL does not display
results of the phrases that are found in the database too often as it would display too many results. That is
why we do a second check. The algorithm counts the number of results with the $results variable and if it is
zero we run second query with a standard field search of the table with LIKE %...%.

NOTE: The function mysql_real_escape_string is a standard MySQL function used to check if the entered
value is legal, preventing the injection of malicious MySQL scripts into your database. For example,
somebody could enter an SQL query in your form to change your database. Using mysql_real_escape_string
 will make your search engine and database more secure.

Displaying the results

Now let’s display the results. We are going to use a usual loop where we have saved the first results via the
$results variable. We are arranging everything nicely in tables. That way our results will be separated and
ordered. If no results are found, the page will display the following message:




However, if results are found, the page should look like this:




                                   Copyright © 2007 DMXzone.com All Rights Reserved
                                           To get more go to DMXzone.com
                                                   Page 4 of 10
How to build a PHP Search Engine
                                                                                                            Kiril Iliev




OK, so back to Search.php where we have inserted our form. Modify the code as follows:

<?PHP
if($results != 0)
{
?>
   <table border=“0” cellspacing=“2” cellpadding=“2”>
  <tr>
    <td width=“47%”>Results for <?PHP echo “<i><b><font
color=#000000>“.$search_term.”</font></b></i> “; ?></td>
    <td width=“53%” align=“right” height=“22”>Results <b>
      <?PHP echo ($first_pos+1).” - “;
      if(($RESULTS_LIMIT + $first_pos) < $results) echo ($RESULTS_LIMIT + $first_pos);
      else echo $results ; ?>
    </b>
      out of <b><?PHP echo $results; ?></b>
      for(<b><?PHP echo sprintf(“%01.2f”, $time_search); ?></b>)
      seconds </td>
  </tr>
  <tr>
    <form action=““ method=“GET”>
      <td colspan=“2” align=“center”> <input name=“search_term” type=“text”
value=“<?PHP echo $search_term; ?>“ size=“40”>
        <input name=“search_button” type=“submit” value=“Search”> </td>
    </form>
  </tr>
  <?PHP
    while($row = mysql_fetch_array($sql_result_query))
    {
    ?>
      <tr align=“left”>
        <td colspan=“2”><?PHP echo $row[‘title’]; ?></td>
      </tr>
  <?PHP
    }
    ?>
</table>
<?PHP
}
elseif($sql_query)
{
?>
<table border=“0” cellspacing=“2” cellpadding=“0”>
    <tr>
        <td align=“center”>No results for   <?PHP echo “<i><b><font
color=#000000>“.$search_term.”</font></b></i> “; ?></td>
    </tr>
    <tr>
                                Copyright © 2007 DMXzone.com All Rights Reserved
                                        To get more go to DMXzone.com
                                                Page 5 of 10
How to build a PHP Search Engine
                                                                                                              Kiril Iliev




        <form action=““ method=“GET”>
        <td colspan=“2” align=“center”>
            <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“>
            <input name=“search_button” type=“submit” value=“Search”>
        </td>
        </form>
    </tr>
</table>
<?PHP
}
?>


Sorting into pages

Our final step is to show the number of result pages. We are calculating how many results the SQL query has
returned. We start by calculating the first position in order to place it in relevance. If the maximum number of
results is exceeded the algorithm creates a forward button for the user to switch to the next page. We
already have defined the maximum number per page via $RESULTS_LIMIT. If the user goes to the second
page of the results he can go back and check previous results with a back button. Well, these so called
buttons are not really buttons – they are simple “>>“ and “<<“ signs. Of course feel free to add your own
buttons, or even some flash images.

I am also using a PHP function stripslashes in order to escape some quotes. Why? I use it to clean the results
from the quotes in the MySQL query. That way the algorithm will not fail if any quotes are inserted.

We can do all this with the following code:
<?PHP
if($first_pos > 0)
{
  $back=$first_pos-$RESULTS_LIMIT;
  if($back < 0)
  {
    $back = 0;
  }
  echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$back’
></a>“;
}

if($results>$RESULTS_LIMIT)
{
  $sites=intval($results/$RESULTS_LIMIT);
  if($results%$RESULTS_LIMIT)
  {
    $sites++;
  }
}

for ($i=1;$i<=$sites;$i++)
{
  $fwd=($i-1)*$RESULTS_LIMIT;
  if($fwd == $first_pos)
  {
      echo “<a
href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd
‘><b>$i</b></a> | “;

                                  Copyright © 2007 DMXzone.com All Rights Reserved
                                          To get more go to DMXzone.com
                                                  Page 6 of 10
How to build a PHP Search Engine
                                                                                                                  Kiril Iliev




  }
  else
  {
      echo “<a
href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘>$i</a> |
“;
  }
}

if(isset($first_pos) && $first_pos < $results-$RESULTS_LIMIT)
{
  $fwd=$first_pos+$RESULTS_LIMIT;
  echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘
> >></a>“;
  $fwd=$results-$RESULTS_LIMIT;
}
?>
    </td>
  </tr>
</table>

This is the final piece of code in this article.

The next code block contains the entire code for the search engine. I’ve inserted comments so that you can
track the process:

<?PHP
function getmicrotime()
{
    list($usec, $sec) = explode(“ “, microtime());
    return ((float)$usec + (float)$sec);
}
//initializing connection to the database
$connection_string = dirname(__FILE__) . “/connectionstring.php”;
require_once($connection_string);
//selecting table
mysql_select_db(“test”) or die ( ‘Unable to select database.’ );
//max number of results on the page
$RESULTS_LIMIT=10;
if(isset($_GET[‘search_term’]) && isset($_GET[‘search_button’]))
{
      $search_term = $_GET[‘search_term’];
    if(!isset($first_pos))
    {
        $first_pos = “0”;
    }
    $start_search = getmicrotime();
      //initializing MySQL Quary
    $sql_query = mysql_query(“SELECT * FROM news WHERE MATCH(title,article)
AGAINST(‘$search_term’)”);
    //additional check. Insurance method to re-search the database again in case of too
many matches (too many matches cause returning of 0 results)
    if($results = mysql_num_rows($sql_query) != 0)
            {
                $sql = “SELECT * FROM news WHERE MATCH(title,article)
AGAINST(‘$search_term’) LIMIT $first_pos, $RESULTS_LIMIT”;
                  $sql_result_query = mysql_query($sql);
                                      Copyright © 2007 DMXzone.com All Rights Reserved
                                              To get more go to DMXzone.com
                                                      Page 7 of 10
How to build a PHP Search Engine
                                                                                                       Kiril Iliev




           }
   else
           {
                  $sql = “SELECT * FROM news WHERE (title LIKE
‘%”.mysql_real_escape_string($search_term).”%’ OR article LIKE ‘%”.$search_term.”%’) “;
                  $sql_query = mysql_query($sql);
                  $results = mysql_num_rows($sql_query);
                  $sql_result_query = mysql_query(“SELECT * FROM news WHERE (title LIKE
‘%”.$search_term.”%’ OR article LIKE ‘%”.$search_term.”%’) LIMIT $first_pos,
$RESULTS_LIMIT “);
            }
    $stop_search = getmicrotime();
      //calculating the search time
    $time_search = ($stop_search - $start_search);
}
?>
<?PHP
if($results != 0)
{
?>
   <!-- Displaying of the results -->
<table border=“0” cellspacing=“2” cellpadding=“2”>
  <tr>
    <td width=“47%”>Results for <?PHP echo “<i><b><font
color=#000000>“.$search_term.”</font></b></i> “; ?></td>
    <td width=“53%” align=“right” height=“22”>Results <b>
      <?PHP echo ($first_pos+1).” - “;
      if(($RESULTS_LIMIT + $first_pos) < $results) echo ($RESULTS_LIMIT + $first_pos);
      else echo $results ; ?>
    </b>
      out of <b><?PHP echo $results; ?></b>
      for(<b><?PHP echo sprintf(“%01.2f”, $time_search); ?></b>)
      seconds </td>
  </tr>
  <tr>
    <form action=““ method=“GET”>
      <td colspan=“2” align=“center”> <input name=“search_term” type=“text”
value=“<?PHP echo $search_term; ?>“ size=“40”>
        <input name=“search_button” type=“submit” value=“Search”> </td>
    </form>
  </tr>
  <?PHP
    while($row = mysql_fetch_array($sql_result_query))
    {
    ?>
      <tr align=“left”>
        <td colspan=“2”><?PHP echo $row[‘title’]; ?></td>
      </tr>
  <?PHP
    }
    ?>
</table>
<?PHP
}
//if nothing is found then displays a form and a message that there are nor results for
the specified term
elseif($sql_query)
{
                           Copyright © 2007 DMXzone.com All Rights Reserved
                                   To get more go to DMXzone.com
                                           Page 8 of 10
How to build a PHP Search Engine
                                                                                                       Kiril Iliev




?>
<table border=“0” cellspacing=“2” cellpadding=“0”>
    <tr>
        <td align=“center”>No results for   <?PHP echo “<i><b><font
color=#000000>“.$search_term.”</font></b></i> “; ?></td>
    </tr>
    <tr>
        <form action=““ method=“GET”>
        <td colspan=“2” align=“center”>
            <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“>
            <input name=“search_button” type=“submit” value=“Search”>
        </td>
        </form>
    </tr>
</table>
<?PHP
}
?>
<table width=“300” border=“0” cellspacing=“0” cellpadding=“0”>
      <?php
      if (!isset($_GET[‘search_term’])) { ?>
    <tr>
        <form action=““ method=“GET”>
        <td colspan=“2” align=“center”>
            <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“>
            <input name=“search_button” type=“submit” value=“Search”>
        </td>
        </form>
    </tr>
    <?php
      }
      ?>
  <tr>
    <td align=“right”>
<?PHP
//displaying the number of pages where the results are sittuated
if($first_pos > 0)
{
  $back=$first_pos-$RESULTS_LIMIT;
  if($back < 0)
  {
    $back = 0;
  }
  echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$back’
></a>“;
}
if($results>$RESULTS_LIMIT)
{
  $sites=intval($results/$RESULTS_LIMIT);
  if($results%$RESULTS_LIMIT)
  {
    $sites++;
  }
}
for ($i=1;$i<=$sites;$i++)
{
  $fwd=($i-1)*$RESULTS_LIMIT;
  if($fwd == $first_pos)
                           Copyright © 2007 DMXzone.com All Rights Reserved
                                   To get more go to DMXzone.com
                                           Page 9 of 10
How to build a PHP Search Engine
                                                                                                               Kiril Iliev




  {
      echo “<a
href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd
‘><b>$i</b></a> | “;
  }
  else
  {
      echo “<a
href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘>$i</a> |
“;
  }
}
if(isset($first_pos) && $first_pos < $results-$RESULTS_LIMIT)
{
  $fwd=$first_pos+$RESULTS_LIMIT;
  echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘
> >></a>“;
  $fwd=$results-$RESULTS_LIMIT;
}
?>
    </td>
  </tr>
</table>

Do not forget to upload the files connectionstring.php and Search.php in the same directory on your server.

Preview your page and test it. Just open it in your favourite web browser and type in some words. Make sure
that your table is filled with some of these words otherwise it will return you that there are no results found.

Conclusion
That’s all we need. Our PHP search engine is running smoothly, fast and accurate! We might add some
JavaScript functions from an external file, as well some brief CSS rules to make it fancier and give it a
pleasant look. In addition, you may want to try combining it with one of our extensions – Ajax Autocomplete.
Once you bind the extension to the input form in the code we have just created, it will add auto-complete
functionality to the PHP Search Engine. When a user starts entering a phrase a list of suggested search terms
will be displayed. Very nice, right?




                                   Copyright © 2007 DMXzone.com All Rights Reserved
                                           To get more go to DMXzone.com
                                                   Page 10 of 10

More Related Content

What's hot

How to use MongoDB with CakePHP
How to use MongoDB with CakePHPHow to use MongoDB with CakePHP
How to use MongoDB with CakePHP
ichikaway
 
Spiffy Applications With JavaScript
Spiffy Applications With JavaScriptSpiffy Applications With JavaScript
Spiffy Applications With JavaScript
Mark Casias
 
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHPPHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
iMasters
 
Tips of CakePHP and MongoDB - Cakefest2011 ichikaway
Tips of CakePHP and MongoDB - Cakefest2011 ichikaway Tips of CakePHP and MongoDB - Cakefest2011 ichikaway
Tips of CakePHP and MongoDB - Cakefest2011 ichikaway
ichikaway
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
Jeremy Kendall
 
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
Codemotion
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
Jeremy Kendall
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
Jeremy Kendall
 
Swift Summit 2017: Server Swift State of the Union
Swift Summit 2017: Server Swift State of the UnionSwift Summit 2017: Server Swift State of the Union
Swift Summit 2017: Server Swift State of the Union
Chris Bailey
 
Assetic (OSCON)
Assetic (OSCON)Assetic (OSCON)
Assetic (OSCON)
Kris Wallsmith
 
Ch7(publishing my sql data on the web)
Ch7(publishing my sql data on the web)Ch7(publishing my sql data on the web)
Ch7(publishing my sql data on the web)
Chhom Karath
 
REST Web API with MongoDB
REST Web API with MongoDBREST Web API with MongoDB
REST Web API with MongoDB
MongoDB
 
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
Ricardo Signes
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and Python
PiXeL16
 
Ruby gems
Ruby gemsRuby gems
Ruby gems
Papp Laszlo
 
Build REST APIs like a Jedi with Symfony2
Build REST APIs like a Jedi with Symfony2Build REST APIs like a Jedi with Symfony2
Build REST APIs like a Jedi with Symfony2
Almog Baku
 
Advanced Json
Advanced JsonAdvanced Json
Advanced Json
guestfd7d7c
 
Hackbattle 2013 Walkthrough (Nasty Salon V2)
Hackbattle 2013 Walkthrough (Nasty Salon V2)Hackbattle 2013 Walkthrough (Nasty Salon V2)
Hackbattle 2013 Walkthrough (Nasty Salon V2)
Munir Njiru
 
Fake My Party
Fake My PartyFake My Party
Fake My Party
Tanja Otto
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of Django
Jacob Kaplan-Moss
 

What's hot (20)

How to use MongoDB with CakePHP
How to use MongoDB with CakePHPHow to use MongoDB with CakePHP
How to use MongoDB with CakePHP
 
Spiffy Applications With JavaScript
Spiffy Applications With JavaScriptSpiffy Applications With JavaScript
Spiffy Applications With JavaScript
 
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHPPHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
 
Tips of CakePHP and MongoDB - Cakefest2011 ichikaway
Tips of CakePHP and MongoDB - Cakefest2011 ichikaway Tips of CakePHP and MongoDB - Cakefest2011 ichikaway
Tips of CakePHP and MongoDB - Cakefest2011 ichikaway
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
 
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
 
Swift Summit 2017: Server Swift State of the Union
Swift Summit 2017: Server Swift State of the UnionSwift Summit 2017: Server Swift State of the Union
Swift Summit 2017: Server Swift State of the Union
 
Assetic (OSCON)
Assetic (OSCON)Assetic (OSCON)
Assetic (OSCON)
 
Ch7(publishing my sql data on the web)
Ch7(publishing my sql data on the web)Ch7(publishing my sql data on the web)
Ch7(publishing my sql data on the web)
 
REST Web API with MongoDB
REST Web API with MongoDBREST Web API with MongoDB
REST Web API with MongoDB
 
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
How I Learned to Stop Worrying and Love Email::: The 2007 PEP Talk!!
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and Python
 
Ruby gems
Ruby gemsRuby gems
Ruby gems
 
Build REST APIs like a Jedi with Symfony2
Build REST APIs like a Jedi with Symfony2Build REST APIs like a Jedi with Symfony2
Build REST APIs like a Jedi with Symfony2
 
Advanced Json
Advanced JsonAdvanced Json
Advanced Json
 
Hackbattle 2013 Walkthrough (Nasty Salon V2)
Hackbattle 2013 Walkthrough (Nasty Salon V2)Hackbattle 2013 Walkthrough (Nasty Salon V2)
Hackbattle 2013 Walkthrough (Nasty Salon V2)
 
Fake My Party
Fake My PartyFake My Party
Fake My Party
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of Django
 

Viewers also liked

Purchase process
Purchase processPurchase process
Purchase process
Kiril Iliev
 
Windows azure bcs
Windows azure bcsWindows azure bcs
Windows azure bcs
Kiril Iliev
 
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
Kiril Iliev
 
Final year master thesis presentation
Final year master thesis presentationFinal year master thesis presentation
Final year master thesis presentation
Kiril Iliev
 
PHP Source Code Search with PHP
PHP Source Code Search with PHPPHP Source Code Search with PHP
PHP Source Code Search with PHP
Sotaro Karasawa
 
Purchase process
Purchase processPurchase process
Purchase process
Kiril Iliev
 

Viewers also liked (6)

Purchase process
Purchase processPurchase process
Purchase process
 
Windows azure bcs
Windows azure bcsWindows azure bcs
Windows azure bcs
 
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
 
Final year master thesis presentation
Final year master thesis presentationFinal year master thesis presentation
Final year master thesis presentation
 
PHP Source Code Search with PHP
PHP Source Code Search with PHPPHP Source Code Search with PHP
PHP Source Code Search with PHP
 
Purchase process
Purchase processPurchase process
Purchase process
 

Similar to Build PHP Search Engine

Php interview questions
Php interview questionsPhp interview questions
Php interview questions
sekar c
 
Php session
Php sessionPhp session
Php session
argusacademy
 
Intro to php
Intro to phpIntro to php
Intro to php
Sp Singh
 
Php interview-questions and answers
Php interview-questions and answersPhp interview-questions and answers
Php interview-questions and answers
sheibansari
 
php-mysql-tutorial-part-3
php-mysql-tutorial-part-3php-mysql-tutorial-part-3
php-mysql-tutorial-part-3
tutorialsruby
 
&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/
&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/
&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/
tutorialsruby
 
php-mysql-tutorial-part-3
php-mysql-tutorial-part-3php-mysql-tutorial-part-3
php-mysql-tutorial-part-3
tutorialsruby
 
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />
tutorialsruby
 
PHP Arrays - indexed and associative array.
PHP Arrays - indexed and associative array. PHP Arrays - indexed and associative array.
PHP Arrays - indexed and associative array.
wahidullah mudaser
 
Php interview questions
Php interview questionsPhp interview questions
Php interview questions
subash01
 
Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5
Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5
Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5
Salvatore Iaconesi
 
Creating Operational Redundancy for Effective Web Data Mining
Creating Operational Redundancy for Effective Web Data MiningCreating Operational Redundancy for Effective Web Data Mining
Creating Operational Redundancy for Effective Web Data Mining
Jonathan LeBlanc
 
PHP - Introduction to PHP Date and Time Functions
PHP -  Introduction to  PHP Date and Time FunctionsPHP -  Introduction to  PHP Date and Time Functions
PHP - Introduction to PHP Date and Time Functions
Vibrant Technologies & Computers
 
PHP 2
PHP 2PHP 2
PHP 2
Richa Goel
 
Semalt: 3 Steps To PHP Web Page Scraping Web
Semalt: 3 Steps To PHP Web Page Scraping WebSemalt: 3 Steps To PHP Web Page Scraping Web
Semalt: 3 Steps To PHP Web Page Scraping Web
ilovemyindia18
 
PHP FUNCTIONS
PHP FUNCTIONSPHP FUNCTIONS
PHP FUNCTIONS
Zeeshan Ahmed
 
Php Tutorial
Php TutorialPhp Tutorial
Defeating Cross-Site Scripting with Content Security Policy
Defeating Cross-Site Scripting with Content Security PolicyDefeating Cross-Site Scripting with Content Security Policy
Defeating Cross-Site Scripting with Content Security Policy
Francois Marier
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC Framework
Bo-Yi Wu
 
Php
PhpPhp

Similar to Build PHP Search Engine (20)

Php interview questions
Php interview questionsPhp interview questions
Php interview questions
 
Php session
Php sessionPhp session
Php session
 
Intro to php
Intro to phpIntro to php
Intro to php
 
Php interview-questions and answers
Php interview-questions and answersPhp interview-questions and answers
Php interview-questions and answers
 
php-mysql-tutorial-part-3
php-mysql-tutorial-part-3php-mysql-tutorial-part-3
php-mysql-tutorial-part-3
 
&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/
&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/
&lt;b>PHP&lt;/b>/MySQL &lt;b>Tutorial&lt;/b> webmonkey/programming/
 
php-mysql-tutorial-part-3
php-mysql-tutorial-part-3php-mysql-tutorial-part-3
php-mysql-tutorial-part-3
 
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />
 
PHP Arrays - indexed and associative array.
PHP Arrays - indexed and associative array. PHP Arrays - indexed and associative array.
PHP Arrays - indexed and associative array.
 
Php interview questions
Php interview questionsPhp interview questions
Php interview questions
 
Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5
Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5
Sperimentazioni di Tecnologie e Comunicazioni Multimediali: Lezione 5
 
Creating Operational Redundancy for Effective Web Data Mining
Creating Operational Redundancy for Effective Web Data MiningCreating Operational Redundancy for Effective Web Data Mining
Creating Operational Redundancy for Effective Web Data Mining
 
PHP - Introduction to PHP Date and Time Functions
PHP -  Introduction to  PHP Date and Time FunctionsPHP -  Introduction to  PHP Date and Time Functions
PHP - Introduction to PHP Date and Time Functions
 
PHP 2
PHP 2PHP 2
PHP 2
 
Semalt: 3 Steps To PHP Web Page Scraping Web
Semalt: 3 Steps To PHP Web Page Scraping WebSemalt: 3 Steps To PHP Web Page Scraping Web
Semalt: 3 Steps To PHP Web Page Scraping Web
 
PHP FUNCTIONS
PHP FUNCTIONSPHP FUNCTIONS
PHP FUNCTIONS
 
Php Tutorial
Php TutorialPhp Tutorial
Php Tutorial
 
Defeating Cross-Site Scripting with Content Security Policy
Defeating Cross-Site Scripting with Content Security PolicyDefeating Cross-Site Scripting with Content Security Policy
Defeating Cross-Site Scripting with Content Security Policy
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC Framework
 
Php
PhpPhp
Php
 

More from Kiril Iliev

Sales Process And Mrp
Sales Process And MrpSales Process And Mrp
Sales Process And Mrp
Kiril Iliev
 
Sales Process And Mrp
Sales Process And MrpSales Process And Mrp
Sales Process And Mrp
Kiril Iliev
 
Axapta Interface Guide
Axapta Interface GuideAxapta Interface Guide
Axapta Interface Guide
Kiril Iliev
 
Interface Navigation Intro
Interface Navigation IntroInterface Navigation Intro
Interface Navigation Intro
Kiril Iliev
 
ERP Industrial Planning
ERP  Industrial PlanningERP  Industrial Planning
ERP Industrial Planning
Kiril Iliev
 
Friction Clutch Design
Friction Clutch DesignFriction Clutch Design
Friction Clutch Design
Kiril Iliev
 

More from Kiril Iliev (6)

Sales Process And Mrp
Sales Process And MrpSales Process And Mrp
Sales Process And Mrp
 
Sales Process And Mrp
Sales Process And MrpSales Process And Mrp
Sales Process And Mrp
 
Axapta Interface Guide
Axapta Interface GuideAxapta Interface Guide
Axapta Interface Guide
 
Interface Navigation Intro
Interface Navigation IntroInterface Navigation Intro
Interface Navigation Intro
 
ERP Industrial Planning
ERP  Industrial PlanningERP  Industrial Planning
ERP Industrial Planning
 
Friction Clutch Design
Friction Clutch DesignFriction Clutch Design
Friction Clutch Design
 

Recently uploaded

Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
UI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentationUI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentation
Wouter Lemaire
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
saastr
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
名前 です男
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
Pixlogix Infotech
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
Tatiana Kojar
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
Edge AI and Vision Alliance
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
Quotidiano Piemontese
 
Recommendation System using RAG Architecture
Recommendation System using RAG ArchitectureRecommendation System using RAG Architecture
Recommendation System using RAG Architecture
fredae14
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Tosin Akinosho
 
OpenID AuthZEN Interop Read Out - Authorization
OpenID AuthZEN Interop Read Out - AuthorizationOpenID AuthZEN Interop Read Out - Authorization
OpenID AuthZEN Interop Read Out - Authorization
David Brossard
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
ssuserfac0301
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
Zilliz
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Wask
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
kumardaparthi1024
 

Recently uploaded (20)

Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
 
UI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentationUI5 Controls simplified - UI5con2024 presentation
UI5 Controls simplified - UI5con2024 presentation
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
 
Recommendation System using RAG Architecture
Recommendation System using RAG ArchitectureRecommendation System using RAG Architecture
Recommendation System using RAG Architecture
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
 
OpenID AuthZEN Interop Read Out - Authorization
OpenID AuthZEN Interop Read Out - AuthorizationOpenID AuthZEN Interop Read Out - Authorization
OpenID AuthZEN Interop Read Out - Authorization
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
 

Build PHP Search Engine

  • 1. How to build a PHP Search Engine Kiril Iliev How to build a PHP Search Engine Introduction or a tale of how easy a search engine could work Five years ago your site may have had five or six pages. However, over the time it has grown and one day you wake up with 2 GB of content, more than a thousand links and no way to sort them by relevance. You need a way for you and your visitors to get information about your services and products faster. A search engine could help you and your site visitors find that precious piece of information on your extensively growing site. Anyway, let us explain how a search engine works in general. Typically, a search engine works by sending out a ‘spider‘ to fetch as many documents as possible. Then another program, called an indexer, reads these documents and creates an index based on the words contained in each document. Each search engine uses a proprietary algorithm to create its indices such that, ideally, only relevant results are returned for each query. In the following tutorial we are going to create a PHP search engine with a MySQL database. We are building our search engine on PHP 5.2.3. PHP 5.2.3 includes the latest additions such as embedded SQLite database, support for the MySQL 4.1 client library with the introduction of the mysqli extension, etc. PHP Search Engine Why should we use MySQL? Well, this pretty gem will help us organize, fetch and store our data in a quite simple way, so that we will not need to create our own spider and indexer. MySQL would do the hard work for us! Note: For information on how to install and configure MySQL on Windows you can refer to Gareth Downes- Powell’s article “Installing MySQL on a Windows PC”. For installing PHP 5.x.x on Windows you might want to refer to Allan Kent’s Article “Installing PHP 5 under  Windows”. Ok, assuming that you have already installed PHP, MySQL with the appropriate server platform of your choice, IIS or Apache, you have a fully operational web server. Now, let’s get into the details. For the search engine we are going to build in this tutorial, I chose to use a table with 3 columns named ID, title, and article, where I have stored the information the user will be searching for. You can enter some data to your table or even make your own table. The ID field is the primary key for the table, while title and article are fields in which we plan to search. To make it easier for you, I`ve prepared a query to create the table. You just need to copy and paste the following code into the MySQL interface in a database. In order to do that, access your PHPMyAdmin from your favourite browser, then select your database and table respectively. There you should notice a tab named “SQL”. You have to paste the following code there: Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 1 of 10
  • 2. How to build a PHP Search Engine Kiril Iliev CREATE TABLE `news` ( `id` tinyint(4) NOT NULL auto_increment, `title` varchar(200) NOT NULL default ‘‘, `article` text NOT NULL, UNIQUE KEY `id` (`id`), FULLTEXT KEY `title` (`title`,`article`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; Under the “Browse” tab you can see the entries in your table. In order to insert new entries go to “Insert” tab and add new values to the fields Title and Article. Surely, you can extend your table and add additional fields, or change the type of the current fields, in a whole to change the entire table for your own convenience. How are we going to proceed? We will start creating the search form, then setting up our connection to the database, go through the search function itself, and finally test our search engine. In addition, we are going to design additional features such as paging and displaying the search time. Beginning of the search page… Firstly let’s create our search page with a form where site visitors will enter keywords to search content. Let’s open our favourite web editor and create a new page. Then insert a new form called searchbox and a button with value Search. Finally save the page as Search.php. You may want to use the POST method instead of the GET method for your form since it is more secure. For this tutorial I chose using the GET method since this allows me to check if the search engine is working properly. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=“http://www.w3.org/1999/xhtml”> <head> <meta http-equiv=“Content-Type” content=“text/html; charset=utf-8” /> <title>Untitled Document</title> </head> <body> <h1>Search Engine with PHP</h1> <form method=“get” action=“ “> <input type=“text” name=“search_term” title=“Search…” value=“Search...”> <input type=“submit” name=“search” title=“Search Now! “value=“Search” class=“searchbutton” /> </form> </body> </html> As you can see this is just simple code for a form with a text field and a button. Connecting... Now let’s make the connection string. Open a new PHP document, name it connectionstring.php and save it in the same directory in which Search.php is located. For example, you can name it MySearchEngineWithPHP. Later on you will upload the entire folder to your server. Add the following code to connectionstring.php: Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 2 of 10
  • 3. How to build a PHP Search Engine Kiril Iliev <?php $hostname_MyConnectionPHP = “localhost”; $database_MyConnectionPHP = “database”; $username_MyConnectionPHP = “usrname”; $password_MyConnectionPHP = “mypassword”; $connections = mysql_connect($hostname_MyConnectionPHP, $username_MyConnectionPHP, $password_MyConnectionPHP) or die ( “Unabale to connect to the database” ); ?> Replace “database”, “usrname” and “mypassword” with the respective data that you use for the MySQL database. Time to search! The following code is the core of our search engine. We will calculate the search time using a function, make a database connection with another function, and finally we will check for matches with an appropriate algorithm running a query to select a table to look for matches. Add the following code to your Search.php page: <?PHP function getmicrotime() { list($usec, $sec) = explode(“ “, microtime()); return ((float)$usec + (float)$sec); } $connection_string = dirname(__FILE__) . “/connectionstring.php”; require_once($connection_string); mysql_select_db(“test”) or die ( ‘Unable to select database.’ ); $RESULTS_LIMIT=10; if(isset($_GET[‘search_term’]) && isset($_GET[‘search_button’])) { $search_term = $_GET[‘search_term’]; if(!isset($first_pos)) { $first_pos = “0”; } $start_search = getmicrotime(); $sql_query = mysql_query(“SELECT * FROM news WHERE MATCH(title,article) AGAINST(‘$search_term’)”); many mathces (too many matches cause returning of 0 results) if($results = mysql_num_rows($sql_query) != 0) { $sql = “SELECT * FROM news WHERE MATCH(title,article) AGAINST(‘$search_term’) LIMIT $first_pos, $RESULTS_LIMIT”; $sql_result_query = mysql_query($sql); } Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 3 of 10
  • 4. How to build a PHP Search Engine Kiril Iliev else { $sql = “SELECT * FROM news WHERE (title LIKE ‘%”.mysql_real_escape_string($search_term).”%’ OR article LIKE ‘%”.$search_term.”%’) “; $sql_query = mysql_query($sql); $results = mysql_num_rows($sql_query); $sql_result_query = mysql_query(“SELECT * FROM news WHERE (title LIKE ‘%”.$search_term.”%’ OR article LIKE ‘%”.$search_term.”%’) LIMIT $first_pos, $RESULTS_LIMIT “); } $stop_search = getmicrotime(); $time_search = ($stop_search - $start_search); } ?> Let’s take a closer look at the code. On the second line we initialize function to calculate the time for the search. The require_once function initializes a connection to the database – we simply call the connectionstring.php file that we created earlier. With the line “mysql_select_db(“test”) or die ( ‘Unable to select database.’ );” we select our database table called test in our case. However, if for some reason a database is not selected the “die” statement will bring a message that a database is not able to be selected. $RESULTS_LIMIT variable is used to specify how many results to display per page. Next we use an “if clause” to check if any phrase or word is set in the search field form. This is done with $search_query. Then we check if our marker for page listing exists with $first_pos variable – if not we start from the first page. Then we need to initialize a SQL query – simply with $sql_query. As you may know mysql_query is a keyword in MySQL. Unfortunately, using that keyword has a major drawback. MySQL does not display results of the phrases that are found in the database too often as it would display too many results. That is why we do a second check. The algorithm counts the number of results with the $results variable and if it is zero we run second query with a standard field search of the table with LIKE %...%. NOTE: The function mysql_real_escape_string is a standard MySQL function used to check if the entered value is legal, preventing the injection of malicious MySQL scripts into your database. For example, somebody could enter an SQL query in your form to change your database. Using mysql_real_escape_string will make your search engine and database more secure. Displaying the results Now let’s display the results. We are going to use a usual loop where we have saved the first results via the $results variable. We are arranging everything nicely in tables. That way our results will be separated and ordered. If no results are found, the page will display the following message: However, if results are found, the page should look like this: Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 4 of 10
  • 5. How to build a PHP Search Engine Kiril Iliev OK, so back to Search.php where we have inserted our form. Modify the code as follows: <?PHP if($results != 0) { ?> <table border=“0” cellspacing=“2” cellpadding=“2”> <tr> <td width=“47%”>Results for <?PHP echo “<i><b><font color=#000000>“.$search_term.”</font></b></i> “; ?></td> <td width=“53%” align=“right” height=“22”>Results <b> <?PHP echo ($first_pos+1).” - “; if(($RESULTS_LIMIT + $first_pos) < $results) echo ($RESULTS_LIMIT + $first_pos); else echo $results ; ?> </b> out of <b><?PHP echo $results; ?></b> for(<b><?PHP echo sprintf(“%01.2f”, $time_search); ?></b>) seconds </td> </tr> <tr> <form action=““ method=“GET”> <td colspan=“2” align=“center”> <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“ size=“40”> <input name=“search_button” type=“submit” value=“Search”> </td> </form> </tr> <?PHP while($row = mysql_fetch_array($sql_result_query)) { ?> <tr align=“left”> <td colspan=“2”><?PHP echo $row[‘title’]; ?></td> </tr> <?PHP } ?> </table> <?PHP } elseif($sql_query) { ?> <table border=“0” cellspacing=“2” cellpadding=“0”> <tr> <td align=“center”>No results for <?PHP echo “<i><b><font color=#000000>“.$search_term.”</font></b></i> “; ?></td> </tr> <tr> Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 5 of 10
  • 6. How to build a PHP Search Engine Kiril Iliev <form action=““ method=“GET”> <td colspan=“2” align=“center”> <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“> <input name=“search_button” type=“submit” value=“Search”> </td> </form> </tr> </table> <?PHP } ?> Sorting into pages Our final step is to show the number of result pages. We are calculating how many results the SQL query has returned. We start by calculating the first position in order to place it in relevance. If the maximum number of results is exceeded the algorithm creates a forward button for the user to switch to the next page. We already have defined the maximum number per page via $RESULTS_LIMIT. If the user goes to the second page of the results he can go back and check previous results with a back button. Well, these so called buttons are not really buttons – they are simple “>>“ and “<<“ signs. Of course feel free to add your own buttons, or even some flash images. I am also using a PHP function stripslashes in order to escape some quotes. Why? I use it to clean the results from the quotes in the MySQL query. That way the algorithm will not fail if any quotes are inserted. We can do all this with the following code: <?PHP if($first_pos > 0) { $back=$first_pos-$RESULTS_LIMIT; if($back < 0) { $back = 0; } echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$back’ ></a>“; } if($results>$RESULTS_LIMIT) { $sites=intval($results/$RESULTS_LIMIT); if($results%$RESULTS_LIMIT) { $sites++; } } for ($i=1;$i<=$sites;$i++) { $fwd=($i-1)*$RESULTS_LIMIT; if($fwd == $first_pos) { echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘><b>$i</b></a> | “; Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 6 of 10
  • 7. How to build a PHP Search Engine Kiril Iliev } else { echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘>$i</a> | “; } } if(isset($first_pos) && $first_pos < $results-$RESULTS_LIMIT) { $fwd=$first_pos+$RESULTS_LIMIT; echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘ > >></a>“; $fwd=$results-$RESULTS_LIMIT; } ?> </td> </tr> </table> This is the final piece of code in this article. The next code block contains the entire code for the search engine. I’ve inserted comments so that you can track the process: <?PHP function getmicrotime() { list($usec, $sec) = explode(“ “, microtime()); return ((float)$usec + (float)$sec); } //initializing connection to the database $connection_string = dirname(__FILE__) . “/connectionstring.php”; require_once($connection_string); //selecting table mysql_select_db(“test”) or die ( ‘Unable to select database.’ ); //max number of results on the page $RESULTS_LIMIT=10; if(isset($_GET[‘search_term’]) && isset($_GET[‘search_button’])) { $search_term = $_GET[‘search_term’]; if(!isset($first_pos)) { $first_pos = “0”; } $start_search = getmicrotime(); //initializing MySQL Quary $sql_query = mysql_query(“SELECT * FROM news WHERE MATCH(title,article) AGAINST(‘$search_term’)”); //additional check. Insurance method to re-search the database again in case of too many matches (too many matches cause returning of 0 results) if($results = mysql_num_rows($sql_query) != 0) { $sql = “SELECT * FROM news WHERE MATCH(title,article) AGAINST(‘$search_term’) LIMIT $first_pos, $RESULTS_LIMIT”; $sql_result_query = mysql_query($sql); Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 7 of 10
  • 8. How to build a PHP Search Engine Kiril Iliev } else { $sql = “SELECT * FROM news WHERE (title LIKE ‘%”.mysql_real_escape_string($search_term).”%’ OR article LIKE ‘%”.$search_term.”%’) “; $sql_query = mysql_query($sql); $results = mysql_num_rows($sql_query); $sql_result_query = mysql_query(“SELECT * FROM news WHERE (title LIKE ‘%”.$search_term.”%’ OR article LIKE ‘%”.$search_term.”%’) LIMIT $first_pos, $RESULTS_LIMIT “); } $stop_search = getmicrotime(); //calculating the search time $time_search = ($stop_search - $start_search); } ?> <?PHP if($results != 0) { ?> <!-- Displaying of the results --> <table border=“0” cellspacing=“2” cellpadding=“2”> <tr> <td width=“47%”>Results for <?PHP echo “<i><b><font color=#000000>“.$search_term.”</font></b></i> “; ?></td> <td width=“53%” align=“right” height=“22”>Results <b> <?PHP echo ($first_pos+1).” - “; if(($RESULTS_LIMIT + $first_pos) < $results) echo ($RESULTS_LIMIT + $first_pos); else echo $results ; ?> </b> out of <b><?PHP echo $results; ?></b> for(<b><?PHP echo sprintf(“%01.2f”, $time_search); ?></b>) seconds </td> </tr> <tr> <form action=““ method=“GET”> <td colspan=“2” align=“center”> <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“ size=“40”> <input name=“search_button” type=“submit” value=“Search”> </td> </form> </tr> <?PHP while($row = mysql_fetch_array($sql_result_query)) { ?> <tr align=“left”> <td colspan=“2”><?PHP echo $row[‘title’]; ?></td> </tr> <?PHP } ?> </table> <?PHP } //if nothing is found then displays a form and a message that there are nor results for the specified term elseif($sql_query) { Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 8 of 10
  • 9. How to build a PHP Search Engine Kiril Iliev ?> <table border=“0” cellspacing=“2” cellpadding=“0”> <tr> <td align=“center”>No results for <?PHP echo “<i><b><font color=#000000>“.$search_term.”</font></b></i> “; ?></td> </tr> <tr> <form action=““ method=“GET”> <td colspan=“2” align=“center”> <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“> <input name=“search_button” type=“submit” value=“Search”> </td> </form> </tr> </table> <?PHP } ?> <table width=“300” border=“0” cellspacing=“0” cellpadding=“0”> <?php if (!isset($_GET[‘search_term’])) { ?> <tr> <form action=““ method=“GET”> <td colspan=“2” align=“center”> <input name=“search_term” type=“text” value=“<?PHP echo $search_term; ?>“> <input name=“search_button” type=“submit” value=“Search”> </td> </form> </tr> <?php } ?> <tr> <td align=“right”> <?PHP //displaying the number of pages where the results are sittuated if($first_pos > 0) { $back=$first_pos-$RESULTS_LIMIT; if($back < 0) { $back = 0; } echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$back’ ></a>“; } if($results>$RESULTS_LIMIT) { $sites=intval($results/$RESULTS_LIMIT); if($results%$RESULTS_LIMIT) { $sites++; } } for ($i=1;$i<=$sites;$i++) { $fwd=($i-1)*$RESULTS_LIMIT; if($fwd == $first_pos) Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 9 of 10
  • 10. How to build a PHP Search Engine Kiril Iliev { echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘><b>$i</b></a> | “; } else { echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘>$i</a> | “; } } if(isset($first_pos) && $first_pos < $results-$RESULTS_LIMIT) { $fwd=$first_pos+$RESULTS_LIMIT; echo “<a href=‘search.php?search_term=“.stripslashes($search_term).”&first_pos=$fwd ‘ > >></a>“; $fwd=$results-$RESULTS_LIMIT; } ?> </td> </tr> </table> Do not forget to upload the files connectionstring.php and Search.php in the same directory on your server. Preview your page and test it. Just open it in your favourite web browser and type in some words. Make sure that your table is filled with some of these words otherwise it will return you that there are no results found. Conclusion That’s all we need. Our PHP search engine is running smoothly, fast and accurate! We might add some JavaScript functions from an external file, as well some brief CSS rules to make it fancier and give it a pleasant look. In addition, you may want to try combining it with one of our extensions – Ajax Autocomplete. Once you bind the extension to the input form in the code we have just created, it will add auto-complete functionality to the PHP Search Engine. When a user starts entering a phrase a list of suggested search terms will be displayed. Very nice, right? Copyright © 2007 DMXzone.com All Rights Reserved To get more go to DMXzone.com Page 10 of 10