Sadiqur Rahman

Recently I have sate for the ZCE (Zend Certified Engineer) exam on 28 January 2009, And I like to share my experience to all so that everyone can get prepared for ZCE Exam. However, Let me go to the topics.

The PHP 5 Certification exam covers the following topics:
PHP Basics
XML and Web Services
Functions
Arrays
Object Oriented Programming
Streams/Network Programming
Design Pattern
PHP 4/5 Differences
Security
Strings and Regular Expression
Databases Access
Web Features

Now let me say where you should study…

1) PHP Manual is the best reference to get prepared. This is not only the main reference but you must have deep eye on this tutorial if you are serious to be success. without following PHP Manual it is quite impossible to pass.
I suggest everyone to keep eyes on every functions mentioned into PHP Manual. Array Functions, String Functions and Database (MySQLi, PDO) and Exception handling are notable topics.

2) ZCE Study Guide You can get from zend.com but remember its not FREE.. you have spend a little money for this guide. You will learn from this guide Basic Language and basic of every topic. specially you will get knowledge from this guide on Security and Design Pattern etc…

3) Many PHP Forums You will learn manything from Forums and Newsgroup.

4) Mock Test Remember there is no similarity between mock and real exam but you will get some idea about your real exam.

5) Confidence if you do not have enough confidence you do not need to loss your valuable money :)

Checking the server response code is mainly a diagnostic  tool in case you are getting unexpected results when trying to view a page.  The  response code is sent by the server before the page contents along with other header information like response code, server software, cookies, content type, date etc..

For example, a user had a non existing page which was  showing his site fine but the server was returning a missing page code (404) so  none of the content of this page is actual content you are looking for.

How to send 404 response to the user?
it is very simple.. you have to use header() function to accomplish this.
<?php
header(“HTTP/1.0 404 Not Found”);
?>
Other necessary response code…

header("Location: /foo.php",TRUE,301);// 301 Moved Permanently
header("Location: /foo.php",TRUE,302);// 302 Found
header("Location: /foo.php");
header("Location: /foo.php",TRUE,303);// 303 See Other
header("Location: /foo.php",TRUE,307);// 307 Temporary Redirect

For more information on header function please keep you eye at http://us2.php.net/header

Anyway, let me expose to my original post..  I was talking on retriving response code.  It can be done by many ways including opening socket and using cURL.
I prefer to use cURL in this case as curl is faster than fsockopen.
Here is a function to retrieve http response header.

function get_http_header($url)
      {
          ob_start();
          $ch = curl_init($url);
          curl_setopt($ch, CURLOPT_HEADER, 1);
          curl_setopt($ch, CURLOPT_NOBODY, 1);
          $ok = curl_exec($ch);
          curl_close($ch);
          $head = ob_get_contents();
          ob_end_clean();
          return $head;
      }

Using this function, you will get all header information including cookies.
Look on the Sample Output of this function

HTTP/1.0 200 OK
Cache-Control: private, max-age=0
Date: Sun, 11 Jan 2009 06:34:42 GMT
Expires: -1
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=90215632c8490688:TM=1231655682:
LM=1231655682:S=aYh2YUY8dmUGmQh7;
expires=Tue, 11-Jan-2011 06:34:42 GMT; path=/; domain=.google.com.bd
Server: gws
Content-Length: 0
X-Cache: MISS from mail
Connection: close

Here we need only first line to get response code that is HTTP/1.0 200 OK
So, we can use $head=split(“\n”,$head);  to separate first line.
So, our final function will look like

function get_http_response_code($url)
      {
          ob_start();
          $ch = curl_init($url);
          curl_setopt($ch, CURLOPT_HEADER, 1);
          curl_setopt($ch, CURLOPT_NOBODY, 1);
          $ok = curl_exec($ch);
          curl_close($ch);
          $head = ob_get_contents();
          ob_end_clean();
          $head=split("\n",$head);
          $head=split(" ",$head[0]);
          return $head[1];
      }

What to Next?
I am showing you all http response code and meaning in a php array.

