PDA

Visualizza la versione completa : [PERL] cosa non funziona?


Kevin
11-09-2004, 11:10
Ciao
premetto che non conosco perl ho solamente dovuto spostare un sito da un server ad un altro ma questo script non funziona .... mi potete dire cosa ha di sbagliato?


#!/usr/bin/perl

$dberr="dberr.htm";

# Variabili per l'accesso al db
$NomeDB = "dbname";
$UserDB = "username";
$portDB = 5432;

use Pg qw(PGRES_EMPTY_QUERY
PGRES_COMMAND_OK
PGRES_CONNECTION_OK
PGRES_TUPLES_OK
PGRES_COPY_OUT
PGRES_COPY_IN
PGRES_BAD_RESPONSE
PGRES_NONFATAL_ERROR
PGRES_FATAL_ERROR);
use Pg;

sub DatiHTML
{ # Prendo i dati della richiesta
if ($ENV{"REQUEST_METHOD"} eq 'GET') { $buffer = $ENV{'QUERY_STRING'}; }
else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
$buffer .= $ARGV[0];
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\n/ /g;
if ($name ne "immagine")
{
$value=uc($value);
}
$FORM{$name} = $value;
}
}



# Collega un DB
sub connect
{
($dbname, $pguser, $pgport) = @_;

$p = "password";

$dbc = Pg::connectdb("user=$pguser port=$pgport dbname=$dbname password=$p");

unless ($dbc->status eq PGRES_CONNECTION_OK) {
print("Impossibile collegarsi al DB $NomeDB\n");
}

if ($DEBUG) {
open(TRACE, ">> /tmp/trace.out") || die "can not open trace: $!";
$dbc->trace(*TRACE);
}

return $dbc;
}

&DatiHTML;

$coll = &connect($NomeDB, $UserDB, $portDB);

$sql="select autore, titolo from dati where genere='PUD' order by autore";
#print "Content-Type: text/html\n\n$sql";

$ris = $coll->exec($sql); # Esegue la SQL

if ($ris->resultStatus eq 2)
{
$num=$ris->ntuples;
if ($num>0)
{
# print "$num";
$domini="";
for ($i=0; $i<$num; $i++)
{
($autore, $titolo) = $ris->fetchrow();
$domini .=" <TR>
<TD height=30>
<P align=center><font face=\"Verdana, Arial\" size=\"2\" color=\"#fbdc04\">$autore</font></P></TD>
<TD height=30>
<P align=center><font face=\"Verdana, Arial\" size=\"2\" color=\"#fbdc04\">$titolo</font></P></TD>
</TR>
";
}
}
else
{
print "Content-Type: text/html\n\n";
print "<HTML>
<HEAD>
<TITLE>Visualizzazione degli prossime uscite discografiche</TITLE>
</HEAD>

<body topmargin=\"0\" leftmargin=\"0\" bgcolor=\"#000066\" text=\"#ffffff\" link=\"#ffffff\" vlink=\"#ffffff\" alink=\"#ffffff\">
<P align=center><FONT face=Arial size=5></FONT></P>
<P align=center></P>
<P align=center></P>
<P align=center><FONT face=Arial size=5>ATTUALMENTE NON E' PREVISTA </FONT><FONT
face=Arial size=5>NESSUNA
NUOVA USCITA DISCOGRAFICA!</FONT></P>
<P align=center><FONT face=Arial size=5>RIPROVATE PIU' TARDI!</FONT></P>
</body>
</html>";
exit(1);
}
}
else
{
# Problemi di connessione al database
print "Content-Type: text/html\n\n";
open (PAGE, "<$dberr") || die "Impossibile aprire il file $dberr!";
while (<PAGE>)
{
print "$_";
}
close PAGE;
exit(0);
}



print "Content-Type:text/html


<HTML>
<HEAD>
<TITLE>Le prossime uscite discografiche di Musical Box</TITLE>
</HEAD>

