Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

# CodeIgniter User Guide Version 2.1.3

Search User Guide

# Помощник CAPTCHA

Файл помощника CAPTCHA содержит функци, которые обеспечивают работу с капчей.

## Загрузка этого помощника

Этот помощник загружается при использовании следующего кода:

`$this->load->helper('captcha');`

Доступны следующие функции:

## create_captcha($data)

Принимает массив информации для генерации капчи на вход, и создает изображение, возвращая ассоциативный массив с данными об изображении.

`[array]
(
'image' => IMAGE TAG
'time' => TIMESTAMP (in microtime)
'word' => CAPTCHA WORD
)`

"image" содержит реальный тег изображения: `<img src="http://example.com/captcha/12345.jpg" width="140" height="50" />`

"time" это микровремя, используемое для картинки без расширения. Это будет номер вроде такого: 1139612155.3422

"word" это слово, которое появляется на картинке капчи. Если слово не передано функции, будет использована случайная строка.

### Использование помощника CAPTCHA

После загрузки вы можете сгенерировать капчу, к примеру так:

`$vals = array(
'word' => 'Random word',
'img_path' => './captcha/',
'img_url' => 'http://example.com/captcha/',
'font_path' => './path/to/fonts/texb.ttf',
'img_width' => '150',
'img_height' => 30,
'expiration' => 7200
);
$cap = create_captcha($vals);
echo $cap['image'];`

- Функция капчи требует библиотеку GD.
- Требуется указывать только img_path и img_url.
- Если слово "word" не предоставлено, функция сгенерирует случайную строку ASCII. Вы можете иметь собственную библиотеку слов, из которой брать значения случайным образом.
- Если вы не указали путь к шрифту TRUE TYPE, будет использован родной страшный шрифт GD.
- Директория "captcha" должна быть записываемой (666 или 777)
- Время истечения "expiration" (в секундах) обозначает, как долго изображение будет использоваться, до того, как будет удалено. По умолчанию два часа.

### Добавление БД

Чтобы предотвратить функцию от неправильного использования, вы должны добавлять информацию из `create_captcha()` в базу данных. После того, как данные из формы переданы пользователем, вы должны будете проверить их существование в базе данных, а также неистечение времени хранения.

Вот прототип таблицы:

`CREATE TABLE captcha (
captcha_id bigint(13) unsigned NOT NULL auto_increment,
captcha_time int(10) unsigned NOT NULL,
ip_address varchar(16) default '0' NOT NULL,
word varchar(20) NOT NULL,
PRIMARY KEY `captcha_id` (`captcha_id`),
KEY `word` (`word`)
);`

Вот пример использования базы данных. На странице, где оторбажается капча, вы имеете что-то вроде этого:

`$this->load->helper('captcha');
$vals = array(
'img_path' => './captcha/',
'img_url' => 'http://example.com/captcha/'
);
$cap = create_captcha($vals);
$data = array(
'captcha_time' => $cap['time'],
'ip_address' => $this->input->ip_address(),
'word' => $cap['word']
);
$query = $this->db->insert_string('captcha', $data);
$this->db->query($query);
echo 'Submit the word you see below:';
echo $cap['image'];
echo '<input type="text" name="captcha" value="" />';`

Тогда на странице, принимающей данные, вы должны иметь что-то вроде такого:

`// Во-первых, удалите старую капчу
$expiration = time()-7200; // Двухчасовое ограничение
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);
// Потом проверим существование капчи:
$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)
{
echo "You must submit the word that appears in the image";
}`

### Поделиться

Переведено в компании Аринт.

# Спасибо!

Вы тоже можете оказать помощь проекту! Как это сделать?

## Помощь и поддержка

Вы можете задать вопросы и получить ответы и советы от гуру CodeIgniter и веб-разработки: вступайте в Клуб CodeIgniter