Change a drop down when other changes in AJAX way

Here we are going to see basic AJAX script in play. Here I’m writing a script which populates a drop down box with states according to the countries selected in another drop down. So let’s see how it is done.

Given below are the drop downs in play (Note: I’ve only used a few data)

Country: <select name="country" onchange="return onchangeajax(this.value);" >
 <option value=""   selected="selected" >Select</option>
 <option value="USA"  >USA</option>
 <option value="India"  >India</option>
 <option value="UK"  >UK</option>
 </select><br />
 State: <div id="statediv"><input type="text" name="state" /></div>
 <input type="submit" name="signupsubmit" value = "Sign Up" />

Now as we see we have written a JavaScript function call on changing the items in drop down. Given below is the Ajax code to be embedded in the page.

function onchangeajax(pid)
 {
 xmlHttp=GetXmlHttpObject()
 if (xmlHttp==null)
 {
 alert ("Browser does not support HTTP Request")
 return
 }

 var url="changestate.php"
 url=url+"?pid="+pid
 url=url+"&sid="+Math.random()
 document.getElementById("statediv").innerHTML='Please wait..<img border="0" src="images/ajax-loader.gif">'
 if(xmlHttp.onreadystatechange=stateChanged)
 {
 xmlHttp.open("GET",url,true)
 xmlHttp.send(null)
 return true;
 }
 else
 {
 xmlHttp.open("GET",url,true)
 xmlHttp.send(null)
 return false;
 }
 }

 function stateChanged()
 {
 if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
 {
 document.getElementById("statediv").innerHTML=xmlHttp.responseText
 return true;
 }
 }

 function GetXmlHttpObject()
 {
 var objXMLHttp=null
 if (window.XMLHttpRequest)
 {
 objXMLHttp=new XMLHttpRequest()
 }
 else if (window.ActiveXObject)
 {
 objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
 }
 return objXMLHttp;
 }
</script>

Now we see that in the Ajax script it is calling another file ‘changestate.php’. This is the file which has the code that should populated in the ‘statediv’

<?php
 $val=$_REQUEST['pid'];
 if($val == 'USA')
 {
?>
<select name="state">
 <option value="">--Select--</option>
 <option value="Alabama">Alabama</option>
 <option value="Alaska">Alaska</option>
</select>
<?php
 }
 else if($val == 'India')
 {
?>
<select name="state">
 <option value="">--Select--</option>
 <option value="Karnataka">Karnataka</option>
 <option value="Kerala">Kerala</option>
</select>
<?php
 }
 else
 {
?>
<input type="text" name="state" />
<?php
 }
?>

[/sourcecode]

Adding Pagination in PHP

Here is an example of  how to use pagination in your PHP oage. I’m using a pagination class developed by Shiege Iseng’ and can be downloaded from here.

We include this file in the page we use. So here is a basic script that shows the details of users from a database and shows 4 of them in a pagae and shows 3 pages as links in between the [prev] and [next] links.


<?php

//making the database connection
include_once('includes/connection/connection.inc');
 dbConnect();

//including the paging class
 require_once('paging_class.php');

//database query
 $qry = "SELECT * FROM USERS";
 $results = mysql_query($qry);
 $num_rows = mysql_num_rows($results);

//making a paging object that shows 4 results and 3 links
$paging = new paging(4,3);
 $paging->db($host,$username,$passwd,$dbName);
 $paging->query($qry);
?>

<html>
 <head>
 <title>Pagination Example</title>
 </head>

<body>

<table>
 <tr>
 <td>Total Results Found: <?php echo $num_rows; //prints total results ?></td>
 </tr>
 <tr>
 <td>Sl No</td>
 <td>First Name</td>
 <td>Last Name</td>
 <td>Sex</td>
 <td>DOB</td>
 <td>Email</td>
 </tr>

 <?php
 $sl = 1;
 $pageno = 1;
 $pageno = $pageno - 1;
 if($pageno > 0)
 $s1 = $pageno * 10;
 else
 $s1 = 0;
 ?>

 <?php
 if($num_rows > 0)
 {
 $i = 1;
 while($obj=$paging->result_assoc())
 {
 $s1 = $s1 + 1;
//to alternate b/w colors in the row
 if(($i + 1) % 2 == 0)
 $bgcolor="#dbe3f0";
 else
 $bgcolor="#dbdcf0";
 ?>

 <tr bgcolor="<?php echo $bgcolor?>">
 <td><?php echo $sl; ?></td>
 <td><?php echo $obj['firstname']; ?></td>
 <td><?php echo $obj['lastname']; ?></td>
 <td><?php echo $obj['sex']; ?></td>
 <td><?php echo $obj['dob']; ?></td>
 <td><?php echo $obj['email']; ?></td>
 </tr>

 <?php
 $i++;
 }
 }
 else
 {
 ?>

 <tr>
 <td>No Data Available !! Please redifine your Search.... </td>
 </tr>

 <?php
 }
 ?>
 <tr>
 <td><?php echo "<hr>".$paging->print_link();?></td>
 </tr>

 </table>

