Toon posts:

[Perl/MySQL] 500 internal server error

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zal het even zo duidelijk mogelijk uitleggen allemaal;

Waaar gaat het om?
Het gaat om een script waarmee meerdere users in kunnen loggen,
en (bier?)kosten aan anderen kunnen declareren enzovoort.
Kosten worden opgeteld en je kan zien wat je aan wie moet betalen
en aangeven wanneer je iets betaald hebt.

Ik heb er ERG lang naar gezocht en uiteindelijk iets bruikbaars
gevonden op sourceforge, helaas werkt het dus niet, zit er geen docu bij
en de programmeur reageert niet op help-requests. :(
Dus probeer ik het bij jullie :)

Het script heet 'Margaret' en staat in /cgi-bin/IOU. Om e.e.a. wat te
visualiseren hier wat screenies:

Afbeeldingslocatie: http://members.home.nl/arnaud/margaret1.jpg

Afbeeldingslocatie: http://members.home.nl/arnaud/margaret2.jpg

Dit is de config.pl (uiteraard is dat paswoord niet het paswoord):

code:
1
2
3
4
5
6
7
8
9
10
11
### This file specifies which server to use, and which user to log in as,
### How your e-mail server works, and what your URL is.

$DatabaseName = "IOU";
$DatabaseUser = "suleika";
$DatabasePassword = paswoord;
$SMTPServer = 'localhost';
$SMTPHello = 'perv@home.nl';
$SMTPFrom = 'Betaalherinnering <perv@home.nl>';
$WebserverAddr = 'http://www.cosanostra.nl';
$RootAddr = '/cgi-bin/IOU';


Wat werkt niet
Het is de bedoeling dat ik CreateTables.pl uitvoer, maar die geeft
een 500 internal server error. ALLE andere bestanden ook.
Het is niet het enige Perl-script dat ik gebruik, de rest werkt prima
(heel lang UBB gehad). Ook werkt de database (PHPBB draait er ook
op).
Als ik de werktnogniet.htaccess rename naar .htaccess (wat uiteindelijk
ook moet) word ik gevraagd naar een username/password, maar die
staat nog niet in de database, die moet ik eerst maken met AddUser.pl,
maar daarvoor moet ik eerst de benodigde tables maken en dat lukt dus
niet.

Mogelijke oplossingen
Tenzij één van jullie me zo 123 kan zeggen wat er aan de hand is, zou
het ook een oplossing kunnen zijn om de tables zelf te maken. Misschien
lost dit niets op, aangezien hij geen verbinding met de database kan
maken, of die tables er nou zijn of niet. Maar hoe maak ik van CreateTables.pl
een uitvoerbare tekst die ik in PHPMyAdmin kan pasten?

Dit is CreateTables.pl:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/usr/bin/perl

use CGI qw(:standard);
use DBI;
use strict;

my $query = new CGI;
print $query->header;
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
print "<html>\n";
print "<head>\n";

print "<H3>Testing Perl Install...</H3>\n";
print "Because we you can read this message, your server is capable of running perl code ";
print "and your perl install has CGI and DBI installed.\n";

my $DatabaseName = '';
my $DatabaseUser = '';
my $DatabasePassword = '';

open CONFIG_FILE, "<config.pl" or die "Can't open the config.pl file.";
while (<CONFIG_FILE>) { eval $_; }
close CONFIG_FILE;

my %attr = ( PrintError => 1, RaiseError => 0 );
my $db = DBI->connect("DBI:mysql:$DatabaseName", $DatabaseUser, $DatabasePassword, \%attr )
or do {
    print "<H3>Failed to Log into Mysql</H3>\n";
    print "Tried to log into DBI:mysql:$DatabaseName with user = '$DatabaseUser' and Password = '$DatabasePassword'";
    print "<P>";
    print "If you have not already created the table DBI:mysql:$DatabaseName, you need to build them.  For instance:\n";
    print "<pre>    mysql -u root -p mysql</pre>\n";
    print "<pre>        CREATE DATABASE MarksPhotos</pre>\n";
    print "<pre>    quit;</pre>\n";
    print "And then reload the admin data:\n";
    print "<pre>    mysqladmin -u root -p reload</pre>\n";
    print "</body></html>\n";
    exit -1;
};

