Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种使用Perl从MySql提取数据的“一次性”方法?_Mysql_Perl_Dbi - Fatal编程技术网

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

是否有一种使用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

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

我使用的是一个Perl/DBI脚本,它按照用户语言和required部分从数据库中提取文本,方法是准备一个查询,执行查询,然后将结果记录复制到一个数组中。不过,对我来说,这一切似乎非常繁琐和低效

这是我现在使用的业务终端

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