PHP TutorialsWeb Developer

Make a Simple Search Engine with PHP (open source download)

Written by:

Having a search engine for your website is pretty crucial for today’s web. If your users can’t search your site for content, it is difficult to get them to see more of what you have to offer. Luckily, it’s easy and fast to create a simple search engine with PHP, HTML and a MySQL database. All with a video tutorial included! Plus the free open source download is also available here too!

Simple Search Engine How-To Video

This video tutorial on how to make a simple search engine in PHP comes in two parts:

This php tutorial has a FREE open source code download available:
Download the Source Code

Style for the Search Engine (with CSS)

For simplicity, I’m not going to focus on a how to create a fancy display for the search engine. I am just going to use a pre-made CSS stylesheet I have ready to go, named main.css. So this way we can just get into the nitty-gritty of PHP code.
(The stylesheet will be included in the source code download above).

Create the Search Engine Form

<form action="" method="GET" name="">
	<table>
		<tr>
			<td><input type="text" name="k" value="<?php echo isset($_GET['k']) ? $_GET['k'] : ''; ?>" placeholder="Enter your search keywords" /></td>
			<td><input type="submit" name="" value="Search" /></td>
		</tr>
	</table>
</form>

The important code to note from the form is all in the form attributes and the text box attributes:

  • action=”./index.php” – the form’s action is the end goal destination. This will be the location of the script that is going to do all the code crunching. For our search engine, index.php will be the only file we are working with. And because of that we will make the script send the url request back to itself.
  • method=”GET” – the GET method type is what will take the text entered into the text box and throw it into the url for the user. Like when you see “search.php?k=php+tutorial” (with the plus sign being a place holder for a space). That is a GET request being passed in the URL.
  • input type=”text” – the “text” type is simply going to do that, make the input a text input (crazy I know).
  • name=”k” – the “name” can be whatever you want it to be. Do keep in mind it is going to show in the users browser, like the example above. So usually shorter url is better.
  • value=”” – having a value of “” (blank) will make the text box always be empty when the user first sees it. It’s not really required, but it does make things a bit cleaner.
Check this out:  Change user password for phpMyAdmin and Update MySQL account password

With our style sheet and the rest of the form all setup, we see our basic search form displayed below. Pretty snazzy, ehh?

Make a Simple Search Engine - basic search form setup

Create the Search Engine Database Structure (using MySQL/phpMyAdmin)

Next we will setup the back-end SQL database structure for the search engine. Since our search engine is simple, our MySQL database will also be simple. Just a few fields to store our data. To create the database and table, I like using phpMyAdmin to manage the MySQL database backend.

Database fields we will need

The following is the list of the MySQL database fields we will end up needing for our search engine:

  • a unique id fields to easily access the information in the database
  • the title of the site the user can search
  • the url that it will direct them to
  • a nice little blurb or description about what the site does
  • and the keywords that can be used to search for individual records

It is important to note that the id field must be set to auto increment and primary key. Doing this allows for us to have an auto incrementing unique identifier for each record in the database. It also allows the queries we run against the database to be much faster.

Make a Simple Search Engine - basic database setup

Now that the front-end and database is ready, we can move onto the fun part of the actual search engine scripting. The code to operate the search engine is going to come in a few parts. First we need to get the keywords that the user searched for and format them for our use. Then we can connect to the database and run the query. And lastly we can display the search results back to the user.

Get the Search Engine Keywords

// get the search terms from the url
$k = isset($_GET['k']) ? $_GET['k'] : '';

// create the base variables for building the search query
$search_string = "SELECT * FROM search_engine WHERE ";
$display_words = "";
					
// format each of search keywords into the db query to be run
$keywords = explode(' ', $k);			
foreach ($keywords as $word){
	$search_string .= "keywords LIKE '%".$word."%' OR ";
	$display_words .= $word.' ';
}
$search_string = substr($search_string, 0, strlen($search_string)-4);
$display_words = substr($display_words, 0, strlen($display_words)-1);

We start by creating some variables that we will rely on for the script.

Start building the search query

$k – using a nested boolean statement we can make sure the url is giving us search keywords to use. Getting input from the user using this method helps with not kicking back errors for undefined variables to the user.

$search_string – we set the base of the query to be run against the database.

Check this out:  Make a Simple Registration Form in PHP

$display_words – just create a empty string for use later. Specifically to display a formatted version of what the user searched for back to them.

Adding each keyword to the search string

$keywords– using the explode function, we can take a normal string and turn it into an array of the same data. Using an array makes tasks like searching through a sentence word by word very easy. The first parameter is the string that you want to break at. In our case we are separating all the keywords into individual words. The next parameter is the sentence you want to break up (e.g. the $k variable).

foreach – using the foreach statement we can quickly parse each item out of the $keywords array with ease and no extra bull-crap. We are able to split each array element into a separate one. Then store it in a variable that can be worked recursively.

