剛從台北回來趕文XD
為什麼要介紹驗證碼呢??
因為防灌水機器人,不想上線就被灌水文灌爆,
也要有點防禦措施,
在
controllers/gbook.php 增加一個方法,還有修改兩個方法
function __construct() {
parent::__construct();
$this->load->model('gbook_sql');
//載入CI的session 存放驗證碼的數字
$this->load->library('session');
$this->load->helper('url');
}
//驗證碼
function Keycik()
{
$img_height = 30; // 圖形高度
$img_width = 60; // 圖形寬度
$mass = 0; // 雜點的數量,數字愈大愈不容易辨識
$num=""; // rand後所存的地方
$num_max = 4; // 產生6個驗證碼
for( $i=0; $i<$num_max; $i++ ){
$num .= rand(0,9);
}
//把驗證碼存進session
$this->session->set_userdata('Checknum',$num);
// 創造圖片,定義圖形和文字顏色
Header("Content-type: image/PNG");
srand((double)microtime()*1000000);
$im = imagecreate($img_width,$img_height);
$black = ImageColorAllocate($im, 250,250,250); // (0,0,0)文字為黑色
$gray = ImageColorAllocate($im, 0,0,0); // (200,200,200)背景是灰色
imagefill($im,0,0,$gray);
// 在圖形產上黑點,起干擾作用;
for( $i=0; $i<$mass; $i++ ){
imagesetpixel($im, rand(0,$img_width), rand(0,$img_height), $black);
}
// 將數字隨機顯示在圖形上,文字的位置都按一定波動範圍隨機生成
$strx=rand(3,8);
for( $i=0; $i<$num_max; $i++ ){
$strpos=rand(1,8);
imagestring($im,5,$strx,$strpos, substr($num,$i,1), $black);
$strx+=rand(8,14);
}
ImagePNG($im);
ImageDestroy($im);
}
//新增留言(修改)
function AddGbook(){
$chck = $this->input->post('chck');
$checknum = $this->session->userdata('Checknum');
if($chck == $checknum){
$all = $this->input->post();
$this->gbook_sql->add($all,'gbook');
redirect(site_url().'gbook/index');
}else{
redirect(site_url().'gbook/index');
}
}
在views/gbook裡面多一個圖片指向剛剛的方法和一個輸入框
<?php
/*---------------------------------------*/
//........ 此頁面請放在view資料夾底下.......//
/*---------------------------------------*/
$link = 'http://localhost/test/';
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>公佈欄</title>
<!--以下是 Bootstrap 的文件包-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="<?=$link;?>css/bootstrap-responsive.min.css" rel="stylesheet">
<link href="<?=$link;?>css/bootstrap.min.css" rel="stylesheet" media="screen">
<script src="<?=$link;?>js/jquery.js"></script>
<script src="<?=$link;?>js/bootstrap.min.js"></script>
<style>
#heig{
height:10px;
}
#color{
background-color: #E5E5E5;
}
</style>
<!--"container"為固定置中,請參考 http://kkbruce.tw/Bootstrap/Scaffolding 佈局篇-->
<div class="container">
<p align="center"><h2 align="center"><strong>留言板</strong></h2></p>
<form id="form1" name="form1" method="post" action="<?=$link;?>index1.php/gbook/AddGbook" class="form-inline">
<table width="1200" border="1" class="table table-bordered table-condensed">
<tr>
<td id="color"><div id="heig"><strong>留言人:</strong>
<input type="text" name="user" id="user" />
<input name="time" type="hidden" id="time" value="<?=date('Y/m/d');?>" />
<strong>驗證碼:</strong>
<label>
<input type="text" name="chck" id="chck" />
</label>
<img src="<?=$link;?>index1.php/gbook/Keycik"/></div>
</td>
<td id="color"><div align="center">
<button class="btn" type="submit">留言</button>
</div></td>
</tr>
<tr>
<td colspan="2"><label>
<div align="center">
<textarea name="content" id="content" rows="3" class="span10"></textarea>
</div>
</label></td>
</tr>
</table>
</form>
<?php foreach($query->result_array() as $row):?>
<table width="1200" border="1" class="table table-bordered table-condensed">
<tr>
<td id="color"><strong>
<?=$row['user'];?>
在 <?=$row['time'];?> 留言說:</strong></td>
</tr>
<tr>
<td><?=$row['content'];?></td>
</tr>
</table>
<?php endforeach; ?>
<p> </p>
</div>
如果有出現這個錯誤
In order to use the Session class you are required to set an encryption key in your config file.
請在你的 config/config.php 裡面的這行 '亂打'存檔在試試看
$config['encryption_key'] = ' ';
完成圖片
待續....