Perl CGI向mySQL数据库发送空值?

时间:2015-03-15 14:22:21

标签: html mysql perl cgi dbi

场景:我有一个HTML表单,它将变量发送到Perl CGI,然后接收它们并将它们插入到我之前创建的SQL DB中,但问题是它只向数据库发送NULL值 - 它确实发送尽管如此,“正确数字”的空值我不知道出了什么问题。我觉得这与传递给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;

最初采用变量的第一个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;

2 个答案:

答案 0 :(得分:2)

您误解了CGI程序的工作方式。他们不会将数据发送到另一个:他们是在网络浏览器上执行操作后执行的,如果该操作是单击表单提交按钮,那么他们将收到根据该表格<input>元素的名称和内容的一组参数。

您的脚本不应该use strict,而且shebang行上的-w几乎与use warnings语句的操作重复。你应该只使用后者。

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

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

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

我认为您需要合并两个CGI脚本,以便在单击submit时,脚本 将信息写入数据库在屏幕上显示它。而且你还需要编写那个表格,正如我所说的那样只是一个简单的HTML文件。

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

我希望这会对你有所帮助。

答案 1 :(得分:0)

你犯了几次同样的错误。我将使用第一个例子:

$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 />!;

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