PHP – Login Attempts Limit

In this tutorial I am explaining how to restrict the login after 3 unsuccessful login attempts. After 3 unsuccessful login attempts the user will be banned for next 10 minutes. After the given time period the user can try login again.

You can change the login limit and time according to you.

PHP - Login Attempt
PHP – Login Attempt

Demo Code

Step 1 – Create Database

Create new database tgl_login_db.

Step 2 – Import Database

Import attached tg_login_db.sql into the database tgl_login_db.

tg_login_db.sql

#
#  Table structure for tgl_users table
#
DROP TABLE IF EXISTS tgl_users;

CREATE TABLE tgl_users (
 username varchar(30) primary key,
 password varchar(32)
);

#
#  Table structure for tgl_login_attempts table
#
DROP TABLE IF EXISTS tgl_login_attempts;

CREATE TABLE tgl_login_attempts (
 ip varchar(20),
 attempts int default 0,
 lastlogin datetime default NULL	
);

#
# Infilling tgl_users table
#

INSERT INTO tgl_users (username,password) VALUES ('demo','demo');
INSERT INTO tgl_users (username,password) VALUES ('test','test');
INSERT INTO tgl_users (username,password) VALUES ('dharya','dharya');
INSERT INTO tgl_users (username,password) VALUES ('anil','anil');
INSERT INTO tgl_users (username,password) VALUES ('monika','monika');

Step 3 – Create First Folder


Create new folder login-page and add the following files in this folder :-
1. index.php
2. tg_login_process.php
3. tg_style.css

index.php

<?php
include("include/tg_session.php");
?>
<html>
<title>TechGuru | Demo : Login Attempts</title>
<link href="tg_style.css" rel="stylesheet" type="text/css">
<body>
<table>
	<tr>
		<td>
			<?php if($session->logged_in){
				echo "<h3>Logged In</h3>";
			   	echo "Welcome <b>$session->username</b>, you are logged in. <br><br>";
			   	echo "[ <a href=\"tg_login_process.php\">Logout</a> ]";
			}else{ ?>
				<h3>Login</h3>
				<?php if($form->num_errors > 0){
			   		echo "<strong><font size=\"2\" color=\"#ff0000\">".$form->error("access")."</font></strong>";
			   		echo "<font size=\"2\" color=\"#ff0000\">".$form->error("attempt")."</font>";
			   		echo "<br><br>";
				} ?>
				<form action="tg_login_process.php" method="POST" enctype="multipart/form-data" name="login_attempt" id="login_attempt">
					<table align="left" border="0" cellspacing="0" cellpadding="3">
						<tr>
							<td>Username:</td>
							<td><input type="text" name="user" maxlength="30" value="<?php echo $form->value("user"); ?>" /></td>
						</tr>
						<tr>
							<td>Password:</td>
							<td><input type="password" name="pass" maxlength="30" value="<?php echo $form->value("pass"); ?>" /></td>
						</tr>
						<tr>
							<td colspan="2" align="left"><input type="checkbox" name="remember" <?php if($form->value("remember") != ""){ echo "checked"; } ?> />
							<font size="2">Remember me next time &nbsp;&nbsp;&nbsp;&nbsp;</font>
							<input type="hidden" name="sublogin" value="1" />
							<input type="submit" value="Login" /></td>
						</tr>
					</table>
				</form>
				<?php
				echo "</td></tr><tr><td><br><br>";
				echo "<hr />";
				echo "<h3>Dummy Users:</h3>";
				$database->tgl_display_users();
				echo "</td></tr><tr><td><br><br>";
				echo "<hr />";
				echo "<h3>Total Attempts:</h3>";
				$database->tgl_display_user_attempts($session->ip);
			} ?>
		</td>
	</tr>
</table>
</body>
</html>

tg_login_process.php

<?php
include("include/tg_session.php");
class tgl_login_process{
   function tgl_login_process(){
      global $session;

      if(isset($_POST['sublogin'])){
         $this->tgl_proc_Login();
      }
      else if($session->logged_in){
         $this->tgl_proc_Logout();
      }
      else{
          header("Location: index.php");
       }
   }

