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? (Seite 3)



<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
olruebe01
 2006-12-14 18:37
#30284 #30284
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
so... jetzt kommen wir der Sache näher...

ich habe dieses Script jetzt nachgebaut und lasse mir immer die SQL-Abfrage anzeigen und das ergebnis.
Die SQL-Abfrage leibt immer gleich aber das Ergebnis ändert sich.
Entweder wird das korrekte Ergebnis ausgegeben oder soetwas wie "HASH(0x9bdbda4)"..
Dieses HASH wird ab und an ausgegeben. Sowohl wenn ein Eintrag besteht, als auch, wenn KEIN Eintrag besteht...

Was bedeutet das???\n\n

<!--EDIT|olruebe01|1166114864-->
nepos
 2006-12-15 11:49
#30285 #30285
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ohne jetzt explizit zu deinem Problem was zu wissen, aber du solltest bei SQL die Variante mit den Platzhaltern nutzen:
Code (perl): (dl )
1
2
3
my $sth = $dbh->prepare("SELECT art FROM `blacklist` WHERE item = ? and Galerie = ?");
$sth->execute($FORMDATA{item},$FORMDATA{Galerie})
  or die DBI->errstr;

Damit übernimmt das DBI-Modul das quoten der Werte und du bist relativ gut gegen SQL-Injection abgesichert.
olruebe01
 2006-12-16 02:34
#30286 #30286
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Hi Nepos: Danke aber genützt hats nix. Aber ich werde diesen Tip natürlich zukünftig beherzigen...

Es gibt auch neue Erkentnisse: Ich habe jetzt am Anfang des Skripts $ergeniss = "HASH" zugewiesen. Dann habe ich die Datenbankabfrage solange wiederholen lassen, bis $ergebnis nicht mehr "HAH" beinhaltet. Es müsste jetzt also die Datenbankagfrage solange wiederholt werden, bis der korrekte Wert ausgegeben wird. WIRD ABER NICHT!!
Jetzt ist das ergebnis im Fehlerfall immernoch "HASH", genau so wie am Anfang des Skript angegeben...
Anscheinend wird also im Fehlerfall gar keine Datenbankabfrage durchgeführt?!?

Also nochmal: Gebe ich $ergebnsi am Anfang des Skript einen Wert, so bleibt dieser Wert im Fehlerfall. Gebe ich der Variablen keinen Wert, so hat diese im Fehlerfall einen Wert wie "HASH(0x9bdbda4)"...
olruebe01
 2006-12-16 02:37
#30287 #30287
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Noch was: Das Skript nutze nur ich zum Testen und ich mache einfach mit den gleichen Daten einen reload über den Browser. Es kann also NICHT sein, dass das Skript zwischendurch mit anderen Formulardaten ausgeführt wird...
Selbst wenn also wegen Mod_perl die alten Werte in einer Variablen geblieben sind, so sind es die selben Daten, die ich beim neuen Aufruf verwenden...
olruebe01
 2006-12-16 06:33
#30288 #30288
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
FEHLER GEFUNDEN!!!! :D

Mir ist zwar noch nicht klar woran es genau lag aber das Problem lag daran, dass ich die DB-Abfrage in einen sub gesetzt habe.
Ich habe jetzt die DB-Abfrage ohne sub eingesetzt und der Fehler ist weg.
Aber warum?

Trotzdem schon mal vielen Dank für Eure Hilfe
topeg
 2006-12-16 14:14
#30289 #30289
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Würdest du die Funktion so schreiben würde sie funktionieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub blacklist {
my ($item,$galerie)=@_;
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 = '$item' and Galerie = '$galerie' ");
$sth->execute or fehlerausgabe(DBI->errstr);
my ($ergebnis) = $sth->fetchrow_array();
$dbh->disconnect; # DB Connect beenden
return $ergebnis;
}# Ende sub

Die Funktion mußt du dann so aufrufen:
Code: (dl )
my @ergebnis=&blacklist($FORMDATA{item},$FORMDATA{Galerie});


Noch was.

Die Funktion
Code: (dl )
1
2
3
sub fehlerausgabe{
print $fehlermeldung;
}
solltest du besser so schreiben:
Code: (dl )
1
2
3
sub fehlerausgabe{
print $_[0];
}
dann werden auch die übergebenen Parametter ausgelesen und du brauchst die globalen Variablen nicht mehr dafür.

Dann wundere ich mich etwas über diese Zeilen:
Code: (dl )
my %FORMDATA = $cgi->Vars();
erst liest du alle an das Script überegebene Werte aus.
Code: (dl )
1
2
3
$FORMDATA{item}=0;
$FORMDATA{Galerie}="";
$FORMDATA{User}="";
und dann überschreibst du sie?

Ich würde das ganze etwas anderes Schreiben:
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
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
#!/usr/bin/perl -w

use warnings;
use strict;
use CGI;
use CGI::Carp qw/fatalsToBrowser/;
use DBI;

my $cgi = CGI->new();
my %FORMDATA = $cgi->Vars();

$FORMDATA{User}="" unless(exists($FORMDATA{User}));
$FORMDATA{Galerie}="" unless(exists($FORMDATA{User}));
$FORMDATA{item}=0 unless(exists($FORMDATA{User}));

