的test.html
<!DOCTYPE html>
<html>
<head>
<title>Database test</title>
<link rel="stylesheet" type="text/css" href="test.css">
<script>
function validateForm(n,mes)
{
valid=true;
var x=n.value;
var errn="error_"+n.id;
var email = document.getElementById('EMAIL').value;
var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
//alert(errn);
if (x==null || x=="" || x.trim()=="")
{
document.getElementById(errn).innerHTML=mes;
valid=false;
}
else
{
document.getElementById(errn).innerHTML="";
if(n.id == 'EMAIL')
{
if (!filter.test(email)) {
document.getElementById(errn).innerHTML="Please Provide a valid email address";
email.focus();
valid=false;
} else {
document.getElementById(errn).innerHTML="";
valid=true;
}
}
}
return valid;
}
</script>
</head>
<body>
<h1>Just a Database test</h1>
<form name="SignUp" action="http://127.0.0.1/cgi-bin/connectivity.cgi" onsubmit="return validateForm();" method="post">
Name :<input id="NAME" type="text" name="name" onblur="validateForm(this,'Name must be filled out');"> <p id="error_NAME"></p>
Email :<input id="EMAIL" type="text" name="email" onblur="validateForm(this,'Email must be filled out');"> <p id="error_EMAIL"></p>
<input type="submit" value="Send">
</form>
</body>
</html>
connectivity.cgi
#!C:/usr/bin/perl -w
use CGI;
use strict;
use DBI();
use CGI::Carp qw(fatalsToBrowser);
print "content-type: text/html; charset=iso-8859-1\n\n";
my $q=new CGI;
my $name=$q->param('name');
my $email=$q->param('email');
print $q->header;
#connect to database.
my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost","root","mukesh",
{'RaiseError' => 1});
eval {$dbh->do("CREATE TABLE IF NOT EXISTS emp (name VARCHAR(20), email VARCHAR(50) UNIQUE NOT NULL)")};
print "creating table emp failed: $@" if $@;
print "<br>";
my $sth = $dbh->prepare("SELECT COUNT(*) FROM emp WHERE email = ?");
$sth->execute($email);
my $rows = $sth->fetchrow_arrayref();
$sth->finish();
if (!$rows) {
$sth=$dbh->prepare_cached(<<SQL);
INSERT INTO emp(name,email) values(?,?)
SQL
$sth->execute($name,$email);
$sth->finish();
} else {
print "<h4>$email already exists, please enter a new email address<br></h4>";
exit 1;
}
my $sql = qq/select * from emp order by name/;
$sth = $dbh->prepare($sql) or die "Can't prepare $sql:$dbh->errstrn";
#pass sql query to database handle
my $rv = $sth->execute() or die "can't execute the query: $sth->errstrn";
while (my @row = $sth->fetchrow_array) {
print join(", ",@row),"<br>";
}
$sth->finish();
$dbh->disconnect();
print "<br>Total no of records : $rv";
if ($rv>=1){
print "<br>Record has been successfully updated !!!<br>";
}else{
print "<br>Error!!while inserting record<br>";
exit;
}
我的问题是,在修改mysql数据库之后,我希望输出显示在与表单相同的页面上 但当我按下发送按钮时,它会将我带到一个新页面,输出/错误就会显示如下。
或
我希望电子邮件已经存在的错误出现在电子邮箱框下方和输出中 在同一页面上的发送按钮下方。
我是否需要在我的代码中包含一些其他语言,如ajax或php。 我不知道如何做到这一点,因为我被重定向到另一个详细信息的页面 显示。
答案 0 :(得分:4)
你必须明白: - 带有表单的页面是一个HTML页面,它自己显示。 -activity.cgi是一个单独的页面 - 它也可以单独显示。网络服务器正好碰巧并显示输出。
一种简单的方法就是简单地删除HTML文件,然后从CGI输出HTML。在perl中,您可以执行以下操作:
print "<html> (all your html here down to the end of the form) ";
if (!defined $q->param('name'))
{
# No parameters were passed - user has not submitted the form.
print "Please fill in the form and press send.";
}
else
{
# The parameter exists - so the user has submitted the form
# Go on with your code to do the database work here and output the results
}
print "end html code here </html>";
所以会发生的情况是脚本执行一个显示页面,然后在按下提交时再次执行 - 只有当它显示页面AND显示数据库输出时。
你也可以用ajax做你想做的事。您可以使表单提交按钮对当前的cgi页面执行javascript xmlhttprequest,并使用div的innerHTML将结果插入到您的页面中。