   function tgl_proc_Login(){
      global $session, $form;
      /* Login attempt */
      $retval = $session->tgl_login($_POST['user'], $_POST['pass'], isset($_POST['remember']));
      
      /* Login successful */
      if($retval){
        header("Location: ".$session->referrer);
      }
      /* Login failed */
      else{
         $_SESSION['tgl_value_array'] = $_POST;
         $_SESSION['tgl_error_array'] = $form->getErrorArray();
         header("Location: ".$session->referrer);
      }
   }
   
   function tgl_proc_Logout(){
      global $session;
      $retval = $session->tgl_logout();
      header("Location: index.php");
   }
};
$process = new tgl_login_process;
?>

tg_style.css

body{ 	
    background:#FFF;
    color:#222;
    font-family:Arial, Helvetica, sans-serif;
    font-size:10px;
    line-height:135%;
	margin:10px 10px 10px 10px;
}

td{
	font-family:Arial, Helvetica, sans-serif;
    font-size:12px;
}

td.tgl_table_prop{
	/*background-color: #E4EFFF; */
	padding: 1px;
	font-family: Arial, Helvetica, sans-serif;
	font-size : 10pt;	
	text-align: center;
}

td.tgl_table_head_prop{
	background-color:#83A2D0; 
	padding:1px; 
	font-family:Arial, Helvetica, sans-serif;
	font-size:10pt;
	color:#FFFFFF; 
	font-weight:bold; 
	text-align:center;
}

h2{	
	font-size:30px;
	font-weight:bold; 
	font-family:Arial, Helvetica, sans-serif; 
	color:#165382;
	border-bottom:dotted;
}

h3{	
	font-size:18px; 
	font-weight:bold; 
	font-family:Arial, Helvetica, sans-serif; 
	color:#165382;
	border-bottom:dotted;
}

a{
	font-family:Arial, Helvetica, sans-serif;
	font-size:10pt;
	color:#3E84C3;
}
table{
	width:400px;
}

Step 4 – Create Second Folder
In the login-page folder, Create a new folder include and add the following files in this folder :-
1. tg_constants.php
2. tg_database.php
3. tg_form.php
4. tg_session.php

tg_constants.php

<?php
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "tgl_login_db");
define("TBL_USERS", "tgl_users");
define("TBL_ATTEMPTS", "tgl_login_attempts");
//login attempts - 3
define("ATTEMPTS_NUMBER", "3");
//10 minutes
define("TIME_PERIOD", "10");
//30 days
define("COOKIE_EXPIRE", 60*60*24*30); 
define("COOKIE_PATH", "/");                 
?>

tg_database.php

<?php
include("tg_constants.php");      
class TGL_MySQLDB{
	//MySQL Connection
   	var $connection;         