print "<H3>Logged into SQL Server</H3>\n";
print "The SQL server allowed our connection.";

my $Action = $query->param("Action");
if ( $Action eq "construct" )
{
    my $rows_affected = $db->do("DROP TABLE Debt;");
    my $rows_affected = $db->do("CREATE TABLE Debt (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    Value DECIMAL(9,2),
                                    CurrencyID INT,
                                    TransactionDate DATE,
                                    ClosedDate DATE,
                                    DebtorStage ENUM('offered', 'debtor_agreed_exists', 'debtor_agreed_paid' ),
                                    CreditorStage ENUM('offered', 'creditor_agreed_exists', 'creditor_agreed_paid' ), 
                                    DebtStage ENUM('in process', 'paid', 'rejected' ),
                                    DebtorID INT,
                                    CreditorID INT,
                                    PoolAgreementID INT default NULL,
                                    CollectionID INT default NULL);");                    
    
    my $rows_affected = $db->do("DROP TABLE Person;");
    my $rows_affected = $db->do("CREATE TABLE Person (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    Name TEXT,
                                    UnixName TEXT,
                                    Email TEXT,
                                    Password TEXT,
                                    ReminderRate INT,
                                    LastReminderSent DATE,
                                    EmailUpdates INT,
                                    HomeCurrency INT,
                                    HTMLEmail INT default 0);");
                                    
    my $rows_affected = $db->do("DROP TABLE Currency;");
    my $rows_affected = $db->do("CREATE TABLE Currency (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    Name TEXT,
                                    RateToPrimaryCurrency FLOAT);");
                                    
    my $rows_affected = $db->do("DROP TABLE PoolPermisions;");
    my $rows_affected = $db->do("CREATE TABLE PoolPermisions (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    Member INT,
                                    PoolID INT,
                                    State ENUM('active member', 'resigned' ));");
                                    
    my $rows_affected = $db->do("DROP TABLE DebtPool;");
    my $rows_affected = $db->do("CREATE TABLE DebtPool (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    Name TEXT,
                                    Owner INT,
                                    TakeNewMembers INT default 1,
                                    TakeNewDebts INT default 1,
                                    ValueLimit DECIMAL(9,2),
                                    TransStartDateLimit DATE,
                                    TransEndDateLimit DATE,
                                    InsertDateLimit DATE);");
                                    
    my $rows_affected = $db->do("DROP TABLE Collection;");
    my $rows_affected = $db->do("CREATE TABLE Collection (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    Value DECIMAL(9,2),
                                    CurrencyID INT,
                                    TransactionDate DATE);");
                                    
    my $rows_affected = $db->do("DROP TABLE CreditorCollectionEntry;");
    my $rows_affected = $db->do("CREATE TABLE CreditorCollectionEntry (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    CollectionID INT,
                                    Type ENUM('percent', 'fraction', 'dollar'),
                                    Value DECIMAL(9,2),
                                    Creditor INT);");
                                    
    my $rows_affected = $db->do("DROP TABLE DebtorCollectionEntry;");
    my $rows_affected = $db->do("CREATE TABLE DebtorCollectionEntry (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    CollectionID INT,
                                    Type ENUM('percent', 'fraction', 'dollar'),
                                    Value DECIMAL(9,2),
                                    Debtor INT);");
                                    
    my $rows_affected = $db->do("DROP TABLE DebtComments;");
    my $rows_affected = $db->do("CREATE TABLE DebtComments (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    DebtID INT NOT NULL,
                                    Author INT,
                                    Content TEXT,
                                    TimeStamp timestamp(14) NOT NULL );");
                                    
    my $rows_affected = $db->do("DROP TABLE CollectionComments;");
    my $rows_affected = $db->do("CREATE TABLE CollectionComments (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    CollectionID INT NOT NULL,
                                    Author INT,
                                    Content TEXT,
                                    TimeStamp timestamp(14) NOT NULL );");
                                    
    my $rows_affected = $db->do("DROP TABLE ReceiptLine;");
    my $rows_affected = $db->do("CREATE TABLE ReceiptLine (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    LineNum INT NOT NULL,
                                    CollectionID INT NOT NULL,
                                    Value DECIMAL(9,2),
                                    Description TEXT,
                                    LifeStage ENUM('in process', 'rejected' ) );");
                                    
    my $rows_affected = $db->do("DROP TABLE ReceiptEntry;");
    my $rows_affected = $db->do("CREATE TABLE ReceiptEntry (
                                    ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                    ReceiptLineID INT NOT NULL,
                                    UserID INT NOT NULL,
                                    Portion DECIMAL(9,2),
                                    LifeStage ENUM('in process', 'rejected' ) );");
}

