-1

perl/MySQL を十分に理解していないので、ここで誰かが助けてくれることを願っています。コードは明らかに機能しませんが、これは私がこれまでに持っているものであり、まだ学習中です。

PHPページから取得したデータベースを開いて検索し$ticket_id、メールアドレスおよび/または電話メールのいずれかまたは両方を取得したいと考えてい$ticket_idます。少なくとも 1 つ存在します。

たまに聞かれるようなので。(これは学校のプロジェクトではありません。私は 75 歳から学校を休んでいます)。

スクリプトは情報のデータベース ルックアップなしで機能していますが、各セットアップに ticket_id と電子メール アドレスを使用して手作業でコーディングする必要があります。これを使っている人が 5 人しかいないことを嬉しく思いますが、他の人から使いたいという問い合わせを受けています。ですから、MySQL データベースを使用するプロセスを合理化する良い機会になると思います。MySQL データベースで忙しくなった場合、情報を追加するためにフォーム ページに記入する以外に多くの作業を行う必要はありません。

検索が必要なデータベースには 3 つのテーブルがあり、ticket_id を検索して、メール アドレスや電話番号であるユーザー名を取得する必要がありますが、必要な通知の種類によってはどちらも空になる可能性があります。

これは、必要に応じて変更できます。この新しいセットアップで機能するレコードは 1 つだけです。

username:  email(at)address(dot)com
ticket_id: 1-YS25UHRN3N9D
phone: 1234567890(at)cellphone(dot)com

これは JavaScript window.onload で実行できると言われたので、HTML ページを PHP に変更する必要はありませんが、JavaScript はまったく知りません。

echo スクリプトが間違っている可能性があります。$pg現時点ではスクリプトは問題なく受信しており、echo必要ありません。

PHPページの先頭へ

<?php
  $ip = $_SERVER['REMOTE_ADDR']; // Client IP address
  $pg = $_SERVER['HTTP_REFERER']; // What page did they view
  $ticket_id = '1-YS25UHRN3N9D'; // Ticket id
  $message = '1'; // 1=email, 2=text, 3=email & text
  $url = "/cgi-bin/log_it.cgi"; // back-end url
echo '<script type="text/javascript" src="' . $url . '?id=' . $id . '&amp;ip=' . $ip 
.  '?ticket_id=' . $ticket_id . ' . '?message=' . $message . '"></script>';
?>

データベースのログイン情報を cgi に入れるのが悪いと言われたのですが、それを php ファイルに加工して perl などからファイルにアクセスする方法がわかりません。

#!/usr/bin/perl -W

use CGI;
use CGI param;
use POSIX qw/strftime/;

# database
$host = "localhost";
$database = "users";
$tablename = "tickets";
$user = "username";
$pw = "password";

# Obtain $id & $ip from web page.
$id = param("ticket_id");
$ip = param("ip");

# message
# 1 = email
# 2 = phone
# 3 = both
$message = param("message");

# Connect to database
$connect = Mysql->connect($host, $database, $user, $pw);

# DB
$connect->selectdb($database);

# MySQL QUERY
$myquery = "SELECT ticket_id FROM user";

# QUERY
$myquery = "SELECT ticket_id FROM $tablename";

# Need to be worked on.
# If record not found.
#
#  "To Do" send a page or popup if the id is not valid.
#    $file = "/var/log/invalid_id_iptrace.txt";
#    open(FILE, ">$file");
#   print FILE strftime("%A %B %d, %Y - %I:%M %p %Z\n", localtime(time) );
#    print FILE " -- IP Address: $ip\n\t Accessed unknown $id:\n------\n";
#    close(FILE);
#    system("mail -s 'Page visited Unknown' admin\@mydomain.com \< /var/log
#    /invalid_id_iptrace.txt");
# exit();

#check if we have a matching $id == $ticket_id
if ($id =~ /$ticket_id/) {

 #if we have a match open the file to write.
 $file = "/var/log/$ticket_id_iptrace.txt";
 open(FILE, ">$file");

 # lets put the time in the file.
 print FILE strftime("%A %B %d, %Y - %I:%M %p %Z\n", localtime(time) );

 # put the IP address and web page visited.
 print FILE " -- IP Address: $ENV{REMOTE_ADDR}\n\t Accessed your page:
 $ENV{HTTP_REFERER}\n------\n";
 print FILE " -- Here is the IP information we found:\n------\n";

 #close the file. Finished with the first part
 close(FILE);

 # Run the IP2Location script.
 system("./iptrace.sh $ENV{REMOTE_ADDR} json city>>/var/log/$ticket_id_iptrace.txt");

 # Lets send an email and or text with all the information.

 # Send email
 if($message =~ /1/) {
  system("mail -s 'Web Page visited' $username \< /var/log/$ticket_id_iptrace.txt");
 }

 # Send text
 if($message =~ /2/) {
  system("mail -s 'Web Page visited' $phone \< /var/log/$ticket_id_iptrace.txt");
 }

 # Send email and text message
 if($message =~/3/) {
  system("mail -s 'Web Page visited' $username \< /var/log/$ticket_id_iptrace.txt");
  system("mail -s 'Web Page visited' $phone \< /var/log/$ticket_id_iptrace.txt");
 }
 exit();
 }