$search_string – we are taking each $word from the $keywords. Then formatting them into our query string that we can later search the database for. Later, using the LIKE query command we can search for strings in our database field of keywords. And by using % (percent signs) on the inside of the quotation marks, the query will search for our $word any where in the database. This is the true magic of the search engine right here!

The last two lines are just to remove the extra characters from the $search_string and $display_words variables. This helps to properly format them for the query and display back to the user.

Take a look at the MySQL query looks like

If we echo out our newly built query after searching for something such as “nickfrosty” we will see something like this:

SELECT * FROM search_engine WHERE keywords LIKE '%nickfrosty%' 

Connect to the MySQL Database and Process the Query

// connect to the database
$conn = mysqli_connect("localhost", "root", "password", "tutorials");

// run the query in the db and search through each of the records returned
$query = mysqli_query($conn, $search_string);
$result_count = mysqli_num_rows($query);

// display a message to the user to display the keywords
echo '<div class="right"><b><u>'.number_format($result_count).'</u></b> results found</div>';
echo 'Your search for <i>"'.$display_words.'"</i><hr />';

Now that we have our query built, we need to connect to the SQL server and select the database. We will go ahead and run the query string against the database. We also get the number of rows returned from doing so.

If you want to learn more about some of the php and MySQL commands and how they work, check out my tutorial here. It covers all the basics of PHP and MySQL/MySQLi operations.

Display the Search Engine Results to the User

Now that we have all of our database results we can start displaying those results to the user. For the ease of the html, we will just display them in a simple table format.

// check if the search query returned any results
if ($result_count > 0){

	// display the header for the display table
	echo '<table class="search">';
	
	// loop though each of the results from the database and display them to the user
	while ($row = mysqli_fetch_assoc($query)){
		echo '<tr>
			<td><h3><a href="'.$row['url'].'">'.$row['title'].'</a></h3></td>
		</tr>
		<tr>
			<td>'.$row['blurb'].'</td>
		</tr>
		<tr>
			<td><i>'.$row['url'].'</i></td>
		</tr>';
	}
	
	// end the display of the table
	echo '</table>';
}
else
	echo 'There were no results for your search. Try searching for something else.';

First check to make sure that there were some results returned from the database and display the results accordingly.

Check this out:  Fix PHP executable not found error in VS Code

Using a while loop, you are able to parse through each and every one of the results returned from our search query we made earlier. The $row variable stores each individual record on each pass though of the loop. These results are stored as an associative array that we can process or display. Basically what this means is that we will be able to handle/format/display each of the results that are returned on a one-by-one basis. Each being stored in the same $row variable.

If you want to learn more about how the mysqli_fetch_assoc function works, you can check out my article on MySQL basics.

Then we can look at each of the fields of the database records by retrieving them from the associative array. For simplicity, I am just going to display each of the results in a neat table. Then let my stylesheet make them a little more pleasing to look at.

Put it all together and what do you get?

Now we have a working search engine! Below is what the will be display if you were to search for “php”. Successfully showing only the results that include the search term, just like any good search engine should!

Make a Simple Search Engine - final product

