我是Perl编程的初学者,我想了解Perl中的OOP。我开发了一个关于sql creator的简单应用程序,但是我有一个问题。我认为问题是传递多个参数。
False
这是我的示例代码。如果你解决了这个问题,请帮助我。
答案 0 :(得分:7)
您不能将数组传递给subs,只传递标量。当你这样做
starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? new DateTime() : rdr.GetDateTime(4);
endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? new DateTime() : rdr.GetDateTime(5);
您将以下内容传递给方法:
my $sql = $object->createInsertSql(
'person', @column, @value );
在方法内,你有
$object, 'person', $column[0], $column[1], ..., $value[0], $value[1], ...
首先,您忘记了对调用者的说明。应该有一个前导my ( $table, @column, @value ) = @_;
参数。
其次,无法知道要添加到$self
的标量数量和添加到@column
的标量数量,因此除了第一个之外的所有标量都添加到@value
。< / p>
这意味着您有效地执行了以下操作:
@column
如果要传递数组,请将引用传递给它。
my $table = $object;
my @column = ( 'person', $column[0], $column[1], ..., $value[0], $value[1], ... );
my @value = ();
子变为
my $sql = $object->createInsertSql( 'person', \@column, \@value );
顺便说一下,你的代码充满了注入错误。您没有正确地将文本转换为SQL标识符和SQL字符串文字。
修正:
sub createInsertSql {
my ( $self, $table, $column, $value ) = @_;
my $sql = 'INSERT INTO '.$table; # XXX Injection bug
$sql .= createInsertColumn(@$column);
$sql .= createInsertValue(@$value);
return $sql;
}
package SqlCreator;
use warnings;
use strict;
sub new {
my ( $class, %args ) = @_;
return bless \%args, $class;
}
sub createInsertSql{
my ( $self, $table, $cols, $vals ) = @_;
my $dbh = $self->{dbh};
return sprintf(
'INSERT INTO %s ( %s ) VALUES ( %s )'
$dbh->quote_identifier($table),
( join ', ', map { $dbh->quote_identifier($_) } @$cols ),
( join ', ', map { $dbh->quote($_) } @$vals ),
);
}
1;