exit();
#end of script

ありがとうございました

更新:コードの 2 番目の (クリーンアップされた) バージョン:

#!/usr/bin/perl
use warnings;
use strict;
use CGI qw/param/;
use DBI();

# database
my $host = "remotehost";
my $database = "database";
my $tablename = "table";
my $user = "user";
my $pw = "pwd";

# Obtain $id & $ip from web page.
my $id = param("id");
my $ip = param("ip");
my $ticket_id = "ticket_id";
my $file = "/tmp/_iptrace.txt";
my $fileb = "/tmp/invalid_id_iptrace.txt";
my $fh = "FILE";
my $phone = "phone";
my $username = "username";
# message
# 1 = email
# 2 = phone
# 3 = both
my $message = param("message");

# Connect to database
my $connect = Mysql->connect($host, $database, $user, $pw);

# DB
$connect->selectdb($database);

 # QUERY
my $myquery = "SELECT ticket_id FROM $tablename";

# EXECUTE
my $execute = $connect->query($myquery);

#check if we have a matching $id == $ticket_id
if ($id == $payer_id) {
#if we have a match open the file to write.
open(my $fh, '>', $file) or die $!;

# lets put the time in the file.
print $fh strftime("%A %B %d, %Y - %I:%M %p %Z\n", localtime(time) );

# put the IP address and web page visited.
print $fh " -- IP Address: $ENV{REMOTE_ADDR}\n\t Accessed your page:
    $ENV{HTTP_REFERER}\n------\n";
print $fh " -- Here is the information we found:\n------\n";

#close the file. Finished with the first part
close($fh);

# Run the IP2Location script.
system("./iptrace.sh $ENV{REMOTE_ADDR} json city>>/tmp/$ticket_id$file");

# Lets send an email and or text with all the information.
# Send email
    if($message == 1) {
    system("mail -s 'Web Page visited' $username \< /tmp/$ticket
            _id$file");
    }
    # Send text
    if($message == 2) {
    system("mail -s 'Web Page visited' $phone \< /tmp/$ticket
            _id$file");
}
# Send email and text message
if($message == 3) {
    system("mail -s 'Web Page visited' $username \< /tmp/$ticket
            _id$file");
    system("mail -s 'Web Page visited' $phone \< /tmp/$ticket
            _id$file");
    }
exit();
}
#  "To Do" send a page or popup if the id is not valid.

open($fh, ">$fileb");
print $fh strftime("%A %B %d, %Y - %I:%M %p %Z\n", localtime(time) );
print $fh " -- IP Address: $ip\n\t Accessed unknown $id:\n------\n";
close($fh);
system("mail -s 'Page visited Unknown' admin\@mydomain.com \<
/tmp/invalid_id_iptrace.txt");

exit();
#end of script
4

1 に答える 1

3

あなたの投稿には質問がないようです。あなたは「コードは明らかに機能しない」と言っていますが、予期しない動作がどのようなものであるかは教えてくれません。したがって、ここにコードに関するいくつかのコメントがあります。それらの1つが問題に対処する可能性があります。

1/ シバン行では「-W」ではなく「-w」にする必要があります。実際、最近では「-w」を削除use warnings;して、シバン行のすぐ下に含める必要があります。

use strict;2/のすぐ下にも追加する必要がありますuse warnings;。これは、すべての変数を事前に宣言することを主張するため、プログラムを完全に壊しているように見えます-これはmy(my $host = 'localhost'などを使用して)。これは最初は面倒ですが、慣れるにはとても良い習慣です。

3/ 必要な行は 1use CGI行だけです。そして、そうあるべきですuse CGI qw/param/;

4/ Mysql というクラスを使用しています。しかし、そのクラスをどこにもロードしません。そのクラスはどこから来たのですか?DBIDBD::mysqlを組み合わせて使用​​する必要があります。

5/ SQL クエリを に入れまし$mysqueryたが、すぐに別のクエリで上書きしました。これでエラーが発生することはありません。おそらく、あなたが混乱していることを示しているだけです。

6/ あなたif ($id =~ /$ticket_id/)はほぼ確実に のように書かれたほうがよいif ($id == $ticket_id). 2 つの数値を比較するだけであれば、正規表現を使用する必要はありません。

7/ への呼び出しからの戻り値を実際に確認する必要がありますopen

open(FILE, ">$file") or die $!;

実際、3 引数のオープンと自動有効化されたファイルハンドルを使用するように書き直します。

open(my $fh, '>', $file) or die $!;

次に、コード全体を変更FILEする必要があります。$fh

8/ 繰り返しますが、3 つの比較は、正規表現マッチングを使用するのではなく、$message単純な一致にすることができます。==

これをたくさん行うつもりなら、「Learning Perl」や「Beginning Perl」などの優れた本を読むことを強くお勧めします。

于 2013-02-21T09:41:50.010 に答える