2017-01-25 4 views
0

今日のSQL文を実行しようとしています。たとえば、「今日が25日ならばSQLを実行し、それ以外の場合は今日は有効な累計ではありません」月のある特定の日にのみSQLを実行する

私は接続して、いくつかのHTMLを構築する前に、いくつかのSQLを実行するために DBIを使用している基本的

は、自動的に電子メールで送信する

をしかし、私は次のような構文エラーを取得しています:。

構文エラーでXXXXX、近くに "、そうでない場合は" (暴走複数行{ }文字列XXから始まる) 行末のXXXXXに右括弧または角括弧がありません。

私は、(私がやっていると思われる)式の中に命令を直接埋め込むことはできないと読んでいます。このスクリプトは、day要素とelseステートメントなしでうまくいきました。

# Get the current day of the month (along with other date parts we can ignore) 
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); 

## Filter based on day of week 

my $sql; 

if ($mday == 25) { 
    $sql = qq{<MY SQL STATEMENT HERE> 
} 
else { 
    say "Today is not a valid rundate"; 
} 

## Prepare and execute the SQL 

my $sth = $dbh->prepare($sql) or die "Failed to prepare SQL: " . $dbh->errstr; 
$sth->execute() or die "Failed to execute SQL: " . $dbh->errstr; 

## Start building the HTML output 

my $html = qq{ 
<table style="width:100%"><thead> 
    <tr> 
     <th>#</th> 
     <th>col1</th> 
     <th>col2</th> 
     <th>col3</th> 
    </tr> 
</thead> 
}; 

## Loop round each row in the result set, and add to the HTML output for each one. 

my $count = 0; 

while (my $row = $sth->fetchrow_hashref) { 
    # 
    # process rows 

    $count++; 

    #say Dumper $row; 
    #say "$row->{col1}, $row->{col2}, $row->{col3}"; 
    $html .= qq| 
    <tr> 
     <td align="right">$count.</td> 
     <td>$row->{col1}</td> 
     <td>$row->{col2}<td> 
     <td>$row->{col3}</td> 
    </tr> 
    |; 
} 

## Close the HTML 

$html .= "</table>"; 

say "$count rows processed."; 

$html .= "<h2>Report SQL</h2>The report was produced with the following SQL<p><pre>$sql</pre>"; 

## Send the mail 
my $sender = new Mail::Sender(); 

$sender->Open({ 
    from  => 'email1', 
    to  => $maildest, 
    subject => $mailsubj, 
    ctype => "text/html", 
    encoding => "quoted-printable", 
    smtp  => "localhost" 
}) or die $Mail::Sender::Error, "\n"; 

$sender->SendEnc($html); 
$sender->Close(); 

$dbh->disconnect; 
+3

これは[mcve]これは単なる転記エラーかもしれませんが、 '$ sql = qq { 'の文で' qq'を閉じたことはありません。 – ThisSuitIsBlackNot

答えて

2

ここで最も簡単な方法は、例えば、ちょうどすぐに死ぬことです。:

die "Today is not a valid rundate\n" unless 25 == $mday; 

あなたのコードの残りの部分は、(それが既に働いていると仮定した場合)は変更されません。私は毎日、それが有効な放課後ではないと言って電子メールを送信したくないと思います。

個人的には、私はこれをしないで、crontabエントリに月の日を指定するだけで、必要に応じて簡単に日を変更することができます。

+0

ありがとうございました。これは魅力のように機能し、建設的であることを感謝します。 –

2

あなたが表示しているコードが実行しているコードであれば、文字列qq{<MY SQL STATEMENT HERE>を閉じていないことが問題であることは明らかです。あなたは後で同様の構造を使用したので、それはあなたがそれがどのように見えるかを知っているように見えます。

しかし、現在の日が25日でなければ、とにかく。あなたは未定義$sqlを残し、何もあなたが完全に実行を停止する必要が

を起こらなかったかのように executeprepareに試してみて、あなたは

if ($mday != 25) { 
    say "Today is not a valid rundate"; 
    exit; 
} 

my $sql = qq{<MY SQL STATEMENT HERE>}; 
my $sth = $dbh->prepare($sql) or die "Failed to prepare SQL: " . $dbh->errstr; 
$sth->execute() or die "Failed to execute SQL: " . $dbh->errstr; 

のようなものを書くべきかあなたは、sayの代わりにdieを使用することができましたexit

また、区切り文字の一貫性を維持する必要があります。特別な理由がないのに、普通の二重引用符"..."と同様に、括弧またはパイプでqqの混合物を使用しています。これらのいずれかを選択してそれに固執してください。

また、表示されるエラーメッセージにも注意する必要があります。あなたがエラーの行番号を見ていたら、あなたは自分自身に問題を理解してもらえたかもしれないが、無関係で無用であるかのようにそれらをXXXに置き換えてください。

+0

ありがとう、私はコメントを感謝し、私は引数が真ではないが実行を停止する必要があるという事実に同意するが、私はそれを構築する方法を完全にはわからなかった。また、私は行番号を削除した理由は、SQLを削除したので、それはかなり役に立たないレンダリング機密情報だったためです。ありがとうございました –

+0

* NIXなら、あなたはCRONジョブを使うことができます。そのようにしてスクリプト –

+0

@DuncanCarr:cronジョブの問題は、不思議なことに実行を止めることができ、誰も何ヶ月も気付かないということです。 – Borodin

関連する問題