0

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>

接続.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 db をクエリした後、出力をフォームと同じページに表示したいのですが、送信ボタンを押すと新しいページに移動し、出力/エラーがこのように表示されることです。

ここに画像の説明を入力

また

エラー

私は、電子メールの既存のエラーが電子メールボックスの下に表示され、出力が以下の同じページの送信ボタンの下に表示されるようにします。 マイフォーム

このためにコードに ajax や php などの他の言語を含める必要がありますか。詳細が表示されている別のページにリダイレクトされているため、これを行う方法がわかりません。

4

1 に答える 1

4

次のことを理解しておく必要があります。 -フォームを含むページは、単独で表示される HTML ページです。- activity.cgi は別のページで、単独でも表示されます。Web サーバーはたまたまそれを実行し、出力を表示します。

必要なことを行う簡単な方法の 1 つは、単純に 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>";

したがって、スクリプトが実行されてページが表示され、送信が押されたときに再度実行されます。そのときだけ、ページが表示され、データベース出力が表示されます。

ajaxでやりたいこともできます。フォーム送信ボタンで現在の cgi ページに対して javascript xmlhttprequest を実行し、div の innerHTML を使用して結果をページに挿入できます。

于 2013-09-17T05:56:05.563 に答える