$response_status=array(    100=>"Continue",
            101=>"Switching Protocol",
            200=>"OK",
            201=>"Created",
            202=>"Accepted",
            203=>"Non-Authoritative Information",
            204=>"No Content",
            205=>"Reset Content",
            206=>"Partial Content",
            300=>"Multiple Choices",
            301=>"Moved Permanently",
            302=>"Found",
            303=>"See Other",
            304=>"Not Modified",
            305=>"Use Proxy",
            306=>"Switch Proxy",
            307=>"Temporary Redirect",
            400=>"Bad Request",
            401=>"Unauthorized",
            402=>"Payment Required",
            403=>"Forbidden",
            404=>"Not Found",
            405=>"Method Not Allowed",
            406=>"Not Acceptable",
            407=>"Proxy Authentication Required",
            408=>"Request Timeout",
            409=>"Conflict",
            410=>"Gone",
            411=>"Length Required",
            412=>"Precondition Failed",
            413=>"Request Entity Too Large",
            414=>"Request-URI Too Long",
            415=>"Unsupported Media Type",
            416=>"Requested Range Not Satisfiable",
            417=>"Expectation Failed",
            500=>"Internal Server Error",
            501=>"Not Implemented",
            502=>"Bad Gateway",
            503=>"Service Unavailable",
            504=>"Gateway Timeout",
            505=>"HTTP Version Not Supported",
            102=>"Processing",
            207=>"Multi-Status",
            418=>"I'm a Teapot",
            422=>"Unprocessable Entity",
            423=>"Locked",
            424=>"Failed Dependency",
            425=>"Unordered Collection",
            426=>"Upgrade Required",
            449=>"Retry With",
            450=>"Blocked",
            506=>"Variant Also Negotiates",
            507=>"Insufficient Storage",
            509=>"Bandwidth Limit Exceeded",
            510=>"Not Extended");

You can use this array along with above function.

Tags: , ,

You already might know that the giant company YAHOO provides some API to facilitate the application development process. One of them is Yahoo BBAuth API. I am glad to inform you that I wrote a wrapper class on Yahoo Browser Based Authentication (BBAuth) to make it easy and convenient.

So…, what’s BBAuth? What’s the point for using this class?

Well, a BBAuth API will provide you a WSSID and a cookie which will be destroyed after one hour (idle time) automatically (no way L ). After a successful login you will be able to access the users:

  • read and write to your data in Yahoo! Mail
  • read and write to your data in twlife
  • read your data in Yahoo! Address Book
  • read and write to your data in boss
  • read and write to your data in music
  • read and write to your data in twk

How it works:

The image below will illustrate the life cycle.

Yahoo BBauth

Yahoo BBauth

Now lemme tell you the entire process:

  1. Register your application
  2. Log in your users
  3. Use the user’s credentials to make web service calls

Wrapper Class  class.YahooAuth.php

Download from phpClasses.org


<?php
/* Description: Class for Yahoo BBAuth API
 * @author: Sadiqur Rahman
 * @param: $AppID=Yahoo BB Authentication Application ID
 * @param: $secret=Yahoo BB Authentication Secret key
 * @param: $AppData=Your application data which is an optional parameter
 * @Links:  http://developer.yahoo.com/auth/
 * @Author-URI: http://sadiqbd.wordpress.com
 * @Author-EMail: sadiqbd@gmail.com
 * License: GPL
 * Version: 1.0.0
 */
//declaring the class
class YahooAuth {

    protected $AppID;
    protected $secret;
    public $AppData;

    function __construct($AppID=NULL,$secret=NULL,$AppData=NULL){

        if (isset($AppID) && (!empty($AppID))){
            $this->AppID = $AppID;
        }else{
            global $YahooAppID;
            $this->AppID = $YahooAppID;
        }

        if (isset($secret) && (!empty($secret))){
            $this->AppID = $secret;
        }else{
            global $YahooSecret;
            $this->secret = $YahooSecret;
        }

        if (isset($AppData) && (!empty($AppData))){
            $this->AppData = $AppData;
        }

        if (!headers_sent()) {
            session_start();
        }

    }

    //Signature generation for Yahoo BBAuth
    protected function signature($path,$data,$ts){
        return md5($path.$data."&ts=".$ts.$this->secret);
    }

    //Generating login URL
    function generate_url(){
        $ts=time();
        $path="/WSLogin/V1/wslogin";
        $data="?appid=".$this->AppID."&appdata=".$this->AppData;
        $sig=$this->signature($path,$data,$ts);

        $url = "https://api.login.yahoo.com/WSLogin/V1/wslogin"
        ."?appid=".$this->AppID."&appdata=".$this->AppData."&ts=".$ts."&sig=".$sig;
        return $url;
    }

    //Automatically redirecting Yahoo login page
    function login(){

        if (!headers_sent()) {
            header('Location: '.$this->generate_url());
            exit;
            // If Header already sent, redirect to Yahoo using Javascript.
        } else {
            echo "<script type=\"text/javascript\">
                  <!--
                  window.location = \"".$this->generate_url()."\"
                  //-->
                  </script>".
                  "
<div align='center'>If you are not redirected within 5 Seconds <a " .
                  "href=\"".$this->generate_url()."\">Click Here</a>";
            exit;
        }
    }

    //Getting and verifying data from cookie and WSSID given by yahoo
    //and storing data into session for future use
    function get_credentials($token) {
        $ts=time();
        $path="/WSLogin/V1/wspwtoken_login";
        $data="?appid=".$this->AppID."&token=".$token;
        $sig=$this->signature($path,$data,$ts);

        $url = "https://api.login.yahoo.com/WSLogin/V1/wspwtoken_login"
        ."?appid=".$this->AppID."&token=".$token."&ts=".$ts."&sig=".$sig;

        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
        $store = curl_exec( $ch );
        $xml = curl_exec( $ch );

        if (  preg_match( "/(Y=.*)/", $xml, $match_array ) == 1 ) {
            $COOKIE = $match_array[1];
        }
        if (  preg_match( "/<WSSID>(.+)<\/WSSID>/", $xml, $match_array ) == 1 ) {
            $WSSID = $match_array[1];
        }
        if (  preg_match( "/<Timeout>(.+)<\/Timeout>/", $xml, $match_array ) == 1 ) {
            $timeout = $match_array[1];
        }

        $_SESSION['valid_user']=true;
        $_SESSION['COOKIE'] = $COOKIE;
        $_SESSION['WSSID'] = $WSSID;
        $rv = array();
        $rv["COOKIE"] = $COOKIE;
        $rv["WSSID"] = $WSSID;
        $rv["timeout"]   = $timeout;
        return $rv;
    }

    //some magic methods for your convenience
    function __get($name){
        return $this->$name;
    }

    function __set($name,$value){
        $this->$name=$value;
    }

    function __toString(){
        return(var_export($this,TRUE));
    }

    function __destruct(){
        unset($this);
    }
}
?>

Example Usage  index.php


<?php

//implementing lazy loading
function __autoload($class){
    include_once("class.".$class.".php");
}

$YahooAppID=".lND7LnIkY5jBHPMGmMhBBkWWpbJ6_gew9XLo.B5.d8-"; //your AppID will be here
$YahooSecret="555060ec4069cf7f67ddb84339f8701c"; //your Secret key goes here

$obj= new YahooAuth(); //Instantiating the class

if (isset($_GET['token']) && isset($_GET['appid'])){
    $obj->get_credentials($_GET['token']);
}elseif(isset($_GET['logout'])){
    unset($_SESSION['valid_user']);
}

if ($_SESSION['valid_user']){
    echo "Congratulation! You are logged in.<br \>";
    echo "<a href='".$_SERVER['PHP_SELF']."?logout'>LogOut</a><br \>";
    echo "
<pre>";
    print_r($_SESSION);
    echo "</pre>
";
}else{
    echo "You are not logged in.<br \>";
    echo "<a href='".$obj->generate_url()."'>Click Here to logIn</a>";
}
?>

Download from phpclasses.org

My Qualification

My Classes on PHPClasses.org

Archives

October 2014
M T W T F S S
« Jan    
 12345
6789101112
13141516171819
20212223242526
2728293031  

Flickr Photos

DSC00972

DSC00970

DSC00969

DSC00968

DSC00967

DSC00966

DSC00965

DSC00962

DSC00960

DSC00959

More Photos
Blog - Sadiqur Rahman

test

Follow

Get every new post delivered to your Inbox.