print "<H3>The Tables That Exist:</H3>\n";
my $Tables_th = $db->prepare("SHOW Tables;");
$Tables_th->execute;

print "<ul>\n";
while (my $row = $Tables_th->fetchrow_arrayref)
{
    my $tableEntry = @$row[0];
    print "<li>$tableEntry<br>\n";  
}
print "</ul>\n";

print "You can delete the entire contents of the database, and then build empty tables.\n";
print "This operation cannot be reversed - the deletion is perminant.\n";
print "       <form method=POST action=\"$ENV{SCRIPT_NAME}\">\n";
print "         <input type=\"hidden\" NAME=\"Action\" VALUE=\"construct\" >\n";
print "        <input type=\"submit\" value=\"Erase and Construct Tables\">\n";
print "      </form>\n";
                        
print "</body></html>\n";


Wat ik kan doen
Ik kan dingen invoeren (pasten) in PHPMyAdmin, heb geen shellaccess
en eigenlijk totaal geen verstand van programmeren. Ook kan ik dus niet
bij logfiles omdat het gewoon een domeinnaam bij een of andere webspaceboer
is.

Ik zou hulp zeer op prijs stellen, ik heb lang gezocht naar een script als dit
en zou heel graag willen dat het werkt. Als iemand desondanks een betere
oplossing weet, hoor ik dat ook graag natuurlijk.

