-2

我有一个 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 提取每一行文本,但这需要一个单独的“执行”语句和“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;

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

4

1 回答 1

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);
}

也就是说,这样的 sub 已经作为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);
}
于 2012-04-03T20:29:52.653 回答