我正在编写一个Perl程序,将名称和年龄信息插入MySQL表中,并显示该表的当前内容。
这是XHTML数据
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN""http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Perl Database Interfaces</title>
</head>
<body>
<form action="/cgi-bin/10.pl" method="post">
<p> <b>Enter Your Information</b> <br />
Name: <input type="text" name="name" /> <br />
Age: <input type="text" name="age" /> <br />
<input type="submit" value="Add" />
<input type="reset" value="Clear" />
</p>
</form>
</body>
</html>
这是Perl代码
#!/usr/bin/perl
use CGI ':standard';
print "content-type:text/html\n\n";
use DBI;
$dbh = DBI->connect( "DBI:mysql:Temp", "root", "" );
$name = param( "name" );
$age = param( "age" );
$sql = "insert into Students values ('$name','$age')";
$sth = $dbh->prepare( "$sql" );
$sth->execute;
$sql = "select * from Students";
$sth = $dbh->prepare( $sql );
$sth->execute;
print "<table border size=1> <tr>
<th>Name</th>
<th>Age</th> </tr> ";
while ( ( $name, $age ) = $sth->fetchrow() ) {
print "<tr>
<td>$name</td>
<td>$age</td>
</tr> ";
}
$sth->finish();
$dbh->disconnect();
print "</table>";
数据已插入数据库(我使用终端手动检查),但数据未显示在Web浏览器上。显示表标题但不显示行。看看我得到的输出
我做错了什么?
答案 0 :(得分:0)
use strict;
use warnings;
use CGI qw(:standard);
use DBI;
my $dbh = DBI->connect("dbi:SQLite:dbname=:memory:", undef, undef, {
RaiseError => 1,
PrintError => 0,
});
$dbh->do(q{
create table students (
name varchar(255),
age int
)
});
my $name = param("name");
my $age = param("age");
$dbh->do(q{insert into students values (?, ?)}, undef, $name, $age);
print header();
print <<'EOF';
<table border='1'>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
EOF
my $sth = $dbh->prepare(q{select name, age from students});
$sth->execute;
while (($name, $age) = $sth->fetchrow_array) {
print <<EOF;
<tr>
<td>$name</td>
<td>$age</td>
</tr>
EOF
}
print qq~</table>\n~;
$ perl 40949974.pl 'name=John Smith&age=30'
Content-Type: text/html; charset=ISO-8859-1
<table border='1'>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<tr>
<td>John Smith</td>
<td>30</td>
</tr>
</table>
通过使用内存中的SQLite数据库并通过命令行提供CGI参数,我们有一个完整的,自包含的示例。对于插入,除非您插入一堆记录(例如,在循环中),否则您实际上不需要prepare
/ execute
循环。我还使用了占位符并为插入绑定了值,这可以为您正确地转义变量。但是,如果您通过网页接受用户输入,则还需要进行其他验证。
您可以阅读DBI documentation以了解有关这些概念的更多信息。