0

データベースからデータを読み取り、結果を HTML フォーム/テーブルに出力する Perl スクリプトがあります。各本のフォームには、送信ボタンも含まれています。

Perl でテキスト ファイルを作成し (または作成済みのファイルを読み込んで)、送信されたフォームに含まれていた本のタイトルを出力します。param()しかし、送信アクションをキャッチできないようです!

#!/usr/bin/perl -w

use warnings;      # Allow for warnings to be sent if error's occur
use CGI;           # Include CGI.pm module
use DBI;
use DBD::mysql;    # Database data will come from mysql

my $dbh = DBI->connect('DBI:mysql:name?book_store', 'name', 'password')
    or die("Could not make connection to database: $DBI::errstr");  # connect to the database with address and pass or return error

my $q = new CGI;                     # CGI object for basic stuff
my $ip = $q->remote_host();          # Get the user's ip
my $term = $q->param('searchterm');  # Set the search char to $term
$term =~ tr/A-Z/a-z/;                # set all characters to lowercase for convenience of search

my $sql = '
  SELECT *
  FROM Books
  WHERE Title LIKE ?
    OR Description LIKE ?
    OR Author LIKE ?
';                    # Set the query string to search the database

my $sth = $dbh->prepare($sql);    # Prepare to connect to the database

$sth->execute("%$term%", "%$term%", "%$term%")
    or die "SQL Error: $DBI::errstr\n";  # Connect to the database or return an error

print $q->header;
print "<html>";
print "<body>";

print " <form name='book' action='bookcart.php' method=post> ";  # Open a form for submitting the result of book selection

print "<table width=\"100%\" border=\"0\"> ";

my $title  = $data[0];
my $desc   = $data[1];
my $author = $data[2];
my $pub    = $data[3];
my $isbn   = $data[4];
my $photo  = $data[5];

print "<tr> <td width=50%>Title: $title</td> <td width=50% rowspan=5><img src=$photo height=300px></td></tr><tr><td>Discreption Tags: $desc</td></tr><tr><td>Publication Date: $pub</td></tr><tr><td>Author: $author</td></tr><tr><td>ISBN: $isbn</td> </tr></table> <br>";

print "Add this to shopping cart:<input type='submit' name='submit' value='Add'>";

if ($q->param('submit')) {
    open(FILE, ">>'$ip'.txt");
    print FILE "$title\n";
    close(FILE);
}

print "</form>";    # Close the form for submitting to shopping cart
4

3 に答える 3

3
  • use strictすべての変数を強制的に宣言するために , を使用していません。これは悪い考えです

  • クライアント ホスト システムの名前remote_hostであるを使用しました。サーバーがこの値を解決できない場合があり、その場合は未設定のままになります。IPアドレスが必要な場合は、remote_addr

  • SQL ステートメントを準備して実行しましたが、クエリからデータを取得していません。結果が配列にあることを期待しているように見え@dataますが、この配列を宣言していません。あなたがuse strict実際に持っていたなら、あなたはこれについて言われたでしょう

  • ファイル名に文字列'$ip'.txtを使用したため、ホスト名の代わりに IP アドレスを正しく使用していた場合、ファイルは'92.17.182.165'.txt. そこに一重引用符が本当に必要ですか?

  • 呼び出しのステータスを確認しないopenため、オープンが成功したかどうか、または失敗した理由がわからない

この 48 時間を本当にコーディングに費やしたかどうかは疑問です。土壇場で急いで何かをまとめて、Stack Overflow を使用して、自分で掘った穴から抜け出す可能性がはるかに高いと思います。

他の人に助けを求める前に、少なくとも適用などの最小限の適切なコーディング方法を使用する必要がありますuse strict$ipまた、コードをデバッグするために最善を尽くす必要があります。間違った値を持ち、@data空であることを見つけるのにほとんど時間はかかりませんでした。

于 2013-05-12T14:13:34.743 に答える
-2

これは、CGI.pm に対して OO アプローチを使用していること、および $q が関連するオブジェクトであることを前提としています。$q = new CGIスクリプトのどこかにあると仮定すると、これは機能するはずです。

残りのスクリプトを投稿できますか?

これをテストするためにモックアップを作成しましたが、期待どおりに動作します。

#!/usr/bin/perl

use CGI;

my $q = new CGI;

print $q->header;
print "<form><input type=submit name=submit value='add'></form>\n";

if ($q->param('submit')) {
    print "submit is \"" . $q->param('submit') . "\"\n";
}

送信ボタンをクリックsubmit is "add"すると、評価が計画どおりに進んでいることを示すページが表示されます。

$q が CGI オブジェクトであることを確認し、そこから先に進む必要があると思います。

于 2013-05-12T11:38:40.943 に答える