Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Капча
 
 автор: Снежана   (17.11.2013 в 23:00)   письмо автору
 
 

нужно формировать капчу в виде двухзначного числа, и выполнить операцию сложения, вычитания,деления или умноженияrnТо есть ХХуХХуХХ, где ХХ-любые числа в диапазоне от 0 до 99, у операция или +,или -, или /, или *

  Ответить  
 
 автор: man1   (18.11.2013 в 01:45)   письмо автору
 
   для: Снежана   (17.11.2013 в 23:00)
 

и в чем у вас сложность?

  Ответить  
 
 автор: Снежана   (18.11.2013 в 19:08)   письмо автору
 
   для: man1   (18.11.2013 в 01:45)
 

не могу понять как)

  Ответить  
 
 автор: psychomc   (21.11.2013 в 13:50)   письмо автору
 
   для: Снежана   (17.11.2013 в 23:00)
 

вот, ловите. было немного времени, набросал пример. это само собой не претендует на эталон и тут нету всяких проверок деления на 0 и т.п, но думаю вам для начала это должно подойти

<?php
class math_captcha
{
    protected
        
$session_captcha_key 'captcha',
        
$operations = array('+''-''*''/'),
        
$ranges = array(099),
        
$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>

  Ответить  
 
 автор: Снежана   (21.11.2013 в 20:37)   письмо автору
 
   для: psychomc   (21.11.2013 в 13:50)
 

спасибо огромное

  Ответить  
 
 автор: Deed   (23.11.2013 в 11:13)   письмо автору
 
   для: 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
При всем уважении к ООП.

  Ответить  
 
 автор: psychomc   (23.11.2013 в 13:40)   письмо автору
 
   для: Deed   (23.11.2013 в 11:13)
 

там по условию 3 операнда

  Ответить  
 
 автор: Deed   (23.11.2013 в 15:00)   письмо автору
 
   для: 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();
?> 

  Ответить  
 
 автор: confirm   (23.11.2013 в 15:56)   письмо автору
 
   для: 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));

  Ответить  
 
 автор: Deed   (23.11.2013 в 16:34)   письмо автору
 
   для: confirm   (23.11.2013 в 15:56)
 

Хорошо!
Но я, как человек гуманный, убрал произведение в случае, если операнды больше 10 - зачем заставлять человека морщить лоб, вычисляя, сколько будет 79*97.

  Ответить  
 
 автор: confirm   (23.11.2013 в 17:05)   письмо автору
 
   для: Deed   (23.11.2013 в 16:34)
 

Мне побоку гуманитарные проблемы, написал потому, что ни наворачивать класса, ни писать функций с многочисленными проверками для такого пустяка не стоит.
Вообще такая каптча сама по себе бессмыслица - для бота раз плюнуть просчитать, а для пользователя действительно хоть калькулятор рядом вешай.

  Ответить  
 
 автор: Снежана   (30.11.2013 в 08:49)   письмо автору
 
   для: confirm   (23.11.2013 в 17:05)
 

Всем спасибо, а как сделать деление без остатка?

  Ответить  
 
 автор: confirm   (30.11.2013 в 08:50)   письмо автору
 
   для: Снежана   (30.11.2013 в 08:49)
 

Отбросить остаток. Ваша каптча, это смех для бота )

  Ответить  
 
 автор: Jovidon   (30.11.2013 в 14:31)   письмо автору
 
   для: Снежана   (30.11.2013 в 08:49)
 

>Всем спасибо

Нашы ребята очень быстро отвечают на вопросы девушек, кто то написал функцию кто то объект даже. ))) иногда на форуме 2 - 3 народа сидит. Как только возникает вопрос у какой нибудь девушки, на форуме каким то чудом появляется все даже сам chopes )))

  Ответить  
 
 автор: psychomc   (30.11.2013 в 18:34)   письмо автору
 
   для: Jovidon   (30.11.2013 в 14:31)
 

может быть, девушки просто умеют грамотно сформировать сами вопросы?

  Ответить  
 
 автор: Jovidon   (01.12.2013 в 12:46)   письмо автору
 
   для: psychomc   (30.11.2013 в 18:34)
 

не спорю

  Ответить  
 
 автор: Sfinks   (30.11.2013 в 19:42)   письмо автору
 
   для: Jovidon   (30.11.2013 в 14:31)
 

> chopes
))))

  Ответить  
 
 автор: Jovidon   (01.12.2013 в 12:46)   письмо автору
 
   для: Sfinks   (30.11.2013 в 19:42)
 

ой )))))

Medjedu Khufu (Cheops)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования