簡體   English   中英

無法使用命令行將電子郵件地址傳遞給Perl腳本

[英]Unable to pass email address to Perl script using command line

我正在嘗試將兩個電子郵件地址傳遞給MySQL以查找其帳戶。 我這樣稱呼我的腳本:

./message-2.pl  user1@s  'rech user2@s 22'

這是我的腳本:

#!/usr/bin/perl

use warnings;
use strict;
use DBI;
use IO::Handle;

our $calerid = "'$ARGV[0]'";
our $message = "$ARGV[1]";
our $msg_arg1 = qx(echo $message | awk '{print \$1}');
our $msg_arg2 = qx(echo $message | awk '{print \$2}');
my $share_reciver =  "'$msg_arg2'";

my $database = "mya2billing";
my $host = "localhost";
my $port = "3306";
my $user = "root";
my $pass = "xxxxxx";
my $dsn = "DBI:mysql:database=$database;host=$host;port=$port";
my $sth;

# find card id
my $query1 = "SELECT  id_cc_card FROM cc_callerid WHERE cid = $calerid ;";
my $dbh = DBI->connect($dsn, $user, $pass) || die "Could not connect to database:$DBI::errstr";
our $card;
print " query=$query1\n";

if (!($sth = $dbh->prepare($query1))) {
    die ("Failed to prepare statement: " . DBI->errstr);
}                           
$sth->execute() or die $DBI::errstr;
my @result;  
while (@result = $sth->fetchrow_array) { # retrieve one row
    ($card) = @result;
    print "card id found: $card \n";
}   

if ($msg_arg1 =~ "rech" or $msg_arg1 =~ "Rech"  or $msg_arg1 =~ "bal" or $msg_arg1 =~ "Bal") {
    recharge();
}   

sub recharge {
    print " we are in rech section\n";
    our $msg_arg2 = qx(echo $message | awk '{print \$2}');
    our $share_reciver="$msg_arg2";


    my $query2 = "SELECT id_cc_card FROM cc_callerid WHERE cid = '$share_reciver' ";
    my $dbh = DBI->connect($dsn, $user, $pass);
    $sth = $dbh->prepare($query2);
    $sth->execute() or die $DBI::errstr;

    print " query=$query2\n";
    my $receiver_id;

    while (my @row = $sth->fetchrow_array) {
        ($receiver_id) = @row;
        print " we are in query section\n";
        print "receiver_cardid:$receiver_id \n";
    }

    exit 1;
}

這是輸出:

[root@laptop Desktop]# ./message-2.pl  user1@s  'rech user2@s 22'
query=SELECT  id_cc_card FROM cc_callerid WHERE cid = 'user1@s' ;
card id found: 10 
we are in rech section
query=SELECT id_cc_card FROM cc_callerid WHERE cid = 'user2@s
' 

沒有錯誤。 query1工作正常但query2無法正常工作。 我試圖使用占位符而不是$share_reciver但它不起作用。 我也試過單引號而沒有引號。 如果我使用$calerid而不是$share_reciver那么它可以正常工作。 誰能告訴我我失蹤了什么?

為sql查詢使用placeholders and bound variables 永遠不要只是將原始變量放在sql字符串中:

my $sth = $dbh->prepare(q{SELECT id_cc_card FROM cc_callerid WHERE cid=?})
$sth->execute($calerid) or die $dbh->errstr;

您必須調整$calerid的初始化, $calerid周圍沒有單引號,因為使用占位符可以解決這個問題:

our $calerid = $ARGV[0];

此外,僅連接到您的數據庫一次就足夠了。 您不必為每個查詢執行此操作。 因此,只需將connect語句放在腳本的開頭即可。 您甚至可以隔離db connect依賴的所有常量,以便以后在腳本中不可用:

our $dbh = do {
    my $database = "mya2billing";
    my $host = "localhost";
    my $port = "3306";
    my $user = "root";
    my $pass = "xxxxxx";
    my $dsn = "DBI:mysql:database=$database;host=$host;port=$port";

    DBI->connect($dsn, $user, $pass) or die "DB connect failed: $DBI::errstr";
};

重申一下,你的第二個查詢也應該使用占位符,如下所示:

my $sth = $dbh->prepare('SELECT id_cc_card FROM cc_callerid WHERE cid=?');
$sth->execute($share_reciver) or die $dbh->errstr;

最后,您似乎沒有驗證來自外部資源qx{}的返回內容。 至少,我懷疑返回的內容可能包含您不期望的返回字符。 因此,只需chomp

our $msg_arg2 = qx(echo $message | awk '{print \$2}');
chomp $msg_arg2;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM