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: £$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: £$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 则它显示输入表单并等待响应。否则,它们用于更新数据库并显示确认页面。
希望对您有所帮助。
场景:我有一个 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: £$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: £$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 则它显示输入表单并等待响应。否则,它们用于更新数据库并显示确认页面。
希望对您有所帮助。