- Notifications
You must be signed in to change notification settings - Fork 7.6k
How to use Codeigniter captcha plug in Part 2
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.
Please read the previous post to customize it. You need to create a folder called captcha as the same level as system. 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/autoload.php $autoload['libraries'] = array('database', 'session'); $autoload['helper'] = array('url');
You can autoload library(form_validation) here as well. 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 ?>
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
?>
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'); ?> <input type="text" name="name" id="name" value="<?php echo set_value('name'); ?>" size="40" /> <input type="text" name="email" id="email" value="<?php echo set_value('email'); ?>" size="40" /> <?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