簡體   English   中英

如何將我的Perl腳本與MySQL查詢同步

[英]How to synchronize my Perl script with MySQL query

同步表

寄出表

我在各種意義上的編碼方面都是新手,請多多包涵。

我已經創建了一個Perl腳本,可以與我的PHP應用程序進行通信,但是卻陷入了將它們與MySQL查詢同步的最后障礙。 我希望Perl腳本讀取數據庫中的表Syncorderrelation ,並僅自動響應一次,通過將“自動響應”張貼在“發往表”上的文本消息發送到滿足以下條件的任何新條目,以發送文本消息:

  1. 該條目的updatetype為1,這意味着新條目是已訂閱產品的新個人。

  2. Perl腳本讀取DEST_MSISDN的新條目,該條目是同一Syncorderrelation表(僅一個電話號碼)上的一個字段,並使用自動響應(僅一個歡迎消息)答復該號碼。 這是通過僅在“發送表”上發布“自動響應”來完成的,我的PHP應用程序將在該位置上接管並自行發送響應。

所以我的問題是:如何創建一個查詢,使Perl腳本Syncorderrelation當前時間起自動答復Syncorderrelation表中的新條目。 與目前一樣,我不想觸發其他數百個條目。

但是,僅發送對New DEST_MSISDN (電話號碼)的答復,並且僅答復該電話號碼,並且僅這樣做一次,因此不能保持將相同的歡迎消息一次又一次地發送到相同的號碼。

注意 :腳本可以知道它是新條目的唯一方法是通過ID字段。 這是一個唯一字段,每當一個新條目進入Syncorderrelation表時,該字段就會自動生成(現在該表將從其當前的“ 440”數量增加到“ 441”)。

我創建的職位該腳本正確地從所有必要的字段SyncoderrelationOutgoing表,但我無法讀取新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的prepareexecute的,而不是do在大多數情況下。 參數應使用占位符傳遞,而不是通過將其插值到SQL字符串中來傳遞

  • 最好詢問數據庫它認為是什么時間,而不是使用本地系統時間。 這樣,可以正確比較數據庫中不同表上的時間戳

  • 您應該對事務中的多個表進行相關更改,以便在發生錯誤的情況下,一個更改不能沒有另一個更改

至於我可以告訴你正在尋找所有的條目syncorderrelation有一個updatetype的1和相應的行incoming_smssent_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.

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