   	function TGL_MySQLDB(){
    	$this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());
      	mysql_select_db(DB_NAME, $this->connection) or die(mysql_error());
   	}

   	function tgl_confirm_ip_address($value) {
		$q = "SELECT attempts, (CASE when lastlogin is not NULL and DATE_ADD(LastLogin, INTERVAL ".TIME_PERIOD." MINUTE)>NOW() then 1 else 0 end) as Denied ". " FROM ".TBL_ATTEMPTS." WHERE ip = '$value'";
 
   		$result = mysql_query($q, $this->connection);
   		$data = mysql_fetch_array($result);   
 
   		//Verify login attempt in database
   		if (!$data){
     		return 0;
   		} 
   		if ($data["attempts"] >= ATTEMPTS_NUMBER){
      		if($data["Denied"] == 1){
         		return 1;
      		}else{
        		$this->tgl_clear_login_attempts($value);
        		return 0;
     		}
   		}
   		return 0;  
  	}
   
   	function tgl_add_login_attempt($value) {
   		//number of attempts   
	  	$q = "SELECT * FROM ".TBL_ATTEMPTS." WHERE ip = '$value'"; 
	  	$result = mysql_query($q, $this->connection);
	  	$data = mysql_fetch_array($result);
	  	
	  	if($data){
        	$attempts = $data["attempts"]+1;

        	if($attempts==3) {
		 		$q = "UPDATE ".TBL_ATTEMPTS." SET attempts=".$attempts.", lastlogin=NOW() WHERE ip = '$value'";
		 		$result = mysql_query($q, $this->connection);
			}else{
		 		$q = "UPDATE ".TBL_ATTEMPTS." SET attempts=".$attempts." WHERE ip = '$value'";
		 		$result = mysql_query($q, $this->connection);
			}
       	}else{
	   		$q = "INSERT INTO ".TBL_ATTEMPTS." (attempts,IP,lastlogin) values (1, '$value', NOW())";
	   		$result = mysql_query($q, $this->connection);
	  	}
   	}   
   
   	function tgl_confirm_user_pass($username, $password){
    	/* Add slashes */
      	if(!get_magic_quotes_gpc()) {
	      	$username = addslashes($username);
      	}

      	/* Check - user is in database */
      	$q = "SELECT password FROM ".TBL_USERS." WHERE username = '$username'";
      	$result = mysql_query($q, $this->connection);
      	if(!$result || (mysql_numrows($result) < 1)){
         	return 1; //Failure
      	}
		
      	/* Retrieve password */
      	$dbarray = mysql_fetch_array($result);
      	$dbarray['password'] = stripslashes($dbarray['password']);
      	$password = stripslashes($password);

      	/* Validate - password is correct */
      	if($password == $dbarray['password']){
         	return 0; //Success
      	}else{
         	return 1; //Failure
      	}
   	}
   
   	function tgl_confirm_user_name($username){
      	/* Add slashes */
      	if(!get_magic_quotes_gpc()) {
	      	$username = addslashes($username);
      	}

      	/* Chjeck - user is in database */
      	$q = "SELECT * FROM ".TBL_USERS." WHERE username = '$username'";
      	$result = mysql_query($q, $this->connection);
      	if(!$result || (mysql_numrows($result) < 1)){
         	return 1; //Failure
      	} 	  
	  	return 0;
   	}
   
   	function tgl_clear_login_attempts($value) {
    	$q = "UPDATE ".TBL_ATTEMPTS." SET attempts = 0 WHERE ip = '$value'"; 
		return mysql_query($q, $this->connection);
   	}
   
   	function tgl_get_user_info($username){
      	$q = "SELECT * FROM ".TBL_USERS." WHERE username = '$username'";
      	$result = mysql_query($q, $this->connection);
      	/* Error occurred, return given name by default */
      	if(!$result || (mysql_numrows($result) < 1)){
        	return NULL;
      	}
      	/* Return result array */
      	$dbarray = mysql_fetch_array($result);
      	return $dbarray;
   	}
      
   	function tgl_display_users(){
   		$q = "SELECT username,password " ."FROM ".TBL_USERS." ORDER BY username";
   		$result = mysql_query($q, $this->connection);
	  	$num_rows = mysql_numrows($result);
   		if($num_rows == 0){
      		echo "Users table is empty";
      		return;
   		}

   		echo "<p><table align=\"left\" border=\"1px solid black\" cellspacing=\"1\" cellpadding=\"0\">\n";
   		echo "<tr><td class=\"tgl_table_head_prop\">&nbsp;Username&nbsp;</td><td class=\"tgl_table_head_prop\">&nbsp;Password&nbsp;</td></tr>\n";
   		for($i=0; $i<$num_rows; $i++){
      		$uname  = mysql_result($result,$i,"username");
      		$upass = mysql_result($result,$i,"password");

      		echo "<tr><td class=\"tgl_table_prop\">$uname</td><td class=\"tgl_table_prop\">$upass</td></tr>\n";
   		}
   		echo "</table></p><br>\n";
   	}
   
   	function tgl_display_user_attempts($value){
   		$q = "SELECT ip, attempts,lastlogin " ."FROM ".TBL_ATTEMPTS." WHERE ip = '$value' ORDER BY lastlogin";
   		$result = mysql_query($q, $this->connection);
   		$num_rows = mysql_numrows($result);
   		if($num_rows == 0){
      		echo "No Login Attempts";
      		return;
   		}

   		echo "<p><table align=\"left\" border=\"1px solid black\" cellspacing=\"1\" cellpadding=\"0\">\n";
   		echo "<tr><td class=\"tgl_table_head_prop\">&nbsp;IP Address&nbsp;</td><td class=\"tgl_table_head_prop\">&nbsp;Attempts&nbsp;</td><td class=\"tgl_table_head_prop\">&nbsp;Last Login&nbsp;</td></tr>\n";
   		for($i=0; $i<$num_rows; $i++){
      		$uip  = mysql_result($result,$i,"ip");
      		$uattempt = mysql_result($result,$i,"attempts");
	  		$ulogin = mysql_result($result,$i,"lastlogin");  

      		echo "<tr><td class=\"tgl_table_prop\">$uip</td><td class=\"tgl_table_prop\">$uattempt</td><td class=\"tgl_table_prop\">$ulogin</td></tr>\n";
   		}
   		echo "</table></p><br>\n";
   	}
};

