-2

多言語 Web サイトのすべてのテキストを含む 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>
~;

この方法の問題点は、これらの行の 1 つをデータベースから削除したり、新しい行をいくつか追加したりしたい場合はどうすればよいかということです。最初から配列を介して「盲目的に」インクリメントするだけのスクリプト全体を台無しにします。この例では、データベースの 2 行目を削除して 2 つの新しい行を挿入したい場合、スクリプトの関連部分を書き直す必要があります。そうしないと、間違った順序で出力されます。

もちろん、テキストの各行を「絶対」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;

あなたはアイデアを得る.. ;) このようなことは可能ですか? 前もって感謝します!

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

とはいえ、そのようなサブルーチンは (構文は少し異なりますが) のメソッドとして既に存在します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 に答える