Sending Mail

Sending mail using PHP is very simple. Here I’ll show how we can send the activation mail to a registered using along with the verification key we generated in last post.

<?php
    $emailto= "recipient@example.com";
    $frmname="yourid@yoursite.com";
    $subject	= "Activation-yoursite.com";
    $min_size	= "1";
    $max_size	= "4000";
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
    $headers .="To:".$emailto."<".$emailto.">\r\n";
    $headers .="From:".$frmname."<".$email.">\r\n";
    $headers 	= "From: yourid@yoursite.com";
    $message	= "Registration Successfull!!\n\nThank you for registering with us. \n\nUser name: ". $username . "\nPassword: ". $password ."\n\n Click here for activation.\n www.yoursite.com/activate.php?verikey=".$pass;
   $ok = @mail($emailto, $subject, $message, $headers);
   $msg	= "Registered Successfully";
   header("location:register_suc.php?msg=$msg");
?>

This will send the recipient with the username and password along with the verification key generated instructing them to click on the link to activate their profile. We will see how to implement the activation page in this post. We also need to understand how to first add the generated key to database.

Actually adding the generated key to database is as easy as any other PHP-MySQL queries. I’ll just give an example here.

$qry = "INSERT INTO users (name, password, email, vkey) VALUES ('$uname', '$passwd', '$email', '$pass');
mysql_query($qry);

We’ll be having a field in the ‘users‘ table named ‘status‘ which is by default ‘N’. The purpose of the activate page is set this to ‘Y‘. It is really very easy. Here is the code in the ‘activate.php‘ page.

$verikey = $_GET['verikey'];
 $qry = "UPDATE users SET status = 'Y' WHERE vkey = '$verikey'";
 mysql_query($qry);

Generate Verification Key

While registering with a website we often need to verfy our email id. Given below is the code to develop that functionality. The following will generate the verification key which has 6 characters

function generatePassword()
{
    $length =6;
    $validchars = "0123456789abcdfghjkmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    $password ="";
    $counter = 0;

    while($counter < $length)
    {
        $actChar = substr($validchars, rand(0, strlen($validchars)), 1);

        if(!strstr($password, $actchar))
       {
           $password .= $actChar;
           $counter++;
       }
   }

   return $password;
}

rand(0, stlen($validchars)) – generates a random number between 0 and the length of $validchars (inclusive of both ends).

substr($a, $b , len) – get generates a sub string from $a from the first occurrence of $b to length specified by len.

strstr($a, $b) – checks whether $a has $b in it. This is done to create unique characters.

So this is how you generate random string. How you can use it for verification purpose of a user registration is explained in the subsequent posts.

Basic connection string

This is very very novice kind of thing. Every web application requires script like this. Usually we write the following in a file named connection.inc which would later be included in files as needed.

$host = "localhost";
$dbname = "database_name";
$username = "user";
$password = "pass";

function dbConnect()
{
    global $host, $username, $password, $dbname;
    mysql_pconnect($host, $username, $password) or die("Error connecting to database");
    mysql_select_db($dbname) or die("Cannot select the database");
}

mysql_pconnect() makes a persistent connection. When connection it listens for any open connections and uses it if available. Also once the script ends it won’t close the connection. It will remain open for any further connections. It cannot also not closed with mysql_close() function.

What the Llama taught me? Part – 1

Yesterday I finished reading the Llama book. I need to go through the book again since I didn’t get a thorough understanding of all the contents especially the last chapters. Any how I got a glimpse of what Perl could do and I’m so amazed by most of what it could do, that I ordered 4 books of the Internet, the Llama, Alpace, Vicuna and Camel (The Llama I hold now is a friend’s copy).

