[Cascavel-pm] Re:

Marco A P D´Andrade mda em embratel.net.br
Quarta Março 9 05:51:20 PST 2005


Rodrigo,

Mesmo em sua função cabe o uso de placeholders, e suas vantagens, dentre 
elas o fato de não ser mais necessario se preocupar com o "quote" dos 
valores...

Existe uma função similar à sua dentro do DBIx::SearchBuilder:
<code>
sub Insert {
  my($self, $table, @pairs) = @_;
  my(@cols, @vals, @bind);
                                                                                                    

#  my %seen; #only the *first* value is used - allows drivers to specify 
default
  while ( my $key = shift @pairs ) {
    my $value = shift @pairs;
    #    next if $seen{$key}++;
    push @cols, $key;
    push @vals, '?';
    push @bind, $value;
  }
                                                                                                    

  my $QueryString =
    "INSERT INTO $table (". join(", ", @cols). ") VALUES ".
    "(". join(", ", @vals). ")";
    warn $QueryString if $DEBUG;
                                                                                                    

    my $sth =  $self->SimpleQuery($QueryString, @bind);
    return ($sth);
  }
</code>

A proposito... zero e undef são tratados como FALSE somente em operações 
lógicas, não quando utilizado em argumentos!

Sds,
Marco Antonio


Rod Za wrote:

>Galera, muito obrigado pela ajuda.
>
>As mensagem de erro que o MySQL me passa é a seguinte:
>
>ERROR 1048: Column 'valor' cannot be null
>
>e o meu banco de dados exemplo:
>
>CREATE TABLE `banco_de_dados` (
>  `valor` varchar(15) NOT NULL,
>) TYPE=MyISAM
>
>Eu não sei, sempre me confundo como o Perl interpreta o valor 0 (zero)! Me parece q na funcão q eu
>descrevi o valor passado, quando zero, é sempre interpretado como se fosse FALSE (ou mesmo NULL) e
>não como o número 0 (zero)!.
>
>Qualquer outro valor !=0 é interpretado perfeitamente.
>
>Luiz quando ao uso de PlaceHolders, a minha verdadeira funcão não é tão simples quanto a q eu
>apresentei anteriormente, só fiz deste modo para melhor ilustrar o tipo de erro q vem acontecendo.
>A verdadeira funcão faz parte de uma classe e é a seguinte:
>
><code>
>sub user_update($%){
>        my $self = shift;
>        my %update = @_;
>        my @keyArray = keys %update;
>        my @valueArray;
>        my $return;
>        foreach(@keyArray){
>                push @valueArray, $self->{dbh}->quote($update{$_}) if defined($update{$_});
>        }
>        my $sql = "INSERT INTO history (`".join('`,`', em keyArray)."`) VALUES
>(".join(',', em valueArray).")";
>        $self->commit if($self->{dbh}->do($sql));
>}
><code>
>
>e meu banco de dados:
><bd>
>CREATE TABLE `history` (
>  `id_history` int(11) NOT NULL auto_increment,
>  `id_user` int(11) default NULL,
>  `id_group` int(11) NOT NULL default '0',
>  `id_printer` int(11) NOT NULL default '0',
>  `deb_cred` enum('d','c','i','G','U') NOT NULL default 'd',
>  `valueDoc` float NOT NULL default '0',
>  `dateJob` datetime NOT NULL default '0000-00-00 00:00:00',
>  `fromGroup` enum('0','1') NOT NULL default '0',
>  `n_pages` int(11) NOT NULL default '0',
>  `jobFileName` varchar(255) NOT NULL default '',
>  `doc_name` varchar(255) NOT NULL default '',
>  `ip_ws` varchar(15) NOT NULL default '',
>  `ws` varchar(30) NOT NULL default '',
>  `id_status` int(11) NOT NULL default '0',
>  PRIMARY KEY  (`id_history`),
>  KEY `id_usuario` (`id_user`,`id_group`,`id_printer`)
>) TYPE=MyISAM
><bd>
>
>Muito obrigado,
>
>Rodrigo
>
>
>--- Luis Campos de Carvalho <monsieur_champs em yahoo.com.br> wrote:
>
>>Rod Za wrote:
>>
>>>Olá todos,
>>>
>>>Estou com uma dúvida cruel! Quando passo o valor 0 (zero) para uma função que grava este num
>>>
>>banco
>>
>>>de dados, a minha função dá sempre erro! Como posso contornar isto?
>>>
>>>_CODIGO_
>>>sub teste{
>>>	my $valor = shift; 
>>>	my $query = "INSERT INTO banco_de_dados (valor) VALUES ('$valor')";
>>>	if($dbh->do($query)){
>>>		$dbh->commit;
>>>	}
>>>}
>>>_FIM_CODIGO_
>>>
>>>ex: teste(0); ou teste(´0´); ou my $a=0; teste($a);
>>>
>>>dá sempre o mesmo erro, como se o valor 0 (zero) nao fosse passado!
>>>
>>>muito obrigado,
>>>
>>>
>>   O correto é usar PlaceHolders, uma técnica de passagem de dados 
>>implementada por quase todos os drivers DBD:: que existem.
>>
>>   __PERL__
>>   # Eu uso tratamento de erros por exceptions.
>>   $dbh->PrintError( 0 );
>>   $dbh->RaiseError( 1 );
>>   # Para usar placeholders, é preciso construir um query SQL assim:
>>   $sql = 'INSERT INTO banco_de_dados (valor) VALUES ( ? )';
>>   # e executá-lo normalmente, passando, é claro, o valor
>>   # que se deseja inserir, assim:
>>   my $sth = eval{ $dbh->prepare( $sql ); };
>>   if( $@ ){ &handle_error(); }
>>   eval{ $sth->execute( 0 ); };
>>   if( $@ ){ &handle_error(); }
>>   __END__
>>
>>   Captou, Rod?
>>   Espero ter ajudado.
>>   Putamplexos!
>>-- 
>>=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>>  Luis Campos de Carvalho is BSc in Comp Science,
>>  PerlMonk [SiteDocClan], Sao Paulo PM Leader,
>>  Unix Sys Admin && Certified Oracle DBA
>>  http://br.geocities.com/monsieur_champs/
>>=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>>
>>_______________________________________________
>>Cascavel-pm mailing list
>>Cascavel-pm em pm.org
>>http://mail.pm.org/mailman/listinfo/cascavel-pm
>>
>>
>
>
>	
>		
>__________________________________ 
>Celebrate Yahoo!'s 10th Birthday! 
>Yahoo! Netrospective: 100 Moments of the Web 
>http://birthday.yahoo.com/netrospective/
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Cascavel-pm mailing list
>Cascavel-pm em pm.org
>http://mail.pm.org/mailman/listinfo/cascavel-pm
>




Mais detalhes sobre a lista de discussão Cascavel-pm