Schrift
[thread]690[/thread]

Problem mit checkbox

Leser: 1


<< >> 10 Einträge, 1 Seite
R@dman
 2006-03-13 17:48
#7094 #7094
User since
2006-03-13
6 Artikel
BenutzerIn
[default_avatar]
Hi, ich bin neu hier und hoffe das ich im richtigen Forum bin.
Ich bin leider nicht sehr fit in Perl, muss aber als Hausarbeit für meine FH ein Perlskript schreiben, das eine Datenbank abfragt. Hier ist der Code:
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
#!/usr/bin/perl -wT

use strict;
use CGI qw/:standard/;
use DBI;

print header,

start_html('Database Interface'),
h1('<font color=blue>first test of a query! Just in a few DNA-Sequences:</font>'),hr,
start_form,
textarea( -name =>'input',
-default=>'Enter your sequence here...',
-rows=>'10',
-columns=>'50'),br,

'<font color=blue>Choose the table: </font>',

popup_menu( -name =>'table',
-values =>[qw/dnaseq protseq/],
-labels =>{'dnaseq'=>'DNA-Sequences','protseq'=>'Protein-Sequences'}),p,


submit('subm','submit'),p,
end_form,
hr;

my $popup_menu_value = param('table');
my $input;
my @result;

if( $popup_menu_value eq "dnaseq"){
$input = uc param('input'); #uc wandelt Klein- in Großbuchstaben um
}
else{
$input = lc param('input'); #lc wandelt Groß- in Kleinbuchstaben um
}

import_names('items');

if ($items::subm) {

my $table = param('table');
my $query = "select * from $table where seq like '%$input%';";
my $dbname = 'perl';
my $seqs = DBI->connect("dbi:Pg:dbname=$dbname",'marc','')
or die "Kann keine Verbindung herstellen: $DBI::errstr";
my $sql = $seqs->prepare($query)
or die "Kann die Abfrage nicht vorbereiten: $DBI::errstr";
$sql->execute();
print "Result is:",p;
print(" <table border=0 width=80%>
<colgroup>
<col width=50>
<col width=80>
</colgroup>
<th align=left>#</th>
<th align=left>Sequence</th>");
my $counter = 0;

while(@result = $sql->fetchrow_array() ){
$counter++;
print(" <tr> <td>",checkbox($counter),"</td>",
"<td> <A HREF='details.cgi?art=$result[ 1 ]'>$result[ 1 ]</A></td></tr>");
}
print("</table>");

print start_form,
submit('show','show'),p,
end_form,
hr;
}
elsif ($items::show) {
print ( ... );

}


Es geht um folgendes:

Man kann in das Textfeld eine Sequenz eingeben, dann kann man eine Datenbank aussuchen danach submit drücken.
Jetzt wird die Datenbank nach dem Eingegebenen String durchsucht und jede DNA-Sequenz die ihn enthält wird zurückgeliefert. Und zwar in einer Tabelle, in der ersten Spalte soll eine Fortlaufende Nummer stehen und eine Checkbox durch die ich eine oder mehrere Sequenzen(Ergebnisse) markieren kann. Dann will ich das unter der Tabelle wieder ein Submit-Button erscheint und wenn man auf diesen drückt, sollen Details zu jeder der durch die Checkboxen markierten Sequenzen angezeigt werden.
Da ich die Checkboxen aber in der while-Schleife erzeuge kann ich später nicht mehr darauf zugreifen.

Wie könnte ich das lösen???

Ich hoffe das ich alles verständlich erklärt habe.

Vielen Dank für eure Hilfe.
renee
 2006-03-13 17:58
#7095 #7095
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Leg doch als Namen so etwas fest: 'Checkbox#', wobei die # für die Accession-Nummer der Sequenz steht. Mit dem CGI-Modul kannst Du die Parameter in einen Hash einlesen und dann alle keys benutzen, die mit 'Checkbox' beginnen. Dann kannst Du auch gleich die Accession-Nummer auslesen...

Je nach DB-Aufbau, kannst Du die Accession-Nummer auch durch etwas anderes ersetzen...
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/
R@dman
 2006-03-13 18:24
#7096 #7096
User since
2006-03-13
6 Artikel
BenutzerIn
[default_avatar]
Hi, danke für die schnelle Antwort, ich habe jetzt folgendes geändert:
Code: (dl )
1
2
3
4
5
while(@result = $sql->fetchrow_array() ){
$counter++;
print(" <tr> <td>",checkbox('cb'.$counter,0,'1',$counter),"</td>",
"<td> <A HREF='details.cgi?art=$result[ 1 ]'>$result[ 1 ]</A></td></tr>");
}


Code: (dl )
1
2
3
4
5
6
7
elsif ($items::show) {
my %daten = Vars();

foreach my $key(sort keys (%daten)){
print $key . " = " . $daten{$key} . "\n";
}
}


Aber wenn ich mir den Hash jetzt ausgeben lasse, passiert gar nichts. Also er ist irgendwie leer.
Woran liegt das? Vielleicht das die Submit Buttons und die Checkboxen in verschiedenen if...else Bereichen liegen?
renee
 2006-03-13 18:27
#7097 #7097
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Checkboxen müssen natürlich innerhalb der gleichen <form>-Tags stehen wie der Submit-Button...
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/
R@dman
 2006-03-13 18:46
#7098 #7098
User since
2006-03-13
6 Artikel
BenutzerIn
[default_avatar]
Tut mir leid, das ich nochmal fragen muss. Aber wie bekomme ich das denn in oben angegebenem Quellcode hin?

Wie gesagt, ich kenne mich kaum mit Perl aus.

Kann ich die ausgabe das Hashes so lassen?


Vielen Dank für deine Hilfe!

P.S.: Ich studieren Bioinformatik, habe grade mal auf deinen Link geklickt und gesehen, das du ja auch damit zu tun hast.\n\n

<!--EDIT|R@dman|1142268636-->
cbxk1xg
 2006-03-14 16:21
#7099 #7099
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Guck Dir mal an was im HTML Quelltext steht. Dann findest Du auch besser den Fehler.

Ein HTML Formular sollte in etwa so augebaut sein:
Code: (dl )
1
2
3
4
<form method="POST">
<input type="checkbox" name="BOX01" value="SomeValue">
<input type="submit" value="submit"><input type="reset" value="reset">
</form>
R@dman
 2006-03-14 16:59
#7100 #7100
User since
2006-03-13
6 Artikel
BenutzerIn
[default_avatar]
Danke, ich habe den Fehler von oben gefunden, aber jetzt habe ich das nächste Problem.

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
#!/usr/bin/perl -wT

use strict;
use CGI qw/:standard/;
use DBI;


print header,

start_html('Test von CGI'),
h1('<font color=blue>Details of the Sequence:</font>'),
"<a href='jo.cgi'>back</a>",
hr;


our @result;
my $input;
my $popup_menu_value;

if ( defined(param('input')) ){
$input = param('input');
}

if ( defined(param('table')) ){
$popup_menu_value = param('table');
}

if( $popup_menu_value eq "dnaseq"){
$input = uc param('input'); #uc wandelt Klein- in Großbuchstaben um
}
else{
$input = lc param('input'); #lc wandelt Groß- in Kleinbuchstaben um
}


my $table = param('table');
my $query = "select * from $table where seq like '%$input%';";
my $dbname = 'perl';
my $seqs = DBI->connect("dbi:Pg:dbname=$dbname",'marc','')
or die "Kann keine Verbindung herstellen: $DBI::errstr";
my $sql = $seqs->prepare($query)
or die "Kann die Abfrage nicht vorbereiten: $DBI::errstr";
$sql->execute();
print "Result is:",p;
print(" <table border=0 width=80%>
<colgroup>
<col width=50>
<col width=80>
</colgroup>
<th align=left>#</th>
<th align=left>Sequence</th>");
my $counter = 0;

print start_form;
while(my @row = $sql->fetchrow_array() ){
push(@result,@row);
$counter++;
print(" <tr> <td>",checkbox('cb'.$counter,0,'1',$counter),"</td>",
"<td> <A HREF='details.cgi?art=$row[ 1 ]'>$row[ 1 ]</A></td></tr>");
}
print submit('show','show'),p;


print "Länge: ",$#result,"<p>";

if(param('show') ){


print "Länge: ",$#result,"<p>";
print "Param cb1: ",param('cb1');

for(my $i=0; $i <= $#result; $i++){
if(param('cb').$i+1 == 1){
print $result[$i];
}
}


}


Und zwar schreibe ich in der while-Schleife die Ergebnisse aus der SQL-Abfrage in das Array @result. Dann lasse ich mir zum Testen die Länge von @result ausgeben und sie stimmt noch.

Wenn ich dann aber den submit Button drücke und nach
Code: (dl )
 if(param ('show') )
die Länge von @result nochmal ausgeben möchte bzw. auf das Array zugreifen möchte geht das nichtmehr, weil es leer ist. Das verstehe ich nit. Wieso ist das Array plötzlich leer?

Vielen Dank
cbxk1xg
 2006-03-14 17:17
#7101 #7101
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Versuch's mal mit my @result; anstatt our @result;
R@dman
 2006-03-14 17:26
#7102 #7102
User since
2006-03-13
6 Artikel
BenutzerIn
[default_avatar]
nein mit my @result bekomme ich in dem if( param('show') )-Block ebenfalls als Länge -1 zurück! Weiß auch nicht weiter. In allen Programmiersprachen, die ich kenne, ist ein so definiertes Array global verfügbar!\n\n

<!--EDIT|R@dman|1142350028-->
R@dman
 2006-03-15 13:19
#7103 #7103
User since
2006-03-13
6 Artikel
BenutzerIn
[default_avatar]
Ich glaube ich habe den Fehler! Also das skript wird aufgerufen, dann wird automatisch die Datenbank abfrage gestartet und alles in das array @result reinkopiert. Wenn man dann aber den Submit Button 'show' drückt, wird das array nocheinmal angelegt und ist dann leer.

Denke das könnte es sein.

Aber wie kann ich das jetzt umgehen?
<< >> 10 Einträge, 1 Seite



View all threads created 2006-03-13 17:48.