[英]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.