How to use Codeigniter captcha plug in Part 2

Derek Jones edited this page Jul 5, 2012 · 8 revisions
Clone this wiki locally

Wiki Categories

Category:Plugin::Tutorials::captcha

In the previous post I wrote a basic method how to use captcha plug-in with Codeigniter. Today I am going to write a simple but practical newsletter subsciption page using captcha. We will use CI's form_validation class.

ci_captcha

Please read the previous post to customize it. You need to create a folder called captcha as the same level as system.

Database

We need two tables, captcha and subscribers.

CREATE TABLE IF NOT EXISTS captcha ( captcha_id bigint(13) unsigned NOT NULL AUTO_INCREMENT, captcha_time int(10) unsigned NOT NULL, ip_address varchar(16) NOT NULL DEFAULT '0', word varchar(20) NOT NULL, PRIMARY KEY (captcha_id), KEY word (word) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;

CREATE TABLE IF NOT EXISTS subscribers ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, email varchar(255) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;

Config

config/autoload.php $autoload['libraries'] = array('database', 'session');

$autoload['helper'] = array('url');

You can autoload library(form_validation) here as well.

Model

The code is from a Codeigniter book Professional CodeIgniter by Thomas Myer.

models/msubscribers.php <?php

class MSubscribers extends Model{

function MSubscribers(){
    parent::Model();
}

function getSubscriber($id){ $this->db->where('id',id_clean($id)); $this->db->limit(1); $Q = $this->db->getwhere('subscribers'); if ($Q->num_rows() > 0){ $data = $Q->row_array(); }

$Q->free_result();    
return $data;    

}

function getAllSubscribers(){ $data = array(); $Q = $this->db->get('subscribers'); if ($Q->num_rows() > 0){ foreach ($Q->result_array() as $row){ $data[] = $row; } } $Q->free_result();
return $data; }

function createSubscriber(){ $this->db->where('email', $_POST['email']); $this->db->from('subscribers'); $ct = $this->db->count_all_results();

if ($ct == 0){
    $data = array( 
        'name' => db_clean($_POST['name']),
        'email' => db_clean($_POST['email'])    
    );

    $this->db->insert('subscribers', $data);     
 }

}

function updateSubscriber(){ $data = array( 'name' => db_clean($_POST['name']), 'email' => db_clean($_POST['email'])

);

 $this->db->where('id', id_clean($_POST['id']));
$this->db->update('subscribers', $data);    

}

function removeSubscriber($id){ $this->db->where('id', id_clean($id)); $this->db->delete('subscribers');

}

}//end class ?>

Controller

controllers/welcome.php <?php class Welcome extends Controller { function __construct(){ parent::Controller(); $this->load->model('MSubscribers'); $this->load->helper(array('form', 'url')); $this->load->library('form_validation'); session_start(); $this->output->enable_profiler(FALSE); }

function index(){

    $captcha_result = '';
$data['cap_img'] = $this -> _make_captcha();
$this->load->view('subscribe', $data);

}

function subscribe(){ /** * form_validation / $this->form_validation->set_rules('name', 'Name', 'required'); $this->form_validation->set_rules('email', 'Email', 'required|valid_email'); $this->form_validation->set_rules('captcha', 'Captcha', 'required'); if ( $this -> _check_capthca() ) { if ($this->form_validation->run() == FALSE) { $this->session->set_flashdata('subscribe_msg', 'All fields are required . Please try again!'); redirect('welcome/index'); } else { $this->MSubscribers->createSubscriber(); $this->session->set_flashdata('subscribe_msg', 'Thanks for subscribing!'); redirect('welcome/index','refresh'); } }else { $this->session->set_flashdata('subscribe_msg', 'Enter captcha . Please try again!'); redirect('welcome/index'); }
} /
*

  • For captcha

*/ function _make_captcha() { $this -> load -> plugin( 'captcha' ); $vals = array( 'img_path' => './captcha/', // PATH for captcha ( *Must mkdir (htdocs)/captcha ) 'img_url' => 'captcha/', // URL for captcha img 'img_width' => 200, // width 'img_height' => 60, // height // 'font_path' => '../system/fonts/2.ttf', 'expiration' => 7200 , ); // Create captcha $cap = create_captcha( $vals ); // Write to DB if ( $cap ) { $data = array( 'captcha_id' => '', 'captcha_time' => $cap['time'], 'ip_address' => $this -> input -> ip_address(), 'word' => $cap['word'] , ); $query = $this -> db -> insert_string( 'captcha', $data ); $this -> db -> query( $query ); }else { return "Umm captcha not work" ; } return $cap['image'] ; }

function _check_capthca() { // Delete old data ( 2hours) $expiration = time()-7200 ; $sql = " DELETE FROM captcha WHERE captcha_time < ? "; $binds = array($expiration); $query = $this->db->query($sql, $binds);

//checking input
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
$binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
$query = $this->db->query($sql, $binds);
$row = $query->row();

if ( $row -> count > 0 ) { return true; } return false;

}

/**

  • End of captcha */ }//end controller class

?>

View

views/subscribe.php

<html > <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Using captcha with Codeigniter</title> <base href="<?=base_url();?>"> </head> <body>

<?php if ($this->session->flashdata('subscribe_msg')){ echo "

"; echo $this->session->flashdata('subscribe_msg'); echo "
"; } ?> <?php echo form_open("welcome/subscribe"); ?> <?php echo form_fieldset('Subscribe To Our Newsletter'); ?>
Name
<input type="text" name="name" id="name" value="<?php echo set_value('name'); ?>" size="40" />
Email
<input type="text" name="email" id="email" value="<?php echo set_value('email'); ?>" size="40" />
Are you human?
<?php echo "

$cap_img

" ;?>

<input type="text" name="captcha" value="" size="40" />

<input type="submit" value="Subscribe" /></div> <?php echo form_fieldset_close(); ?> </form>
</body> </html> http://www.okadadesign.no/blog/?p=384 newsletter1