Perl CGI 将空值发送到 mySQL 数据库?

Perl CGI sending null values to mySQL database?

场景:我有一个 HTML 表单发送变量到 Perl CGI,然后接收它们并将它们插入到我之前创建的 SQL 数据库中,但问题是它发送只有 NULL 值到数据库 - 它确实发送了 "correct number" 的空值,所以我不知道出了什么问题。我有一种感觉,这与传递给 Perl 而不是 Perl 传递给 DB 的变量有关。 Perl 文件:

  #! \xampp\perl\bin\perl.exe -w

require "dbfunc.pl";

use warnings;
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);


$table  = "routes";
#$spotted = "spotted";
$booked = "bookings";
$logged = "log";

$dbh = getConnection();




print header;
print start_html("Journey Details");

$name = param($name);
$email = param($email);
$price = param($price);
$date = param($date);
$departure = param($departure);
$arrival = param($arrival);
$adults = param($adults);
$children = param($children);
$totalCost = param($totalCost);
$departureTime = param($departureTime);
$arrivalTime = param($arrivalTime);
$jid = param($jid);



    $dbh->do("INSERT INTO $logged VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", undef,
           $date, $date, $name, $email, $departure, $arrival, $departureTime, $adults, $children, $totalCost);

    #my $sth = $dbh->prepare(qq{INSERT INTO $logged SET DateBooked=?, Journeydate=?, Name=?, Email=?, RouteFrom=?, RouteTo=? , DepartTime=?, Adults=?, Children=?, AmountPaid=?});
    #$sth->execute($date, $date, $name, $email, $departure, $arrival, $departureTime, $adults, $children, $totalCost) or die $dbh->errstr;


print end_html;

最初采用 vars 的第一个 perl 文件:

#! \xampp\perl\bin\perl.exe -w

use CGI qw(:standard);
$query = new CGI;
@parameters = $query -> param;

print header, start_html("Receipt");

    print p("Your Journey Receipt");

    my $name = $query->param('name');
    print ("Name: $name");

    print br;

    my $email = $query->param('email');
    print ("Email: $email");

    print br;

    my $price = $query->param('price');
    print ("Price: &pound$price");

    print br;

    my $date = $query->param('date');
    print ("Journey date: $date");

    print br;

    my $departure = $query->param('departure');
    print ("From: $departure");

    print br;

    my $arrival = $query->param('arrival');
    print ("To: $arrival");

    print br;

    my $adults = $query->param('adults');
    print ("Adults: $adults");

    print br;

    my $children = $query->param('children');
    print ("Children: $children");

    print br;

    my $totalCost = $query->param('totalCost');
    print ("Total Cost:  &pound$totalCost");

    print br;

    my $departureTime = $query->param('departureTime');
    print ("Departure: $departureTime");

    print br;

    my $arrivalTime = $query->param('arrivalTime');
    print ("Arrival: $arrivalTime");

    print br;

    my $jid = $query->param('jid');
    print ("Journey ID: $jid");

    print br;

    print qq!<br><form><input type="Button" value="Back" onclick="history.back()"></form>!;
    print qq!<br><form method="get" action="serverside.pl">!;
    print qq!<input type="submit" value="Confirm Booking" />\n</form><br />!;

print end_html;

同样的错误你犯了好几次。我将使用第一个实例作为示例:

$name = param($name);

您获取 $name 的值(您尚未定义)并使用它从 HTTP 请求中获取参数。由于没有定义,你得不到你要找的结果,所以你得不到$name.

中提交的数据

据推测您打算:

$name = param('name');

现在更新您使用的表格:

print qq!<br><form method="get" action="serverside.pl">!;
print qq!<input type="submit" value="Confirm Booking" />\n</form><br />!;

除了提交按钮(没有 name 属性)之外,您没有任何 <input> 元素,因此没有要提交的数据。

您误解了 CGI 程序的工作方式。它们不会相互发送数据:它们是作为网络浏览器上的一个动作的结果而执行的,如果该动作是点击表单 submit 按钮,那么它们将根据该表单的 <input> 元素的名称和内容接收一组参数。

您的脚本没有按应有的方式 use strict,shebang 行上的 -w 几乎重复了 use warnings 语句的操作。你应该只使用后者。

正如 Quentin 所说,数据库中的 NULL 值是因为您正在调用 $name = param($name),因为 $name 未定义,所以与 $name = param('') 相同。您需要使用固定字符串,就像您在其他脚本中所做的那样 $name = param('name').

但这假设 某处 有一个 CGI 脚本或只是一个 HTML 文件,其中有一个 <form> 元素,所有这些 <input> 字段。单击此类表单上的 submit 将执行 action 属性中指定的脚本并将所有字段的内容传递给它。

你的两个脚本中的第一个需要表单输入,并将该表单的内容写入数据库,而两个脚本中的第二个(你说的是 第一个 perl 文件!) 期待表单输入,但构建了一个包含信息的网页。问题是你似乎没有在任何地方写过那个表格。

我认为你需要的是将两个 CGI 脚本结合起来,以便在单击 submit 时脚本 both 将信息写入数据库 and 将其显示在屏幕上。而且您还需要编写该表格,正如我所说,它可能只是一个普通的 HTML 文件。

将表单输入和数据库更新结合在一个脚本中也很常见,它会检查是否传递了任何参数。如果有 none 则它显示输入表单并等待响应。否则,它们用于更新数据库并显示确认页面。

希望对您有所帮助。