Страница 1 из 1

экранирвоать dbi prepare

Добавлено: 2009-01-04 15:44:10
ProFTP
не работает, пробовал по разному:

Код: Выделить всё

$sth = $dbh->prepare( "SELECT count(*) FROM table where $self->{SQL}->{LIKE}");
$sth->execute();

в других классах примерно так формируется:

Код: Выделить всё

$self->{SQL}->{LIKE} = join (" AND ", map { "text LIKE ".$dbh->quote('%'.$_.'%') } @search );

Re: экранирвоать dbi prepare

Добавлено: 2009-03-03 0:14:18
hizel
кашмарики : )
используй ORM

Re: экранирвоать dbi prepare

Добавлено: 2009-03-05 20:47:57
ProFTP
я решио проблему не помню как


а чем ОРМ лучше?

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 14:35:21
ProFTP
ORM не плохое есть некотоыре хорошие вещи с ООП запросами...
вот я превел пример, не плохо

но зачем экономить на спичках?

если нужно сделать построение программного запроса, то можно через if else

и сделать нормально:

Код: Выделить всё

sub edit {
}
sub add {
}
ты настаиваешь на том чтобы использовать это? оно лучше, но не намного...

а тебя спасает это ORM?

Код: Выделить всё

package AddressBook::Controller::Address;
use strict;
use warnings;
use base qw(Catalyst::Controller::FormBuilder Catalyst::Controller::
BindLex');
sub add : Local Form('/address/edit') {
    my ($self, $c, $person_id) = @_;
    $c->stash->{template} = 'address/edit.tt2';
    $c->forward('edit', [undef, $person_id]);
}

sub edit : Local Form {
     my ($self, $c, $address_id, $person_id) = @_;
     my $address : Stashed;
     if(!$address_id && $person_id){
         # we're adding a new address to $person
         # check that person exists
         my $person = $c->model('AddressDB::People')->
                                      find({id => $person_id});
	          if(!$person){
	             $c->stash->{error} = 'No such person!';
	             $c->detach('/person/list');
	          }
         # create the new address
	          $address = $c->model('AddressDB::Addresses')->
	                                    new({person => $person});
	
     }
     else {
         $address = $c->model('AddressDB::Addresses')->
                                   find({id => $address_id});
         if(!$address){
             $c->stash->{error} = 'No such address!';
	            $c->detach('/person/list');
         }
     }
     if ($c->form->submitted && $c->form->validate){
	          # transfer data from form to database
         $address->location($c->form->field('location'));
         $address->postal ($c->form->field('postal' ));
         $address->phone    ($c->form->field('phone'    ));
         $address->email    ($c->form->field('email'    ));
         $address->insert_or_update;
         $c->stash->{message} =
             ($address_id > 0 ? 'Updated ' : 'Added new ').
                         'address for '. $address->person->name;
         $c->detach('/person/list');
   }
   else {
       # transfer data from database to form
       if(!$address_id){
            $c->stash->{message} = 'Adding a new address ';
       }

             else {
                 $c->stash->{message} = 'Updating an address ';
             }
             $c->stash->{message} .= ' for '. $address->person->name;
             $c->form->field(name => 'location',
                                  value => $address->location);
             $c->form->field(name => 'postal',
                                  value => $address->postal);
             $c->form->field(name => 'phone',
                                  value => $address->phone);
             $c->form->field(name => 'email',
                                  value => $address->email);
         }
     }
     sub delete : Local {
           my ($self, $c, $address_id) = @_;
           my $address = $c->model('AddressDB::Addresses')->
                                            find({id => $address_id});
           if($address){
     	         # "Deleted First Last's Home address"
     	         $c->stash->{message} =
     	               'Deleted ' . $address->person->name. q{'s }.
     	                     $address->location. ' address';
     	         $address->delete;
           }
           else {
     	         $c->stash->{error} = 'No such address';
           }
           $c->forward('/person/list');
     }
     1;

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 15:18:51
hizel
или ты работаешь только с перлом или ты работаешь с перл+sql , а это трудности в отладке и доп нагрузка на моск ;)

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 17:29:55
ProFTP
ну я вот не могу рещить использовать DBI или DBIx::Class...

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 17:53:21
hizel
я бы еще понял если бы вы выбирали из Rose::DBx DBIx::Class :-D

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 19:08:30
ProFTP
ну там написано что ORM работает медленно не много, там из СУБД идет через шаре мемори без многопоточности по-моиму...

говорят когда проект большой будет, то в этой "теории экономики" сложно изменить код... потомучто сразу не видно что делает код...

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 19:15:40
hizel
пруфлинк дайте, кто такое говорит, я иму эти слова обратно в рожу забью
я сегодня злой
я сегодня уже потренировался на воидере
:)

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 19:38:02
ProFTP
было дело, давно, но там опять таки 50 на 50

