2013-05-11 2 views
0

Да, я студент, да, это задание, но мне просто нужна помощь в расчистке. Я не собираюсь кого-то делать для меня домашнюю работу.Perl, HTML и MySQL, где моя программа прерывалась?

Итак, у меня есть база данных с 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"; 



} 

Помогите!

+0

переполнение стека не подходящее место для этого вопроса , Мы не делаем отладки кода. Вам нужно сделать свою собственную отладку, и если вы не уверены, почему что-то не работает должным образом, разместите * соответствующий * код (если вы разместите стену кода, то вы не сделали достаточно отладки самостоятельно) с помощью объяснение того, что вы ожидали от этого, и что он на самом деле делает, включая все сообщения об ошибках. См. [О переполнении стека] (http://stackoverflow.com/about). –

+2

Похоже, что реальный вопрос заключается в том, «как отследить ошибку 501 в perl-скрипте?», Что кажется вполне разумным для SO. Возможно, проверьте свои журналы apache? – bchurchill

+1

Все программы CGI должны издавать заголовок, прежде чем печатать что-либо еще. Минимальный заголовок - «print» Content-type: text/html \ n \ n "', но лучше использовать метод 'header' из [CGI] (https://metacpan.org/module/MARKSTOS/CGI.pm- 3.63/lib/CGI.pm) - см. Синопсис для примера. Если «die» будет выполнен, вы найдете сообщение в журналах, а клиент получит 500 – amon

ответ

1

Ваш выбор недействителен. Изменение

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

к

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

Pattern литералы для LIKE должны быть указаны.

+0

. Спасибо, я не был уверен в синтаксисе этих литералов. –

+1

Joel правильно добавил ссылку на http: // bobby -tables.com/в его ответе. Код выше может работать, но никто не должен его использовать. – innaM

2

Во-первых, могу ли я также рекомендовать добавить use strict; в начало сценария, а затем исправить ошибки, которые вы получите, в основном объявляя переменные с помощью my.

Также я могу предложить использовать современные рамки, например, сказать Mojolicious, а не использовать очень устаревший модуль CGI. Все они могут работать под CGI-подобной средой и легче использовать FAR!

И, наконец, вы должны избегать интерполяции переменных в строки SQL с огромной угрозы безопасности! Попробуйте этот сайт для более по теме: http://bobby-tables.com/

4

Ранее кто-то предложил,

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%"); 
Смежные вопросы