/* Create database connection */
$database = new TGL_MySQLDB;
?>

tg_form.php

<?php
class tgl_user_form{
   //form values
   var $values = array();
   //error messages
   var $errors = array();
   //number of errors
   var $num_errors;

   function tgl_user_form(){
      if(isset($_SESSION['tgl_value_array']) && isset($_SESSION['tgl_error_array'])){
         $this->values = $_SESSION['tgl_value_array'];
         $this->errors = $_SESSION['tgl_error_array'];
         $this->num_errors = count($this->errors);

         unset($_SESSION['tgl_value_array']);
         unset($_SESSION['tgl_error_array']);
      }
      else{
         $this->num_errors = 0;
      }
   }

   function setError($error_type, $errmsg){
      $this->errors[$error_type] = $errmsg;
      $this->num_errors = count($this->errors);
   }

   function value($field){
      if(array_key_exists($field,$this->values)){
         return htmlspecialchars(stripslashes($this->values[$field]));
      }else{
         return "";
      }
   }

   function error($error_type){
      if(array_key_exists($error_type,$this->errors)){
         return "<font size=\"2\" color=\"#ff0000\">".$this->errors[$error_type]."</font>";
      }else{
         return "";
      }
   }

   function getErrorArray(){
      return $this->errors;
   }
}; 
?>

tg_session.php

<?php
include("tg_database.php");
include("tg_form.php");
class tgl_user_session{
	//User Name
   	var $username;
	//User ID
   	var $userid;  
	//User Level            
   	var $userlevel;      
	//User Time     
   	var $time;  
	//User Status              
   	var $logged_in;   
	//User Info       
   	var $userinfo = array();
	//Page URL
   	var $url; 
	//Site page                 
   	var $referrer;            
	//Remote IP address
   	var $ip;                    

   function tgl_user_session(){
      $this->ip = $_SERVER["REMOTE_ADDR"];
      $this->time = time();
      $this->tgl_start_user_session();
   }

   function tgl_start_user_session(){
      global $database;  
      session_start();   
	  
      /* check - logged in */
      $this->logged_in = $this->tgl_check_user_login();

      /* referrer page */
      if(isset($_SESSION['url'])){
         $this->referrer = $_SESSION['url'];
      }else{
         $this->referrer = "/";
      }

      /* current url */
      $this->url = $_SESSION['url'] = $_SERVER['PHP_SELF'];
   }

   function tgl_check_user_login(){
      global $database; 
      /* Check - remember me */
      if(isset($_COOKIE['cookname'])){
         $this->username = $_SESSION['username'] = $_COOKIE['cookname'];
      }

      if(isset($_SESSION['username'])){
         if($database->tgl_confirm_user_name($_SESSION['username']) != 0){
            unset($_SESSION['username']);
            return false;
         }

         $this->userinfo  = $database->tgl_get_user_info($_SESSION['username']);
         $this->username  = $this->userinfo['username'];
         return true;
      }
      else{
         return false;
      }
   }

   function tgl_login($subuser, $subpass, $subremember){
      global $database, $form;  

	  /* Checks - IP Address */	
      $result = $database->tgl_confirm_ip_address($this->ip);

      if($result == 1){
         $error_type = "access";
         $form->setError($error_type, "Access denied for ".TIME_PERIOD." minutes");
      } 

	  /* Check - Form Errors */
      if($form->num_errors > 0){
         return false;
      }
	  
	  $error_type = "attempt";
	  /* Check -Username and password */
      if(!$subuser || !$subpass || strlen($subuser = trim($subuser)) == 0){
         $form->setError($error_type, "Username or password not entered");
      }
      
      if($form->num_errors > 0){
         return false;
      }

      /* Check - username and password is correct */
      $subuser = stripslashes($subuser);
      $result = $database->tgl_confirm_user_pass($subuser, $subpass);

      if($result == 1){
         $form->setError($error_type, "Invalid username or password.");
		 $database->tgl_add_login_attempt($this->ip);
      }
	  
      if($form->num_errors > 0){
         return false;
      }

      /* Register Session variables */
      $this->userinfo  = $database->tgl_get_user_info($subuser);
      $this->username  = $_SESSION['username'] = $this->userinfo['username'];
      
      /* Clear login attempts */
	  $database->tgl_clear_login_attempts($this->ip);

	  if($subremember){
         setcookie("cookname", $this->username, time()+COOKIE_EXPIRE, COOKIE_PATH);
      }

      /* Login successfull */
      return true;
   }