Here are some of the new constructs I learned in Perl and some others which are there in other languages but treated differently in Perl. (NB: I have only recently started learning Perl and my experience is litle. So these are what I understood, may be some are not perfectly right. But If some one points out so, I’m willing to correct my entry.)

I believe a newbie can read this and get a bird’s eye view of Perl before getting hold of a Llama.

1) There are no integers. All numerals are treated like floating point by Perl. So 10/3 yields 3.3333… always. However in the case of ‘%’ floats are converted to integers (I’m not sure how Perl makes this possible as there isn’t an integer in Perl, or so I’m said, Some one may give an explanation in comments.).

2) Underscores can be used to add clarity to integer literals.
eg : 12_345_678 is equal to 12345678

3) Principle of “no built-in limits“. eg: You string length can range from 0 to infinity(meaning how much your memory can hold).

4) String repetition operator ‘x’.
eg: "Chris" x 3 is ChrisChrisChris.
Once again here too, if the right operator is a float it is truncated to corresponding integer value.

5) The block curly braces are ALWAYS needed around the conditional code. This is some kind of an inconvenience compared to C rule of no need for the braces if condition is followed by a single line. I believe this is made compulsory to aid readability.

6) The use of an uninitialized variable doesn’t yield a fatal error. Uninitialized variables are pre initialized with a special value ‘undef’, which acts like ‘0’ in numeric context and as empty string in string context. Using the ‘warnings’ pragma will sometimes arise a warning about the use of ‘undef’ values’. There is a defined() function to check whether a variable is defined.

7) There is no need to declare the aray size. It can grow up to whatever size it like. If you declare $fred[999] = 'somevalue' for an array @fred which earlier had only 2 members, the above code would extend the array to 1000 elements with all the elements from $fred[2] to $fred[998] as ‘undef’.
Also you can index the array with a float number(It isn’t an error, but will be truncated) so $fred[2.324] means $fred[2]. You can even use the above said technique of ‘underscores’ to denote an array inex. eg $fred[123_456]
The last array index can be found out by $#fred. Also you can use negative array index to access the array from end. eg $fred[-1] is equal to $fred[$#fred].

8 ) The list literals are  great innovation. The range operator (..) and qw shortcut are great way to ease the coding. [NB: The range operator only counts uphill , there is a reverse function for the opposite.]
The list assignments is an easy way to assign values.

9) The list construct makes it easy to swap two variables easily, that too without a third variable.
eg: ($fred, $barney) = ($barney, $fred) # This swaps the contents of the two variables.
Wow! What an idea!. That’s why I said list is indeed an innovation. There are more techniques like these in lists. When working with lists you will feel that Perl has got artificial intelligence of some sort. It knows to discard values when the two sides of the equal signs aren’t balanced.(Actually as a matter of fact, there are a lot of places where we feel Perl has got AI built in. May be it’s the reason why people complain Perl is hard. Here we are dealing with a beast which has got brains of it’s own. So it’s quite natural to need brains to tame it)

10) push, pop, shift, unshift etc are some array operators which makes life easy while working with arrays.

11) Once again a portion, where Perl shows intelligence. It knows whether you are talking in scalar or list context. So we also need to be intelligent enough to know the context while talking with Perl.
eg : reverse in list context gives the list from the last member whereas n string context reverses the string. You can force a list to scalar context by explicitly using the scalar keyword.

12) Sub routines in Perl is a section where there is a lot of astonishments in store for a newbie. The usual method of calling a subroutine is &<sub routine name>, but it is not always so. If Perl can understand it is a function call somehow then you can use a simple <sub routine name>. This means if the sub routine definition is provided in the code before the call or if there are parameters in the function call(If there are parameters, it ought to be a function, cool logic. isn’t it.?). Now even the skeptics among you can believe my claim ‘Perl is intelligent’.

13) There may or may not be return in a function. If there isn’t a return, the result of the last executed line of code is the return value (Please make sure you understand correctly what is returned since in the earlier days of Perl this can rise a lot of troubles)

14) There are multitude of default variables like $/, $_ etc which maybe confusing at first but once start to get going, these makes life more easy. for eg: $_ default variable makes it possible to write the foreach loop like
foreach (1..10) {
print($_);
}

instead of
foreach $num (1..10) {
print($num);
}