###
### Aufrufen nach User A-L und M - Z aufteilen, um zur Lastverteilung die hälfte der Aufrufe von einem anderen Server durchführen zu lassen...
###
my $buchstabe=lc(substr($FORMDATA{User}, 0,1));
$buchstabe = "09" if ($buchstabe =~ /[0-9]/);
my $Server;
if ($buchstabe =~ /[a-l]/)
{ print "Location: http://www.myDomain6.de/cgi-perl/imagetn.pl?".$item."User=$FORMDATA{User}&Galerie=$FORMDATA{Galerie}&Image=$FORMDATA{Image}\n\n"; }
else
{
$Server ="www.myDomain4.de";
###
### Die User A - L sind nun weg...
###

### wenn der Wert item nicht existiert, erfolgt der Aufruf von einer anderen URL und soll angezeigt werden!!
if (!exists($FORMDATA{item}) || $FORMDATA{item} eq 0)
{ print "Location: http://$Server/ebay/userdaten/$buchstabe/$FORMDATA{User}/$FORMDATA{Galerie}/$FORMDATA{Image}tn.jpg\n\n"; }
else
{
# Für alte Anfrage, in denen Formulfeldarname BILD anstelle von IMAGE verwendet wird
$FORMDATA{Image} = $FORMDATA{Bild} if (!$FORMDATA{Image} && $FORMDATA{Bild});

print "Content-type: image/jpg\n";

### Wenn der Wert item doch existiert (= Bildaufruf erfolgt aus einer eBay-Auktion), soll in einer Blacklist überprüft werden,
### ob dieses Bild für diese Auktion (=item) gespert ist.


##Blacklist?
my $ergebnis = &blacklist($FORMDATA{item},$FORMDATA{Galerie});

###
### Mögliche Ausgaben der DB:
### 0 = Alle Bilder gesperrt.
### 6: Alle Bilder über 6 gesperrt (0-5 erlaubt),
### "ok"= ALLE Bilder dürfen angezeigt werden,
### "": Eintrag existiert nicht -> alle Bilder anzeigen
###

if (($FORMDATA{Image} <= int($ergebnis) and int($ergebnis) > 0) or $ergebnis eq 'ok' or $ergebnis eq '')
{ print "Location: http://$Server/ebay/userdaten/$buchstabe/$FORMDATA{User}/$FORMDATA{Galerie}/$FORMDATA{Image}tn.jpg?$ergebnis\n\n"; }
else
{ print "Location: http://www.myDomain3.de/grafics/keinBild.gif\n\n"; }
}
}
### FERTIG






sub blacklist
{
my ($item,$galerie)=@_;
my $datenbank = "blacklist";
my $datenbankhost = "localhost";
my $datenbankuser = "xxx";
my $datenbankpw = "yyy";

$fehlermeldung = 'Fehler bei der Datenbankverbindung aufgetreten. Bitte ueberpruefen Sie die Angaben';

#DB Connect herstellen
my $dbh = DBI->connect("DBI:mysql:$datenbank:$datenbankhost","$datenbankuser","$datenbankpw") or fehlerausgabe($fehlermeldung);

my $sth = $dbh->prepare("SELECT art FROM 'blacklist' WHERE item = '$item' and Galerie = '$galerie' ");
$sth->execute or fehlerausgabe(DBI->errstr);
my ($ergebnis) = $sth->fetchrow_array();

# DB Connect beenden
$dbh->disconnect;

# Egebniss zurück
return $ergebnis;
}# Ende sub

sub fehlerausgabe
{ die $_[0]; }

wobei ich das script so nicht getetet habe (keine Datenbank und übergenen Werte), aber es sollte funktionieren. :-)
renee
 2006-12-16 14:34
#30290 #30290
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hier ist bestimmt nur ein Flüchtigkeitsfehler:
Code: (dl )
1
2
$FORMDATA{Galerie}="" unless(exists($FORMDATA{User}));
$FORMDATA{item}=0 unless(exists($FORMDATA{User}));


Aus
Code: (dl )
1
2
my $sth = $dbh->prepare("SELECT art FROM 'blacklist' WHERE item =  '$item' and Galerie = '$galerie' ");
$sth->execute or fehlerausgabe(DBI->errstr);


Sollte man
Code: (dl )
1
2
my $sth = $dbh->prepare("SELECT art FROM 'blacklist' WHERE item =  ? and Galerie = ? ");
$sth->execute($item,$galerie) or fehlerausgabe($dbh->errstr);
machen...

Edit: und die " um einfache Variablen kannst Du auch weglassen, also:
Code: (dl )
DBI->connect(...,$datenbankuser,$datenbankpw) ...
\n\n

<!--EDIT|renee|1166272617-->
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/
olruebe01
 2006-12-16 14:40
#30291 #30291
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
HI topeg,

danke für die Tipps. Das Script, dass ich gepostet hatte, war und ist nicht (mehr), was es jetzt oder damals war. Es ist das Resultat vieler Tests und Versuche.
my %FORMDATA = $cgi->Vars(); Ich dachte, dass würde aller Werte löschen?? Das liest sie aus?? Dann macht das natürlich wenig sinn. Die Abfrage hatte ich ja aber später auch. Also quasi doppelt. Somit habe ich ausgelesen, glöscht und wieder ausgelesen... Naja, kostet ja nichts :-) Wie gesagt: Ich lerne noch!

Nochmals Danke an alle!!
olruebe01
 2006-12-16 19:10
#30292 #30292
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Hi Renee,
habe ich inzwischen schon umgesetzt.

Frage aber noch zu my %FORMDATA = $cgi->Vars();
Das sind die Formulardaten per Post oder Get oder beides, richtig?
Wie frage ich denn auf diese Weise denn referrer ab?
pq
 2006-12-16 20:56
#30293 #30293
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=olruebe01,16.12.2006, 18:10]Wie frage ich denn auf diese Weise denn referrer ab?[/quote]
perldoc CGI ($cgi->referer)
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
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



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