Perl、HTML和MySQL我的程序在哪里中断了?

Perl、HTML和MySQL我的程序在哪里中断了?,mysql,perl,error-handling,internal-server-error,Mysql,Perl,Error Handling,Internal Server Error,是的,我是一名学生,是的,这是一项作业,但我只是需要一些帮助来解决问题。我不想让别人帮我做家庭作业 所以我有一个数据库,里面有5本书,6列不同的数据。我正在尝试制作一个perl程序,它可以搜索数据库并在表中返回结果。我必须添加一种方法,将它们添加到购物车中,但这将在稍后进行 Perl的问题是我不知道如何检查为什么会出现内部服务器错误。应用程序进入Perl页面,所以我猜不是这样 #!/usr/bin/perl use warnings; # allow for warnings to b

是的,我是一名学生,是的,这是一项作业,但我只是需要一些帮助来解决问题。我不想让别人帮我做家庭作业

所以我有一个数据库,里面有5本书,6列不同的数据。我正在尝试制作一个perl程序,它可以搜索数据库并在表中返回结果。我必须添加一种方法,将它们添加到购物车中,但这将在稍后进行

Perl的问题是我不知道如何检查为什么会出现内部服务器错误。应用程序进入Perl页面,所以我猜不是这样

    #!/usr/bin/perl

use warnings; # allow for warnings to be sent if error's occur
use CGI qw( :standard ); # not a 100% sure what the rest of these mean but they are like #includs in C++, libraries for reference in the code
use DBI;
use DBD::mysql; #database data will come from mysql

my $dbh = DBI->connect( "DBI:mysql:DATABASE NAME", "USERNAME", "PASS REMOVED" ) or
   die( "Could not make connection to database: $DBI::errstr" );   # connect to the database with address and pass or return error

   $term = $SEARCHTERM[]; #set the search char to $term

   $term =~ tr/A-Z/a-z/;  #set all characters to lowercase for convenience of search

   $sql = "SELECT * FROM Books WHERE Title LIKE %$term% OR Description LIKE %$term% OR Author LIKE %$term%" or die ("$term may have not worked");            #set the query string to search the database

   $sth = $dbh->prepare($sql);  # prepare to connect to the database

   $sth->execute   # connect to the database
 or die "SQL Error: $DBI::errstr\n";   #or return an error
 while (@data = $sth->fetchrow_array) {   #while we are grabbing he queried data do a table setup and set variables for table

print "<table width=\"100%\" border=\"0\"> ";

    $title = $data[0];
    $desc = $data[1];
    $author = $data[2];
    $pub = $data[3];
    $isbn = $data[4];
    $photo = $data[5];

    print "<tr> <td width=50%>Title: $title</td> <td width=50% rowspan=5>$photo</td></tr><tr><td>Discreption Tags: $desc</td></tr><tr><td></td></tr><tr><td>Author: $author</td></tr><tr><td>ISBN: $isbn</td>
</tr></table> \n";



 }  

请帮忙

您的选择无效。改变

$sql = "SELECT * FROM Books WHERE Title LIKE %$term% OR Description LIKE %$term% OR Author LIKE %$term%"


应该引用LIKE的模式文字。

首先,我还强烈建议添加use strict;到脚本的顶部,然后修复将出现的错误,主要是使用my声明变量

我还可以建议使用现代框架,比如说,而不是使用非常过时的CGI模块。它们都可以在类似CGI的环境下运行,并且更易于使用


最后,您应该避免在SQL字符串中插入变量,因为这会带来巨大的安全风险!有关此主题的更多信息,请尝试此网站:

早些时候,有人建议

my $sql = "
   SELECT *
     FROM Books
    WHERE Title LIKE '%$term%'
       OR Description LIKE '%$term%'
       OR Author LIKE '%$term%'
";
my $sth = $dbh->prepare($sql);
$sth->execute();
假设他对你的问题是对的,那是不对的。想想如果有人在搜索Foo的标题……

会发生什么? 备选案文1:

my $sql = '
   SELECT *
     FROM Books
    WHERE Title LIKE '.$dbh->quote("%$term%").'
       OR Description LIKE '.$dbh->quote("%$term%").'
       OR Author LIKE '.$dbh->quote("%$term%").'
';
my $sth = $dbh->prepare($sql);
$sth->execute();
备选案文2:

my $sql = '
   SELECT *
     FROM Books
    WHERE Title LIKE ?
       OR Description LIKE ?
       OR Author LIKE ?
';
my $sth = $dbh->prepare($sql);
$sth->execute("%$term%", "%$term%", "%$term%");

堆栈溢出不是解决此问题的合适位置。我们不进行代码调试。您需要自己进行调试,如果您不确定某些东西为什么不能按预期工作,请发布相关代码如果您发布了一堆代码,那么您自己还没有完成足够的调试,并解释了您希望它做什么以及它实际在做什么,包括所有错误消息。看,听起来真正的问题是“如何跟踪perl脚本中的501错误?”这似乎是完全合理的。检查您的apache日志?所有CGI程序在打印任何其他内容之前都必须发出一个头。最小的头是打印内容类型:text/html\n\n,但最好使用来自的头方法-有关示例,请参阅概要。如果执行了一个die,您会在日志中找到消息,而客户端会得到一个500Thank,我不确定这些文本的语法Joel在他的回答中正确地添加了一个链接。上面的代码可能有效,但任何人都不应该使用它。
my $sql = '
   SELECT *
     FROM Books
    WHERE Title LIKE ?
       OR Description LIKE ?
       OR Author LIKE ?
';
my $sth = $dbh->prepare($sql);
$sth->execute("%$term%", "%$term%", "%$term%");