[ Voor 25% gewijzigd door Verwijderd op 02-07-2003 01:37 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
Eigenlijk geen programmeervraag, en dan nog wel zo'n standaard-"ik kan m'n server niet configureren"-verhaal. :/ Maar goed, toch een poging.

Is je script wel executable? (Met de betere applicaties kun je de mode bits instellen, onder de noemer CHMOD) De juiste waarde is uiteraard 755 (ofwel readable en executable voor iedereen waaronder de webserver, daarbij writeable voor alleen jou).

Mik anders eens een lege file met de juiste mode bits (755 dus!) op je home directory met deze inhoud:
Perl:
1
2
3
#!/usr/bin/perl

print "Content-type: text/plain\r\n\r\nHet werkt!";

Probeer dat eens met als bestandsnaam "test.cgi" of "test.pl" (beiden proberen dus!).

Als de tests wel werken, verifieer dan bij je provider of de juiste Perl modules (CGI en DBI) geinstalleerd zijn. Als het probleem 'm zit in de bestandsextentie, pas die van het oorspronkelijke script dan aan.

Heeft ook dit geen effect, controleer dan bij je provider of het pad naar de Perl executable wel klopt (/usr/bin/perl is standaad, maar het mag best wat anders zijn) en of je de juiste extentie gebruikt (sommige providers staan alleen bestanden met bepaalde extenties, zoals dus bijvoorbeeld .pl of .cgi toe).

Al met al blijft het een configuratieprobleem waar eigenlijk je hosting provider je mee moet helpen (wil die dat niet, maak dan een keuze tussen je verdiepen in de materie zodat je het zelf kunt oplossen, of het switchen naar een betere provider). Het is sowieso niet echt een programmeervraag, dus lijkt 'ie me meer geschikt voor NOS dan voor P&W.

[ Voor 10% gewijzigd door Soultaker op 02-07-2003 02:35 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-05 14:03

curry684

left part of the evil twins

Zoals Soultaker al zegt is dit geen programmeerkwestie, en het lijkt me een Apache/MySQL onder Linux probleem dus move ik 'm naar NOS inderdaad.

Professionele website nodig?


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:14
Wat verschijnt er in de Apache errorlog op het moment dat je die error 500 krijgt?

Verwijderd

Topicstarter
Soultaker:
bedankt voor de tip. De door jou gesuggereerde code werkt zowel als test.cgi en als test.pl goed.Uiteraard heb ik alle betrokken bestanden en dirs goed ge-CHMOD, alleen vergat ik dat erbij te zeggen. |:( Ik weet dat het niet echt een programmeervraag is, maar dit was de enige plek waar ik nog goede suggesties zou kunnen krijgen.
/usr/bin/perl is inderdaad standaard, maar het werkt wel. Ik heb nog een of ander mailform script (.pl!) en die gebruikt dat ook. En die werkt prima.

Wilke:
Ik heb geen toegang tot wat voor log dan ook (behalve http accesslog dan). Ik draai dan ook zelf geen server (unlike iedereen hier, aan de search te zien). Ik kan me niet voorstellen dat iemand een website wil bezoeken die op @home wordt gehost. :{
Maar het zou het wel een stuk makkelijker maken, inderdaad.

Verder ben ik het niet eens met de move, want ik heb geen toegang tot de "Non-Windows Operating Systems". Ik heb gewoon FlashFXP, een browser, Frontpage, notepad en een script wat niet werkt. Dat is alles...

- Bestaat voor Perl, net als voor PHP (uuuh, "PhPInfo ()" ofzo) een manier om een overzichtje te genereren van variabelen, instellingen en geïinstalleerde onderdelen? Niet dat ik daar zelf iets aan heb, maar dan zou iemand kunnen zeggen of het daar aan ligt.
- Verder nog ideeën?

[ Voor 21% gewijzigd door Verwijderd op 02-07-2003 13:34 ]


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:14
Verwijderd schreef op 02 July 2003 @ 13:23:

Wilke:
Ik kan me niet voorstellen dat iemand een website wil bezoeken die op @home wordt gehost. :{
Nou nee idd...maar daarom is het nog wel een geweldige 'playground' om lekker te spelen en als het werkt het geheel op de echte server te zetten. Als je nog ergens wat oude hardware hebt slingeren kun je overwegen daarvan een Linux servertje te bouwen. Waarom niet, tenslotte :)
Verder ben ik het niet eens met de move, want ik heb geen toegang tot de "Non-Windows Operating Systems". Ik heb gewoon FlashFXP, een browser, Frontpage, notepad en een script wat niet werkt. Dat is alles...
Toch heeft dit waarschijnlijk wel eerder te maken met de server-configuratie dan met iets aan de Windows-zijde. Tja, van mij hoeft het topic hier ook niet hoor als je er op staat, maar terugmoven lijkt me ook weer zowat >:)
Verder nog ideeën?
Zonder dat ik kan zien wat er fout gaat, behalve dan dat er iets fout gaat (ws. een programma dat segfault of Apache iig zodanig in de war brengt dat 'ie het maar houd op een internal server error)? Nou neuh, helaas ;(

[ Voor 7% gewijzigd door Wilke op 02-07-2003 13:35 ]


  • Red Sonja
  • Registratie: Juli 2001
  • Laatst online: 03-05 19:27

Red Sonja

Linux: power to de wortel

- Bestaat voor Perl, net als voor PHP (uuuh, "PhPInfo ()" ofzo) een manier om een overzichtje te genereren van variabelen, instellingen en geïinstalleerde onderdelen? Niet dat ik daar zelf iets aan heb, maar dan zou iemand kunnen zeggen of het daar aan ligt.
Yup, probeer dit eens:

Perl:
1
2
3
#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach(keys %ENV){ print "$_ : ".$ENV{$_}."<br />\n"; }
- Verder nog ideeën?
Yup
zet dit bovenaan je script (onder #!/usr/bin/perl)

Perl:
1
2
3
4
5
6
print ("Content-Type: text/html\n\n");
use CGI::Carp qw(fatalsToBrowser);
                  BEGIN
                  {
                  use CGI::Carp qw(carpout);
                  }

Hopelijk geeft dat wat foutmeldingen

And the beast shall be made legion. Its numbers shall be increased a thousand thousand fold. The din of a million keyboards like unto a great storm shall cover the earth, and the followers of Mammon shall tremble. from The Book of Mozilla, 3:31

Pagina: 1