[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