是否有使用Perl从MySql中提取数据的“一次性”方法?

时间:2012-04-03 20:04:51

标签: mysql perl dbi

我有一个MySql数据库,其中包含多语言网站的所有文本,每个不同的语言都在一个单独的列中。 (例如,列'en',id 1 ='Hello',列'fr',id 1 ='Bonjour'等等)

我正在使用Perl / DBI脚本,通过准备查询,执行查询,然后将结果记录复制到数组,按照通常的方式根据用户语言和必需部分从数据库中提取文本。这对我来说似乎非常麻烦和低效。

这是我现在正在使用的业务结束。

omy (@TEXT, $getText);
$getText = $dbh->prepare("SELECT `$language` FROM text WHERE Page_Section = ? ORDER BY line_number");
$getText->execute('Section_Name');
while($_ =  $getText->fetchrow_array){push(@TEXT, $_)};
$getText->finish;

print qq~
<p>$TEXT[0]</p>
<p>$TEXT[1]</p>
<p>$TEXT[2]</p>
~;

对我来说这个方法的问题是,如果我想从数据库中删除其中一行,或添加一些新行怎么办?它弄乱了整个脚本,它只是从一开始就“盲目地”通过数组递增。在这个例子中,如果我删除了数据库中的第二行并想插入两个新行,我将不得不重写脚本的相关部分,否则它将以错误的顺序打印。

我当然可以通过'绝对'ID来提取每行文本,但这需要为我想要的每一段文本单独的'execute'语句和'fetchrow_array'行。

是否有一种更简洁的方式,比如一次性“拉动和打印”方法,我可以抓住单个字段并根据ID输出它们?类似的东西......(警告 - 伪代码来了)

$query = $dbh->prepare(SELECT 'language' FROM 'text' WHERE 'id' = ?);

print qq~
<p>$query->execute(0)</p>
<p>$query->execute(1)</p>
<p>$query->execute(2)</p>
~;
$query->finish;

你明白了。;) 这样的事情可能吗?提前谢谢!

1 个答案:

答案 0 :(得分:4)

是的,这绝对是可能的。它们被称为“子程序”。

sub selectrow_array {
   my $sth = shift;
   $sth->execute(@_)
      or return ();
   my $row = $sth->fetch();
      or return ();
   $sth->finish()
      or return ();
   return @$row;
}

my $sth = $dbh->prepare(q{SELECT 'language' FROM 'text' WHERE 'id' = ?});

for my $i (0..2) {
   printf "<p>%s</p>\n", selectrow_array($sth, $i);
}

那就是说,这样一个子已经存在(虽然语法略有不同)作为dbh的方法。

my $sth = $dbh->prepare(q{SELECT 'language' FROM 'text' WHERE 'id' = ?});

for my $i (0..2) {
   printf "<p>%s</p>\n", $dbh->selectrow_array($sth, undef, $i);
}