是否有一种使用Perl从MySql提取数据的“一次性”方法?
我有一个MySql数据库,它包含多语言网站的所有文本,每种不同的语言都在一个单独的列中。例如,列'en',id 1='Hello',列'fr',id 1='Bonjour',等等 我使用的是一个Perl/DBI脚本,它按照用户语言和required部分从数据库中提取文本,方法是准备一个查询,执行查询,然后将结果记录复制到一个数组中。不过,对我来说,这一切似乎非常繁琐和低效 这是我现在使用的业务终端是否有一种使用Perl从MySql提取数据的“一次性”方法?,mysql,perl,dbi,Mysql,Perl,Dbi,我有一个MySql数据库,它包含多语言网站的所有文本,每种不同的语言都在一个单独的列中。例如,列'en',id 1='Hello',列'fr',id 1='Bonjour',等等 我使用的是一个Perl/DBI脚本,它按照用户语言和required部分从数据库中提取文本,方法是准备一个查询,执行查询,然后将结果记录复制到一个数组中。不过,对我来说,这一切似乎非常繁琐和低效 这是我现在使用的业务终端 omy (@TEXT, $getText); $getText = $dbh->prepar
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>
~;
对于我来说,这个方法的问题是,如果我想从数据库中删除其中一行,或者添加一些新行,该怎么办?它打乱了整个脚本,从一开始就只是通过数组“盲目”递增。在本例中,如果我删除了数据库中的第二行,并希望插入两行新行,则必须重写脚本的相关部分,否则它将以错误的顺序打印
当然,我可以通过'absolute'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;
你明白了;
这样的事情可能吗?提前谢谢 是的,这是绝对可能的。它们被称为子程序
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);
}
有趣的如果第一个不是:printf%s\n,&选择行数组$sth,$i;谢谢,但我希望Perl能够在打印过程中动态地获取它们。我不熟悉PHP,但我很确定您不必首先将所有数据复制到数组中。。?但可能是错的。。。您的第二个建议看起来最好,但仍然没有我漂亮的伪代码那么流畅..:谢谢你的帮助@silkfield,如果您认为读取记录时不涉及数组,那么您就大错特错了。@silkfield,Re&,no,为什么要指示Perl禁用原型?潜艇连一个都没有。@silkfield,事实上,它比你的伪码还要光滑。我所做的唯一更改是删除了您的冗余代码,以支持循环。至于插值的实现,printf比串联要干净得多,不需要调用finish。看见我真希望我叫它discard_pending_rows。
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);
}