both of the print the numbers from 1 to 10, but the former one may be easier to write. You may decide which one you should use. If you find the second one more readable or say more in tandem with your foreach constructs in other languages go for the second.

15) I have been saying this for a while but even the motto for Perl is ‘There is more than one way to do it’. Do you know we can even write the for instead of the foreach in the above example.

There is more I can say, but I read somewhere the attention span of the average reader diminish by 70% after the first 15 points , so I’m reserving the rest of it for another post.

So here is what to emphasize before the small break.

So Perl is an intelligent beast which is wild(read as powerful) but yet domesticable(suits even the beginner) [Can you find a similarity with camel?]. If you are in any doubt, please try it, and be amazed.

add to del.icio.us : Add to Blinkslist : add to furl : Digg it : Stumble It! : add to simpy : seed the vine : : : TailRank : post to facebook

Why I love Perl already?

Since I have only started learning Perl I’m not yet qualified to talk about the programming aspects of the languages.I also don’t have much experience with lot of other languages so wouldn’t try even comparing them. Here I’m only trying to state a few traits of the general Perl community and programmers, which I already started loving.

1) Perl people are passionate.
Have you ever talked to a Perl programmer? The chances are that you will start programming in Perl too. Actually I too was brought in like that by a friend. Perl Programmers love Perl more than anything in the world and will do anything to popularize it. If you are in doubt check the community.

2) The gurus are there to help you
The irc channel contains knowledgeable guys and they are always ready to help a newbie. Whenever I had doubt I visited the #perl channel in freenode and my doubts were cleared within minutes. Yesterday I saw a senior member in irc stating “:) Ha I didn’t kill a newbie”, after explaining a seemingly easy doubt for a newbie and the newbie reporting to check into the matter further. The emotion embedded in the statement was how much the Perl community want new people to come in. I don’t know if this is normal with all the programing language channels, but in #perl you are sure to be in company of prominent and great guys. It is possible that the author of the book that you following explaining your doubts.

3) Great documentation
Good documentation is available online, for download and most of the time pre installed in linux.
Documentation is rather exhaustive and you get to learn every aspect of the language from this alone. However there are also lot of printed material to assist. The Llama, Camel and Alpaca are the premium source of education in the field of Perl. The documenation got a new and nice face lift recently and is rather god looking and easily navigable.

4) Highly expressive and less restrictive language
The language is really expressive and less restrictive. There are more than one way to do things, and actually it is the motto of the language. At first a newbie may find it hard to remember all of these different techniques and also some of the language constructs may seem confusing and unnecessary. But a few days in Perl and you will start enjoying all of these and it begins to seem second language to you. For a sample of what I was saying look into the last post. For another example you will get confused (I got) that a subroutine can be called with and without a ‘&’ and you doubt why? But a couple of pages more into the Llama would tell you the reasons. And once you know the reasons, you will appreciate it, and sometimes you even wonder how in the world Larry even visualized this feature. Another thing I found in my small experience so far are two new constructs, unless and until. I haven’t seen any of these in any of the languages I have used so far.You may argue by saying it is same is made possible by adding a ‘!’ in front of ‘if’ and ‘while’. Yeah, it is true, but it is great to have those and it makes you more expressive and I’m sure Perl have more of them in stock for me.

5) Nice and humble people.
There are more but I’m stopping with this one. This is by far the most important thing I have noticed. Perl people are humble. They love their language and are passionate about them but would never belittle another languages. Most of them are well versed in many languages. Actually all of them would tell you to learn other languages too and use one which suits you. I think the confidence is from the fact that once you start coding in Perl you are unlikely to move into others. Perl is pretty addictive.

add to del.icio.us : Add to Blinkslist : add to furl : Digg it : Stumble It! : add to simpy : seed the vine : : : TailRank : post to facebook

Explantion on the use of chop() and chomp() functions.

In an effort to learn Perl I was going through the Llama book. When I came to the second chapter there was an exercise where we need to enter two numbers and the program will return their product. I did the program and it worked well except for a small glitch. Here is my code and the output.

#!/usr/bin/perl
print "Enter the first number : ";
$num1 = <STDIN>;
print "Enter the second number : " ;
$num2 = <STDIN>;
$prd = $num1 * $num2;
print "The product of $num1 and $num2 is $prd\n";

The code worked well and outputted 20 if we enter 4 and 5 but it printed output like this.

