Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3224[/thread]

2 Fragen: Use strict und Apacheneustart?



<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
olruebe01
 2006-12-14 00:41
#30264 #30264
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Hi,

ich habe gerade ein dolles Problem mit einen Mod_Perl-Script.
Der bekannte Fehler: Variablen haben noch ihren alten wert und so werden falsche Ergebnisse ausgegegen.

Es geht hierbei um eine ganz einfache Geschichte: Es werden 3 Formulardaten genommen und nach ein paar If`s per print in Form einer URL ausgegeben. Mehr nicht. Diese Daten kommen nicht aus einer Datenbank oder sowas.

Ich habe meine Scripte mit Use warnings und use strict laufen. Wenn ich das richtig verstehe bedeutet das, dass alle Variablen korrekt deklariert wurden, richtig?
Außerdem ist ein richtig deklarierte Variable nach der Deklarierung leer, oder?

Woher können dann die alten Werte kommen?

Zweite Frage: Muss ich nach einer Änderung im Script Apache neu starten?
ICh habe die Antwort von renee in einem anderen Thread gesehen aber irgendwie hilft mir das nicht weiter. Ich verstehe nicht, was mir dieser lange Text sagen soll.

Danke,
Olli\n\n

<!--EDIT|olruebe01|1166049968-->
ptk
 2006-12-14 01:42
#30265 #30265
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Benutzt du our oder my zum Deklarieren?
olruebe01
 2006-12-14 01:47
#30266 #30266
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
my

Das ist doch richtig, oder?
my @arrnameval; # für @xyz = split...
my %FORMDATA; # für $FORMDATA{$nam} = ....
my $querystring; # für $querystring = ...

richtig?\n\n

<!--EDIT|olruebe01|1166054035-->
olruebe01
 2006-12-14 04:09
#30267 #30267
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Jetzt schnalle ich es nicht mehr...
Habe mir gerade die Umgebungsvariablen aufgerufen...
Rufe ich ein Script unter cgi-perl auf, erhalte ich dieses:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
DOCUMENT_ROOT = /srv/www/web1/html
GATEWAY_INTERFACE = CGI/1.1
HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
HTTP_ACCEPT_ENCODING = gzip, deflate
HTTP_ACCEPT_LANGUAGE = de
HTTP_CONNECTION = Keep-Alive
HTTP_HOST = www.resultado6.de
HTTP_USER_AGENT = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
MOD_PERL = mod_perl/1.999.21
PATH = /sbin:/usr/sbin:/bin:/usr/bin:/lib/klibc/bin
QUERY_STRING = User=em_mz&Galerie=2200hundertteilig&Image=3
REMOTE_ADDR = 201.229.149.228
REMOTE_PORT = 62421

Ist das Modperl oder nicht? Denke eigentlich eher nein.

rufe ich das Script aber über cgi-bin auf, fehlt diese Zeile:
Code: (dl )
MOD_PERL = mod_perl/1.999.21


Alles andere ist gleich.

Läuft das Script nun unter Modperl oder nicht? Und wenn nicht: ISt mein Fehler dann nicht noch viel unverständlicher???\n\n

<!--EDIT|olruebe01|1166098060-->
olruebe01
 2006-12-14 07:41
#30268 #30268
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Problem gelöst (glaube ich), dafür jetzt Neues :-(

Mir ist der Fehler zwar nicht klar aber ich habe eine If-Abfrage, die je nachdem, ob ein bestimmter Feldname ("ITEM") enthalten ist oder nicht, gleich auf eine URL weiterleitet. Nun kam es vor, dass zwar der Feldname übertragen wurde, jedoch OHNE Inhalt. Dies hat das Skript anscheinend als VORHANDEN angesehen.
Die Abfrage lautete if (!$FORMDATA{item}) {...

Dies hat anscheinend für Verwirrung gesorgt. Ich habe das nun so gelöst, dass anstelle eines LEEREN Feldes der Wert 0 übergeben wurde und habe die Abfrage geändert in:
if ($FORMDATA{item} eq 0) {...

So geht es. Aber ich hatte eigentlich gedacht, dass dies unter modperl kein Problem darstelt. Unter cgi läuft es so und ich meine, dass ich das auch in anderen modperl-Skripten so gemacht habe...

Jetzt habe ich aber eine neues Problem mit einer DB-Abfrage. Wenn der Wert ITEM nämlich existiert (bzw. jetzt größer 0 ist), soll in einer DB abgefragt werden, ob dieser Wert eingetragen ist (mehr nicht!! Ja oder nein?). Wenn ja lautet die URL (zur Weiterleitung) so, wenn nicht lautet sie anders.
Klappt aber nicht. Mal sagt die DB der Wert sei drin, mal nicht.

Die DB-Abfrage sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sub blacklist {
use CGI::Carp qw(fatalsToBrowser);
use Fcntl qw(:DEFAULT :flock);
use CGI qw(:standard);
use CGI;
use Apache::DBI();
use DBI;
my $datenbank = "blacklist";
my $datenbankhost = "localhost";
my $datenbankuser = "XXX";
my $datenbankpw = "YYY";

##########################################################
$fehlermeldung = "<li>Fehler bei der Datenbankverbindung aufgetreten. Bitte ueberpruefen Sie die Angaben";
my $dbh = DBI->connect("DBI:mysql:$datenbank:$datenbankhost","$datenbankuser","$datenbankpw") || fehlerausgabe($fehlermeldung);
##########################################################
my $sth = $dbh->prepare("SELECT art FROM `blacklist` WHERE item = '$FORMDATA{item}' and Galerie = '$FORMDATA{Galerie}' ");
$sth->execute or die DBI->errstr;
$ergebnis =  $sth->fetchrow_array();
$dbh->disconnect; # DB Connect beenden

}# Ende sub


Am Anfang des Skriptes habe ich...
Code: (dl )
1
2
3
my %FORMDATA; # sollte doch alle $FORMDATA{a,b,c,usw.} abdecken, oder?
my $ergebnis;
my $fehlermeldung;

Klappt nicht

Habe dann noch zusätzlich
Code: (dl )
1
2
$FORMDATA{Galerie}; # auch mit ="";
$FORMDATA{User};

probiert... klappt auch nicht.
Mal ist $ergebnis so, mal so... Weiß nicht mehr weiter. Die Nacht war SEHR lang...

Und jetzt muss ich mal kurz ins Bett. Tschüss und Danke für jede Hilfe\n\n

<!--EDIT|olruebe01|1166098149-->
pq
 2006-12-14 10:37
#30269 #30269
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
code-tags bitte. nach der anzahl deiner beitraege hier solltest du das wissen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
GwenDragon
 2006-12-14 12:57
#30270 #30270
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
@oelruebe01
Würdest du bitte deinenCode nachträglich in Code-Tags stellen!?
GwenDragon
 2006-12-14 13:00
#30271 #30271
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Wenn du Variablen nicht am Anfang des SKripts im BEGIN-Block und am Ende im END-Block löscht, dann bleiben sie immer im Speicher.
Unter mod_perl leben Variablen solange bis das Skript abstürzt oder der Server herunter gefahren wird.\n\n

<!--EDIT|GwenDragon|1166094657-->
olruebe01
 2006-12-14 14:21
#30272 #30272
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Sorry für die Tags...

@GwenDragon. Ja, generell ist mir das Problem schon bekannt. Dass ich sie am Anfang des Sriktes löschen muss, ist mir auch klar. Mache ich das aber nicht gerade durch das Deklarieren??? Ich habe gelesen, dass ein Variable nach dem Deklarieren leer ist. Auch habe ich gelesen, dass man die Variablen SO SPÄT WIE MÖGLICH Deklarieren sollte.

Und nun kommts: Am Ende auch noch löschen??? Das wäre mir neu.

Blöde Frage: Wie wichtig ist in diesem Falle der BEgin- und End-Block? Ich habe das schon alles Deklariert, allerdings  nicht in einem Block. Davorn höre ich gerade zum ersten mal und muss mich wohl erst schlau lesen.
Ich dachte, dass man die Variablen SO SPÄT WIE MÖGLICH Deklarieren sollte?? Das wiederspricht ja dann einem Begin-Block.


So habe ich es gemacht:
Code: (dl )
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
#!/usr/bin/perl -w

use warnings;
use strict;


my @arrnameval;
my %FORMDATA;
my $querystring;
my $nam;
my $val;
my $namval;
my $ergebnis="";
my $fehlermeldung;
$FORMDATA{item}=0;
$FORMDATA{Galerie}="";
$FORMDATA{User};
if ($ENV{'REQUEST_METHOD'} eq 'GET')
{
    $querystring = $ENV{'QUERY_STRING'};
}
if ($querystring !~ "QQitemZ") {
     @arrnameval = split(/&/, $querystring);
} else {
@arrnameval = split(/QQ/, $querystring);
}

foreach $namval (@arrnameval)
{

  if ($querystring !~ "QQitemZ") {
   ($nam, $val) = split(/=/, $namval);} else {
($nam, $val) = split(/Z/, $namval);}
   $val =~ tr/+/ /;
   $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $FORMDATA{$nam} = $val;
}
...
...


Liegt hier ein / DER Fehler?\n\n

<!--EDIT|olruebe01|1166098995-->
renee
 2006-12-14 14:24
#30273 #30273
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Unabhängig vom Problem solltest Du zum Parsen von Formulareingaben dieVars-Methode von CPAN:CGI verwenden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



View all threads created 2006-12-14 00:41.