-
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