вот такой запрос разве легко будет написать на ORM?

Код: Выделить всё

    SELECT
    sum(rs.hits) as hits,
    sum(rs.hits * rs.price * o.percent*0.000001) AS hits_amount,
    0 as 'co_author'
    FROM ownership o
    LEFT JOIN read_stats rs ON rs.art = o.art 
        LEFT JOIN ownership o1 ON o1.art = o.art
        JOIN copyrights c ON c.person = o1.person 
    WHERE o.person = ? AND o.relation = ?    AND rs.time >= ? AND rs.time <= ?    AND c.user = ?
    AND o.percent != 0 AND o1.percent != 0 AND o.person = o1.person
    UNION ALL
    SELECT
    sum(rs.hits) as hits,
    sum(rs.hits * rs.price * o.percent*0.000001) AS hits_amount,
    1 as 'co_author'
    FROM ownership o
    LEFT JOIN read_stats rs ON rs.art = o.art 
        LEFT JOIN ownership o1 ON o1.art = o.art
        JOIN copyrights c ON c.person = o1.person 
    WHERE o.person = ? AND o.relation = ?    AND rs.time >= ? AND rs.time <= ?    AND c.user = ?
    AND o.percent != 0 AND o1.percent != 0 AND o.person <> o1.person

Re: экранирвоать dbi prepare

Добавлено: 2009-03-06 19:43:39
hizel
нет, не легко, в некоторых ОРМ этот запрос вообще не реализвать :)

Re: экранирвоать dbi prepare

Добавлено: 2009-03-07 5:17:28
ProFTP
ладно перехожу на DBIx::Class

слушай, а не достатки вообще есть у ORM?

я по гуглу прошелся - не нашел вообще...

скорее всего реально если тебе надо будет изменить не много таблицу или проабгрейдить все это, то не много проблем может быть или нет?

кстате, а ORM делает свои собственный запросы, ты можешь написать их штук 5, а она сделать 1 или 2 ... я только не помню может ли это DBIx::Class или какой-то дургой...

Re: экранирвоать dbi prepare

Добавлено: 2009-03-07 23:51:28
ProFTP
там еще увидел что нету смысла строить один запрос, потому что кэширвоание не обработает если ты сделаешь один большой запрос с вложенными запросами и т.д.

это только Оракл может как-то обработаеть один запрос большой, лучше чем несколько маленьких из него...

я просто уже использую DBI, в общем хрен его знает, не могу решить как использовать...

Re: экранирвоать dbi prepare

Добавлено: 2009-03-08 7:04:10
zg
ProFTP писал(а):не могу решить как использовать...
лучше грамотно :roll:

Re: экранирвоать dbi prepare

Добавлено: 2009-03-08 23:06:01
ProFTP
а кто использовал Rose::DBx, DBIx::Class ?

в чем приемущество от Rose::DBx? я пока документацию не нашел нормальную...

Re: экранирвоать dbi prepare

Добавлено: 2009-03-15 10:28:03
ProFTP
hizel писал(а):я бы еще понял если бы вы выбирали из Rose::DBx DBIx::Class :-D
не знаешь в чем разница между Rose::DBx DBIx::Class ? я видел что приемущественно на Жабе что-то вродебы RDBO...