Enter the first number : 4
Enter the second number : 5
The product of 4
and 5
is
20

Now it was annoying. Having only started programming in Perl and my previous experience in C or Java or even PHP never made me expect something like this. I expected it to print the whole sentence in one single line. What could be wrong. Then I recalled Llama telling about <STDIN> adding a ‘\n’ to the input and the need for using chomp() to get rid of this.

So I modified code and added two more lines

chomp($num1);
chomp($num2);

This made it correct. But still I found it odd and thought this feature of <STDIN> a nuisance. So I went into some knowledge hunting. I asked in #perl channel at freenode. So far I was wary and wasn’t talking and was merely listening. I was afraid even while asking this of getting some serious ‘RTFM’. But the folk in there responded nicely. Thanks for <claes_>. He gave the apt reply. Here is what I learned from him.

There is a special variable in Perl named $/ which is initialzed to be ‘\n’. This variable is termed the input record separator. This variable is used to separate the various lines from your inut. Since $/ contains ‘\n’ it assumes your input has been ended once you key in the return key.(Note: Though the ‘\n’ is not a part of the intended input, since you entered it it will also be included as a part of your input). That’s why we get the newline when printing it back. When we use chomp() it removes these ‘\n’. If we explicitly assign say, ‘f’ to $/ then <STDIN> enters whatever up to the first ‘f’ it sees. Also the functionality of chomp() changes. It will now remove the last ‘f’ from your input (Once again though ‘f’ wasn’t in your intended input, since you entered it it would be there, Please don’t do so. Leave ‘$/’ to the ‘/n’, or be ready to bear the dire after effects). So $/ variable helps in entering user input from standard input.

Another option is to use in the above example is the chop() method [I earlier called it a better option, but I taking that away as per the info by ‘Andrew’]. When chomp() removes whatever declared in the $/ variable, chop() removes the last character from the input.

So in the below snippet
$str = "Christy;
chop($str);
print $str;

the output is ‘Christ’;

I think I was successful in explaining the issue and let this save another newbie someday.

[Revision: Thursday 3 Sep, 2009, There was some confusion in the explanation of input record separator. Thank to Chas Owen. I corrected it.}

add to del.icio.us : Add to Blinkslist : add to furl : Digg itStumble It! : add to simpy : seed the vine : : : TailRank : post to facebook

Stepping into the world of Perl.

Alan Haggai Alavi a friend of mine and another Perl hacker introduced me to Perl a few days back. He has been doing steady Perl coding for a while and has submitted some modules in CPAN and is a known name among some elitist coders in the Perl community. I am happy to have him as my friend.

Much to the anger of the die hard Perl hackers, I was also an ignorant fellow who confused Perl to be synonymous wih cgi. But Haggai and some reading on the matter got rid of the misinformation. Haggai showed me some samples of a CMS he was developing in Perl. It is using catalyst as the frame work. He showed me how to do a Unit Test, though most of it was Latin to me, since I haven’t yet done Test driven development (I know for a programmer with more than 2 years of experience it is a shame, What to do, all the work I have done so far didn’t demand one. I’m pretty beginner.). However this got me excited and I started looked into Perl.

There are so much myths regarding Perl and I’m yet to gain experience to believe or dispel one. From what I heard from people who actually code Perl is that Perl is robust, powerful and a less restrictive language. So I’m going to learn it.

One more thing I love about Perl is the passion among Perl coders. They will Eat, Drink and Sleep Perl and will do anything and everything for the language. I haven’t seen such a kind of emotion in no other language community. Also the Perl coders are humble. They don’t belittle other languages. They even tell people to learn more languages to experience the difference and gain wisdom. This is some kind of emotion which isn’t seen elsewhere. For an experience, ask a python programmer what he feels about Perl. I think this cool behavior of Perl programmers must have been inherited from Larry Wall (I don’t know him personally. But I read he is a very religious guy. So it implies he is humble).

Haggai also introduced me to Ohloh and Stack Overflow. Since I haven’t developed any open source software and isn’t yet a genius my rating there is very poor. But I believe I can improve in the coming days.

I also decided to join the Iron man competition.Maybe I’m vain, but I have a dream. One day I too will a known name in the open source community. Like Matt S Trout, Shlomi Fish, Randal Schwartz, brian d foy, Larry Wall (Oh, God! I’m really vain)  one day Perl community will know me too.