   function tgl_logout(){
      global $database;  

      if(isset($_COOKIE['cookname'])){
         setcookie("cookname", "", time()-COOKIE_EXPIRE, COOKIE_PATH);
      }

      unset($_SESSION['username']);

      $this->logged_in = false;
      
   }
};

/* Initialize session object */
$session = new tgl_user_session;

/* Initialize form object */
$form = new tgl_user_form;
?>

Step 5 – Display Output

Now, open your browser and hit url – http://localhost/login-page

73 Comments on “PHP – Login Attempts Limit

  1. Thank you for every other informative blog. The place else may just I am getting that kind of info written in such a perfect manner? I have a undertaking that I’m just now operating on, and I’ve been on the look out for such information.

  2. Your mode of explaining the whole thing in this paragraph is genuinely good, all can without difficulty understand it, Thanks a lot.

  3. Wonderful web site. Plenty of useful info here. I’m sending it to a few pals ans also sharing in delicious. And certainly, thank you on your sweat!

  4. Aw, this was an extremely good post. Spending some time and actual effort to produce a top notch article… but what can I say… I procrastinate a lot and never manage to get nearly anything done.

  5. all the time i used to read smaller articles that as well clear their motive, and that is also happening with this article which I am reading now.

  6. Hello there, I found your web site by way of Google whilst looking for a similar subject, your web site came up, it looks great. I have bookmarked it in my google bookmarks.
    Hi there, just become alert to your blog through Google, and located that it is truly informative. I’m gonna be careful for brussels. I will be grateful in case you proceed this in future. Many other folks might be benefited from your writing. Cheers!

  7. I like the helpful information you supply on your articles. I will bookmark your blog and test again here frequently. I am relatively certain I will be informed many new stuff proper right here! Best of luck for the following!

  8. What’s up i am kavin, its my first occasion to commenting anywhere, when i read this post i thought i could also create comment due to this good paragraph.

  9. Hi! I’ve been following your weblog for a long time now and finally got the bravery to go ahead and give you a shout out from Huffman Texas! Just wanted to tell you keep up the fantastic work!

  10. Hey there! This post couldn’t be written any better! Reading through this post reminds me of my previous room mate! He always kept chatting about this. I will forward this page to him. Pretty sure he will have a good read. Thanks for sharing!

  11. Hey great website! Does running a blog such as this require a great deal of work? I have no knowledge of computer programming however I was hoping to start my own blog in the near future. Anyhow, if you have any recommendations or tips for new blog owners please share. I understand this is off subject however I simply needed to ask. Appreciate it!

  12. This is very interesting, You are an excessively skilled blogger. I have joined your feed and stay up for searching for extra of your excellent post. Also, I have shared your website in my social networks

  13. Magnificent site. Plenty of useful info here. I am sending it to several pals ans also sharing in delicious. And of course, thank you to your effort!

  14. I was recommended this website by way of my cousin. I’m now not positive whether or not this submit is written by way of him as nobody else recognize such unique approximately my difficulty. You are incredible! Thanks!

  15. I have read so many articles about the blogger lovers however this piece of writing is really a fastidious piece of writing, keep it up.

  16. Hey! Do you use Twitter? I’d like to follow you if that would be ok. I’m absolutely enjoying your blog and look forward to new updates.

  17. It’s actually a great and helpful piece of info. I am satisfied that you shared this helpful information with us. Please keep us informed like this. Thanks for sharing.

  18. Appreciating the persistence you put into your site and detailed information you present. It’s good to come across a blog every once in a while that isn’t the same out of date rehashed material. Wonderful read! I’ve bookmarked your site and I’m adding your RSS feeds to my Google account.

  19. Right here is the right blog for anyone who wishes to find out about this topic. You know a whole lot its almost tough to argue with you (not that I really would want to…HaHa). You definitely put a fresh spin on a topic that’s been written about for a long time. Excellent stuff, just excellent!

  20. Normally I don’t read post on blogs, however I wish to say that this write-up very forced me to check out and do it! Your writing style has been amazed me. Thank you, very great article.

  21. I’ve learn some just right stuff here. Certainly value bookmarking for revisiting. I surprise how so much attempt you place to make one of these fantastic informative web site.

  22. I seldom drop responses, however i did a few searching and wound up here PHP – Login Attempts Limit . And I actually do have some questions for you if you do not mind. Is it only me or does it seem like a few of the remarks appear like written by brain dead folks? 😛 And, if you are writing on additional sites, I would like to keep up with everything new you have to post. Could you list of every one of your shared sites like your linkedin profile, Facebook page or twitter feed?

  23. I just like the helpful information you provide in your articles. I will bookmark your blog and take a look at again here regularly. I am slightly certain I’ll be informed many new stuff proper right here! Good luck for the next!

  24. Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my blog that automatically tweet my newest twitter updates. I’ve been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this. Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates.

  25. An outstanding share! I’ve just forwarded this onto a friend who had been doing a little research on this. And he in fact bought me lunch due to the fact that I stumbled upon it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanks for spending the time to talk about this issue here on your internet site.

  26. I really like your blog.. very nice colors & theme. Did you design this website yourself or did you hire someone to do it for you? Plz answer back as I’m looking to create my own blog and would like to find out where u got this from. thank you

  27. If you are going for finest contents like I do, simply go to see this website every day for the reason that it presents feature contents, thanks

  28. Valuable info. Lucky me I found your site by accident, and I’m surprised why this accident did not took place in advance! I bookmarked it.

  29. Whats up very cool blog!! Man .. Beautiful .. Wonderful .. I will bookmark your web site and take the feeds additionally? I am glad to search out numerous useful info right here in the publish, we want work out more strategies on this regard, thank you for sharing. . . . . .

  30. You actually make it seem so easy with your presentation but I find this topic to be really something which I think I would never understand. It seems too complicated and very broad for me. I’m looking forward for your next post, I’ll try to get the hang of it!

  31. Excellent post. Keep posting such kind of information on your site. Im really impressed by it.
    Hello there, You have performed a fantastic job. I’ll definitely digg it and in my view recommend to my friends. I’m confident they’ll be benefited from this website.

  32. Normally I do not learn post on blogs, however I wish to say that this write-up very compelled me to try and do it! Your writing style has been surprised me. Thanks, very great article.

  33. I have been exploring for a little bit for any high quality articles
    or weblog posts on this sort of space . Exploring in Yahoo I ultimately stumbled upon this site.
    Studying this info So i’m satisfied to convey that I’ve an incredibly excellent uncanny feeling I came upon exactly what I needed.
    I so much without a doubt will make sure to don?t fail to remember this site and give it
    a look regularly.

  34. We’re a bunch of volunteers and opening a brand new scheme in our community. Your site offered us with useful info to work on. You’ve done an impressive task and our entire group will likely be thankful to you.

  35. Simply want to say your article is as surprising. The clarity in your post is simply excellent and i could assume you are an expert on this subject. Well with your permission allow me to grab your RSS feed to keep updated with forthcoming post. Thanks a million and please carry on the rewarding work.

  36. I am really impressed with your writing skills as well as with
    the layout on your blog. Is this a paid theme
    or did you customize it yourself? Either way keep up the nice
    quality writing, it is rare to see a nice blog like this one today.

  37. I’m truly enjoying the design and layout of your site. It’s a very easy on the eyes which makes it much more enjoyable for me to come here and visit more often. Did you hire out a developer to create your theme? Great work!

  38. Woah! I’m really enjoying the template/theme of this blog.

    It’s simple, yet effective. A lot of times it’s tough to get that “perfect balance” between user friendliness and visual appearance.

    I must say you have done a great job with this. Additionally, the blog loads extremely fast for
    me on Internet explorer. Exceptional Blog!

  39. Pretty section of content. I just stumbled upon your website and
    in accession capital to assert that I acquire in fact enjoyed account your blog posts.
    Anyway I’ll be subscribing to your feeds and even I
    achievement you access consistently fast.

Leave a Reply

Your email address will not be published.

*