|
|
|
| нужно формировать капчу в виде двухзначного числа, и выполнить операцию сложения, вычитания,деления или умноженияrnТо есть ХХуХХуХХ, где ХХ-любые числа в диапазоне от 0 до 99, у операция или +,или -, или /, или * | |
|
|
|
|
|
|
|
для: Снежана
(17.11.2013 в 23:00)
| | и в чем у вас сложность? | |
|
|
|
|
|
|
|
для: man1
(18.11.2013 в 01:45)
| | не могу понять как) | |
|
|
|
|
|
|
|
для: Снежана
(17.11.2013 в 23:00)
| | вот, ловите. было немного времени, набросал пример. это само собой не претендует на эталон и тут нету всяких проверок деления на 0 и т.п, но думаю вам для начала это должно подойти
<?php
class math_captcha
{
protected
$session_captcha_key = 'captcha',
$operations = array('+', '-', '*', '/'),
$ranges = array(0, 99),
$numbers = 3;
public function __construct() {
if (!session_id()) {
session_start();
}
}
public function get_session_captcha_key() {
return $this->session_captcha_key;
}
public function set_session_captcha_key($key) {
$this->session_captcha_key = $key;
return $this;
}
public function get_operations() {
return $this->operations;
}
public function set_operations(array $operations) {
$this->operations = $operations;
return $this;
}
public function get_ranges() {
return $this->ranges;
}
public function set_ranges(array $ranges) {
$this->ranges = $ranges;
return $this;
}
public function get_numbers() {
return $this->numbers;
}
public function set_numbers($numbers) {
$this->numbers = $numbers;
return $this;
}
public function generate() {
$captcha = '';
list($range_min, $range_max) = $this->ranges;
$result = 0;
for ($i = 0; $i < $this->numbers; $i ++) {
$number = array_rand(range($range_min, $range_max));
$captcha .= $number;
if ($i < ($this->numbers - 1)) {
$operation = $this->operations[array_rand($this->operations)];
$captcha .= ' ' . $operation . ' ';
}
}
eval('$result = ' . $captcha . ';');
$result = (int) $result;
$_SESSION[$this->session_captcha_key] = $result;
return $captcha;
}
}
$mc = new math_captcha;
if (isset($_REQUEST['captcha'])) {
if ($_REQUEST['captcha'] == $_SESSION[$mc->get_session_captcha_key()]) {
echo '<p><b>correct!</b></p>';
} else {
echo '<p style="color:red">incorrect</p>';
}
}
?>
<form>
<?=$mc->generate()?> = <input type="text" name="captcha"/><input type="submit"/>
</form>
|
| |
|
|
|
|
|
|
|
для: psychomc
(21.11.2013 в 13:50)
| | спасибо огромное | |
|
|
|
|
|
|
|
для: psychomc
(21.11.2013 в 13:50)
| | Тоже малость времени выдалось :)
<?php
function captcha(){
session_start();
$d1=rand(0,99);
$d2=rand(0,99);
$oper = array('+');
if($d1>$d2){
$oper[]='-';
}
if($d1<10&&$d2<10){
$oper[]='*';
}
if($d1%$d2==0){
$oper[]="/";
}
$count_oper=count($oper)-1;
$do=rand(0,$count_oper);
@eval('$captch_val='.$d1.$oper[$do].$d2.';');
/$_SESSION['captcha']=$captch_val;
return (string)"$d1 $oper[$do] $d2 = $captch_val";
}
echo captcha();
?>
|
Test: http://codepad.org/AQXg5BPE
При всем уважении к ООП. | |
|
|
|
|
|
|
|
для: Deed
(23.11.2013 в 11:13)
| | там по условию 3 операнда | |
|
|
|
|
|
|
|
для: psychomc
(23.11.2013 в 13:40)
| | Не обратил внимания. Хотя, какие проблемы? Это чуть усложнит функцию:
<?php
function captcha(){
session_start();
$d1=rand(0,99);
$d2=rand(0,99);
$d3=rand(0,99);
$oper = array('+');
if($d1>($d2+$d3)){
$oper[]='-';
}
if($d1<10&&$d2<10&&$d3<10){
$oper[]='*';
}
if($d1%($d2*$d3)==0){
$oper[]="/";
}
$count_oper=count($oper)-1;
$do=rand(0,$count_oper);
@eval('$captch_val='.$d1.$oper[$do].$d2.$oper[$do].$d3.';');
$_SESSION['captcha']=$captch_val;
return (string)"$d1 $oper[$do] $d2 $oper[$do] $d3 = $captch_val";
}
echo captcha();
?>
|
| |
|
|
|
|
|
|
|
для: Deed
(23.11.2013 в 15:00)
| |
<?
$check = array(rand(10,99),rand(10,99),rand(10,99));
$mode = rand(0,1);
echo implode($mode ? '+' : '*', $check).' = '.($mode ? array_sum($check) : array_product($check));
|
| |
|
|
|
|
|
|
|
для: confirm
(23.11.2013 в 15:56)
| | Хорошо!
Но я, как человек гуманный, убрал произведение в случае, если операнды больше 10 - зачем заставлять человека морщить лоб, вычисляя, сколько будет 79*97. | |
|
|
|
|
|
|
|
для: Deed
(23.11.2013 в 16:34)
| | Мне побоку гуманитарные проблемы, написал потому, что ни наворачивать класса, ни писать функций с многочисленными проверками для такого пустяка не стоит.
Вообще такая каптча сама по себе бессмыслица - для бота раз плюнуть просчитать, а для пользователя действительно хоть калькулятор рядом вешай. | |
|
|
|
|
|
|
|
для: confirm
(23.11.2013 в 17:05)
| | Всем спасибо, а как сделать деление без остатка? | |
|
|
|
|
|
|
|
для: Снежана
(30.11.2013 в 08:49)
| | Отбросить остаток. Ваша каптча, это смех для бота ) | |
|
|
|
|
|
|
|
для: Снежана
(30.11.2013 в 08:49)
| | >Всем спасибо
Нашы ребята очень быстро отвечают на вопросы девушек, кто то написал функцию кто то объект даже. ))) иногда на форуме 2 - 3 народа сидит. Как только возникает вопрос у какой нибудь девушки, на форуме каким то чудом появляется все даже сам chopes ))) | |
|
|
|
|
|
|
|
для: Jovidon
(30.11.2013 в 14:31)
| | может быть, девушки просто умеют грамотно сформировать сами вопросы? | |
|
|
|
|
|
|
|
для: psychomc
(30.11.2013 в 18:34)
| | не спорю | |
|
|
|
|
|
|
|
для: Jovidon
(30.11.2013 в 14:31)
| | > chopes
)))) | |
|
|
|
|
|
|
|
для: Sfinks
(30.11.2013 в 19:42)
| | ой )))))
Medjedu Khufu (Cheops) | |
|
|
|