[英]How to synchronize my Perl script with MySQL query
我在各種意義上的編碼方面都是新手,請多多包涵。
我已經創建了一個Perl腳本,可以與我的PHP應用程序進行通信,但是卻陷入了將它們與MySQL查詢同步的最后障礙。 我希望Perl腳本讀取數據庫中的表Syncorderrelation
,並僅自動響應一次,通過將“自動響應”張貼在“發往表”上的文本消息發送到滿足以下條件的任何新條目,以發送文本消息:
該條目的updatetype
為1,這意味着新條目是已訂閱產品的新個人。
Perl腳本讀取DEST_MSISDN
的新條目,該條目是同一Syncorderrelation
表(僅一個電話號碼)上的一個字段,並使用自動響應(僅一個歡迎消息)答復該號碼。 這是通過僅在“發送表”上發布“自動響應”來完成的,我的PHP應用程序將在該位置上接管並自行發送響應。
所以我的問題是:如何創建一個查詢,使Perl腳本Syncorderrelation
當前時間起自動答復Syncorderrelation
表中的新條目。 與目前一樣,我不想觸發其他數百個條目。
但是,僅發送對New DEST_MSISDN
(電話號碼)的答復,並且僅答復該電話號碼,並且僅這樣做一次,因此不能保持將相同的歡迎消息一次又一次地發送到相同的號碼。
注意 :腳本可以知道它是新條目的唯一方法是通過ID
字段。 這是一個唯一字段,每當一個新條目進入Syncorderrelation
表時,該字段就會自動生成(現在該表將從其當前的“ 440”數量增加到“ 441”)。
我創建的職位該腳本正確地從所有必要的字段Syncoderrelation
表Outgoing
表,但我無法讀取新Dest_Msisdn
從(電話號碼) Syncorderrelation
表,並張貼的電話號碼的Outgoing
表。 沒有它,PHP應用程序將不知道將歡迎消息發送到哪里。
use strict;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use XML::Simple;
use Digest::MD5 qw(md5_hex);
use Time::Piece;
use DBI;
use Time::HiRes qw(usleep nanosleep);
my $dest_msisdn = '';
my $link_id = '';
my $ID = '';
my $subscription_auto_reply = '';
my $user = '';
my $send_time = '';
my $now = '';
my $correlator = '2345';
my $sender_name = '30045';
my $source = '30045';
my $text_message = 'Dear Customer Welcome to our service';
my $ua = new LWP::UserAgent(keep_alive => 1);
#get all the configs
#get sms to be sent
#set the connection
my $dbh = DBI->connect('DBI:mysql:Database404', 'Kapo', 'XXXXXXXXX') || die "Could not connect to database: $DBI::errstr";
my $j = 0;
while ($j < 1) {
print "AutoResponse....\n";
my $sql = "SELECT * FROM syncorderrelation WHERE updatetype = '1'";
my $results = $dbh->selectall_hashref($sql, 'id');
foreach my $id (keys %$results) {
print "AutoResponder!!!.....\n";
#get all the required columns
#get all the required columns
my $textMessage = $results->{$id}->{text_message}; #$results->{$id}->{dest_msisdn};
my $correlator = $results->{$id}->{id};
my $senderName = $results->{$id}->{sender_name};
my $linkID = $results->{$id}->{link_id};
my $textID = $results->{$id}->{id};
my $client = $results->{$id}->{client};
my $productId = $results->{$id}->{product_id};
my $dest_msisdn = $results->{$id}->{dest_msisdn};
my $text_message = $results->{$id}->{text_message};
my $autoReply = $results->{$id}->{autoreply};
#####send service
my $user = 5;
my $send_time = time;
my $now = time;
#catch error
my $sql1 = "INSERT INTO outgoing_sms(dest_msisdn, text_message, sender_name, link_id, correlator, send_time, client, user_id, timestamp) VALUES ('$dest_msisdn', 'Dear Customer Welcome to our service', '$sender_name', '$link_id', '1161', '$now', '1', '$user', '$now')";
$dbh->do($sql1);
#print $sql1;
###send
print $sql1;
#remove from outgoing table
my $sql2 = "UPDATE incoming_sms SET sent_flag = 1 WHERE id='$correlator'";
$dbh->do($sql2);
print $sql2;
}
usleep(1000000);
}
我對您的代碼有很多觀察
始終 use warnings
以及use strict
不要在程序頂部聲明所有變量。 應該聲明它們盡可能靠近其第一使用點
您可以use
許多不必要的模塊,以及許多未使用或兩次重復使用的變量。 在尋求幫助之前整理一下代碼是有禮貌的。 使用整潔的程序也容易得多,但這是您自己的事。
同樣,除非您必須實現太復雜以至於難以理解的代碼,否則不要寫注釋。 並說說某些代碼是如何工作的,而不是它的作用:在對DBI->connect
的調用是荒謬的之前,注釋set the connection
您應該使用DBI的prepare
和execute
的,而不是do
在大多數情況下。 參數應使用占位符傳遞,而不是通過將其插值到SQL字符串中來傳遞
最好詢問數據庫它認為是什么時間,而不是使用本地系統時間。 這樣,可以正確比較數據庫中不同表上的時間戳
您應該對事務中的多個表進行相關更改,以便在發生錯誤的情況下,一個更改不能沒有另一個更改
至於我可以告訴你正在尋找所有的條目syncorderrelation
有一個updatetype
的1和相應的行incoming_sms
有sent_flag
未設置為1。對於這一點,你需要一個JOIN
在兩個表。
該代碼應如下所示。 (請參閱-一個模塊,更少的變量聲明!)但是很明顯,如果沒有訪問測試數據,我無法檢查它。
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect('DBI:mysql:Database404', 'Kapo', 'XXXXXXXXX')
or die "Could not connect to database: $DBI::errstr";
my $get_new_ids = $dbh->prepare(<<__ENDSQL__);
SELECT syncorderrelation.* FROM syncorderrelation INNER JOIN incoming_sms
ON incoming_sms.id = syncorderrelation.id
WHERE syncorderrelation.updatetype = 1 AND incoming_sms.sent_flag != 1
__ENDSQL__
my $insert_outgoing = $dbh->prepare(<<__ENDSQL__);
INSERT INTO outgoing_sms (
dest_msisdn,
text_message,
sender_name,
link_id,
correlator,
send_time,
client,
user_id,
timestamp)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
__ENDSQL__
my $update_incoming = $dbh->prepare('UPDATE incoming_sms SET sent_flag = 1 WHERE id = ?');
while () {
while (my $data = $get_new_ids->fetchrow_hashref) {
my ($now) = $dbh->selectrow_array('SELECT CURRENT_TIMESTAMP');
$dbh->do('START TRANSACTION');
$insert_outgoing->execute(
$data->{dest_msisdn}, # dest_msisdn,
'Dear Customer Welcome to our service', # text_message,
$data->{sender_name}, # sender_name,
$data->{link_id}, # link_id,
1161, # correlator,
$now, # send_time,
1, # client,
5, # user_id,
$now, # timestamp
);
$update_incoming->execute($data->{id});
$dbh->do('COMMIT');
}
sleep 2;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.