<body topmargin=\"0\" leftmargin=\"0\" bgcolor=\"#000066\" text=\"#ffffff\" link=\"#fbdc04\" vlink=\"#fbdc04\" alink=\"#fbdc04\">
<DIV align=center>
<P align=center><FONT face=Arial size=5 color=\"#fbdc04\">Le prossime uscite discografiche di Musical Box!</FONT></P>
<P align=center>
<table border=\"2\" align=\"center\" cellpadding=\"0\" cellspacing=\"2\" width=\"60%\">
<tr>
<td height=\"70\" align=\"center\" bgcolor=\"#041c81\"><font color=\"#ffffff\" face=\"Verdana, Arial\" size=\"2\">Autore</font></td>
<td align=\"center\" bgcolor=\"#041c81\"><font color=\"#ffffff\" face=\"Verdana, Arial\" size=\"2\">Titolo</font></td>
<tr>
$domini
</TABLE></font>
</P></DIV>
</body>
</html>
";

exit(0);


nel log del server mi da questo errore: Premature end of script headers
grazie

Kevin
11-09-2004, 19:18
nessuno mi può aiutare?

Mich_
13-09-2004, 14:51
Non credo che un print puoi spezzarlo su righe diverse.
Devi usare print >> al suo posto.
(non ricordo la sintassi esatta, ma ne trovi vari esempi dentro lo script FormMail (ne trovi una copia nel sito di Shishii) o in altri script.

Poi nel tuo script ci sono dei print commentati: non vorrei che hai tolto il print della prima riga e lasciato le successive, per cui la pagina non puo` venir visualizzata.

Ulitma cosa: in questa riga:
if ($ris->resultStatus eq 2)

Se e` un confronto tra stringhe deve essere
if ($ris->resultStatus eq '2')

Se e` un confronto tra numeri:
if ($ris->resultStatus == 2)

Kevin
14-09-2004, 14:00
Ciao Mich_
intanto grazie per avermi risposto, ora proverò a sfruttare i tuoi consigli il problema reale è che non ho fatto io gli script visto che non conosco Perl, ho spostato questo sito da un server al mio e sto cercando di rimettere in moto il tutto.

:ciauz:

Kevin
14-09-2004, 15:02
Allora sembrerebbe che non sia un problema si sintassi .... :(
ho provato a eseguire lo script da shell e mi ritorna una cosa del genere:
Can't locate Pg.pm in @INC( /usr/..........
che cosa è?

Mich_
14-09-2004, 15:14
Ti manca il modulo
Pg.pm

Lo chiami nel tuo programma dalla riga
use Pg { ... }

Per sapere cosa sono i moduli e come si usano, puoi vedere il sito di shishii. Io non ho mai usato quel modulo, e non so neppure a cosa serva.

shishii
14-09-2004, 16:34
Ciao,

Pg.pm è un modulo per interfacciarsi al database PostgreSQL. Non è più usato da anni infatti l'ultimo aggiornamento è del 2000. Ormai per interfacciarsi ai database si usa:

use DBI;
my $driver = 'pg';

my $dsn = "DBI:$driver:database=$database;host=$host;$options";

my $dbh = DBI->connect($dsn, "$userid", "$passwd");

cioè l'interfaccia comune DBI + il driver specifico, che nel tuo caso è DBD::Pg.

Quindi o cambi script o chiedi all'amministratore di istallare il modulo Pg che trovi su http://search.cpan.org

Kevin
14-09-2004, 17:09
ecco mi pareva ....
io l'ho scaricato per installarlo come si fa? Basta metterlo in qualche cartella?
Me lo puoi spiegare perfavore?

shishii
14-09-2004, 17:21
Non è possibile (o meglio... è molto complesso) istallarlo per un utente, in quanto quel modulo ha una parte in C che va compilata e linkata a librerie di sistema.

Kevin
14-09-2004, 18:40
me lo devo installare da me :(
ho un server dedicato con l'assistenza ma per ste robe mi hanno detto che mi devo arrangiare ....

Loading