29 Replies to “Make a Simple Search Engine with PHP (open source download)”

  1. Mrinmoy says:

    Hey Nick thanks for this awesome tutorial. But the download link for the project file is not working. Could you please give a proper link to download the project file.

  2. abhishek says:

    why i am getting error in line no 70,index.php file

  3. Nad says:

    Hi Nick, I wanted to ask why the source code is very different to your youtube video on how to create a search engine. We’ve been currently trying to follow your youtube video and use the source code you provided. We keep running into errors and wish to have more guidance about the source code or the original youtube video you have made.

  4. Samer Houri says:

    as Mrinmoy
    Hey Nick thanks for this awesome tutorial. But the download link for the project file is not working. Could you please give a proper link to download the project file. Samer

    • Nick says:

      I checked the link again on my computer, and didn’t have any problems with it. What happens when you click it?

  5. Hellos Nick thanks for tutorial but i dont see the download link of source code please leave here

  6. Thank you the awesome tutorial.I am working on a music website, I want to create a search to search all the pages the user just types the artist name or song title into the search and it will return all the songs related to that artists or the specific song the user requested, off course if the song exists on my website. How can i add that functionality to your search tutorial?

    • Nick says:

      That should be pretty easy to adapt this simple search engine to do.
      First, I would create a new table for the artist. Giving it some fields like artist ID and artist name. Then create another table for albums, giving it fields like artist ID, album name, album art, release date, and any other info you want displayed.
      Next, create a table named songs with fields like album ID, song title, etc.

      Notice how each table has an ID field for the next higher part of the music hierarchy. Songs have an album ID. Albums have an artist ID. That’s how you tie all the info together in the database.
      Then in the search query string, you can search for the song titles. The song results will give you the album ID, which you can use to get all the other songs from that album or artist.

      Makes sense? (That is how I would do it)

  7. I received you reply via email, I am don’t see my comment here! But it regards a user searching all pages on my website for my song, the question is i have is, do i need to enter all the artists & songs into the Database?

    • Nick says:

      Super strange, the comment is still listed. Weird. Anyways….
      Yes, you will have to enter all of the artist and song info into the database. Unless you can find some database that you can download that already has the ones you want

  8. Joe Cardamone says:

    Hi Nick, thanks for the great tutorial. All has gone well with the coding and downloads.
    One question please, I have added a field to my table called “sort” as I wish to sort the results based on result type (eg html page v’s pdf).
    How can I introduce a sort into the code please? My attempts have been unsuccessful and the reality is I am no expert in php coding.
    Thanks,
    Joe

    • Nick says:

      Hi Joe! Good question. Are you just trying to sort the info on the page that is being displayed to the user? If so, then I would create a new $_GET variable to determine the method of sorting that the user wants. Then in the php code where you build the search query itself (the $search_string variable), add your SQL command to perform the desired type of sorting, using an if statement. So for the example of pdf files, I would write something like this:

      if ($_GET['sort'] == 'pdf')
      $search_string .= ' AND url LIKE '%.pdf' ';
      // the % sign at the beginning means the url must end with ".pdf" but can have any other text at the beginning

      On a side not, for this to work you will have to wrap the entire keywords portion of the query search string in parentheses. That is because SQL will follow an order of operations, just like math.

      So when all is said and done, your SQL query should look something like this (assuming you search for “person name” with sort of “PDF”):
      “SELECT * FROM search_engine WHERE (keywords LIKE ‘%person%’ OR keywords LIKE ‘%name%’) AND url LIKE ‘%.pdf’ “

  9. Joe Cardamone says:

    Thanks for the quick reply Nick. Can I take some more of your time to explain further please?

    My database is:
    id title url keywords Sort
    1 one Http:w hello 3
    2 two Http:x hello 1
    3 three Http:y hello 2
    4 four Http:z goodbye 1

    So if we seach on keywords “hello”, the result displayed is:

    two Http:x hello 1
    three Http:y hello 2
    one Http:w hello 3

    I do not need the user to be able to sort these results, just to display in the order I would like to.

    Hope you can assist.

    Thanks

    Joe

    • Nick says:

      Ahhh I understand what you mean. That is even easier that what I previously thought! You can use the built in SQL command “ORDER BY”.
      At the end of your $search_string, you need to add the “ORDER BY” command and then declare if you want to order ascending (aka 1,2,3 using “ASC”) or descending (aka 3,2,1 using “DESC”).

      So your SQL query should come out something like this:
      “SELECT * FROM search_engine WHERE (keywords LIKE ‘%person%’ OR keywords LIKE ‘%name%’) ORDER BY sort DESC”

      And that is it!

      • Joe Cardamone says:

        Thanks Nick, unfortunately I’m am not able to get this to work.
        My code is as per your code above, wth additional () around keywords and ORDER BY ‘sort’ at the end.

        // CHECK TO SEE IF THE KEYWORDS WERE PROVIDED
        if (isset($_GET[‘k’]) && $_GET[‘k’] != ”){
        // save the keywords from the url
        $k = trim($_GET[‘k’]);
        // create a base query and words string
        $query_string = “SELECT * FROM search_engine WHERE “;
        $display_words = “”;
        // seperate each of the keywords
        $keywords = explode(‘ ‘, $k);
        foreach($keywords as $word){
        $query_string .= ” (keywords LIKE ‘%”.$word.”%’) OR “;
        $display_words .= $word.” ORDER BY ‘sort’ “;
        }
        $query_string = substr($query_string, 0, strlen($query_string) – 3) ;

        however when I echo the $query_string I get:

        Search

        SELECT * FROM search_engine WHERE (keywords LIKE ‘%bio%’) OR (keywords LIKE ‘%sal%’)
        182 results found
        Your search for bio ORDER BY ‘sort’ sal ORDER BY ‘sort’

        Any assistance greatly appreciated.

        • Nick says:

          I think I see your issue. You added the “ORDER” command to the $display_words variable. Not the $query_string variable like you should. Try this:

          $query_string = substr($query_string, 0, strlen($query_string) – 3);
          $query_string .= ” ORDER BY ‘sort’ DESC”; // this way the ORDER command is added to the very end of the SQL query just before you run the command

          And remove the “ORDER BY” stuff from the $display_words variable inside the if statement

          • Joe Cardamone says:

            Thanks Nick, I think we are close now. I have the following code:
            $query_string = substr($query_string, 0, strlen($query_string) – 3);
            $query_string .= ” ORDER BY ‘sort’ DESC”;
            However on the secod line, I have a “Syntax error, unexpected T_STRING”
            Any ideas please?

  10. Joe Cardamone says:

    Nixk, added space after =
    $query_string .= ” ORDER BY ‘sort’ DESC”;
    Now all good. Thanks for your help!! Much appreciated.

  11. Godwin says:

    Thank you Nick

Leave a Reply

%d bloggers like this: