Avatar billede triple-x Nybegynder
23. august 2005 - 12:39 Der er 14 kommentarer og
1 løsning

hive noget ud fra en database

Hey Perl eksperter

Så bliver der endnu en gang brug for jeres hjælp.

Jeg har fået lavet et mini script der tager nogle data ind fra nogle forms og smider det op i en database.

------------------------------------------

#!c:/perl/bin/perl.exe
use strict;
use CGI ':standard';
use DBI;
print "Content-type: text/html\n\n";

my $DataBaseName    =  "bookmark";
my $DataBaseHost    =  "localhost";
my $DataBaseUser    =  "root";
my $DataBasePass    =  "";

my $dbh      =  DBI->connect("DBI:mysql:database=$DataBaseName;host=$DataBaseHost",
                                    "$DataBaseUser",
                                    "$DataBasePass",
                                    { RaiseError => 1,
                                      AutoCommit => 0 }) || die "Unable to connect to $DataBaseHost because $DBI::errstr";

my $title = param('title');
my $link = param('link');
my $descrip = param('descrip');

$dbh->do("INSERT INTO bookmark values(id,'$title','$link','$descrip')");

$dbh->disconnect();

----------------------------------------
Det virker helt fint, men jeg kan simpelthen ikke lige gennemskue hvordan jeg får mine data ud fra databasen igen.

Det skal gerne være sådan at jeg kan tage hver del ud for sig, altså at jeg kan tage title, links og descrip ud hver for sig og smide ind et sted i en tabel f.eks.

Jeg har et par bøger om emnet men jeg kan ikke få det til at virke, så håber der er en venlig sjæl der kan hjælpe mig.

På forhånd mange tak.

Mvh Martin Tygsen
Avatar billede nielle Nybegynder
23. august 2005 - 12:51 #1
Måske sådan:

#!c:/perl/bin/perl.exe
use strict;
use CGI ':standard';
use DBI;
print "Content-type: text/html\n\n";

my $DataBaseName = "bookmark";
my $DataBaseHost = "localhost";
my $DataBaseUser = "root";
my $DataBasePass = "";

my $dbh    = DBI->connect("DBI:mysql:database=$DataBaseName;host=$DataBaseHost",
    "$DataBaseUser",
    "$DataBasePass",
    { RaiseError => 1, AutoCommit => 0 }) || die "Unable to connect to $DataBaseHost because $DBI::errstr";

my $sql = "SELECT * FROM bookmark";
my $sth = $dbh->prepare($sql);
$sth->execute();

while (my @row = $sth->fetchrow_array )
{
    print "@row\n";
}

$dbh->disconnect();
Avatar billede triple-x Nybegynder
23. august 2005 - 12:59 #2
Sådan har jeg også lavet det, men jeg får bare en blank side når jeg kører scriptet.

Error loggen siger følgende:

Can't locate object method "prepare" via package "dbh" (perhaps you forgot to load "dbh"?) at c:\\appserv\\www\\cgi-bin\\index2.pl line 19.\n

Kan du tyde den ?

(PS. Jeg skylder dig efterhånden en god flaske vin for alt den hjælp du yder )
Avatar billede triple-x Nybegynder
23. august 2005 - 13:00 #3
hov :) dit script virker, må ha haft en lille fejl i mit et sted.

Men så er problemet bare hvordan jeg får hevet de forskellige data ud alene, kan du klare den også?
Avatar billede nielle Nybegynder
23. august 2005 - 13:02 #4
Med fetchrow_array får du dine data i et array. Du kan altså få fat i de enkelte søjler ved at f.eks. hive 2. pladsen ud:

print $row[2];
Avatar billede nielle Nybegynder
23. august 2005 - 13:06 #5
... eller i stedet for at bruge:

while (my @row = $sth->fetchrow_array)

- så kan du bruge:

while (my $row = $sth->fetchrow_hashref)

- som dog giver dig en hash-reference i stedet for en hash.
Avatar billede triple-x Nybegynder
23. august 2005 - 13:08 #6
ahh okay på den måde, mange tak nielle, smid et svar
Avatar billede nielle Nybegynder
23. august 2005 - 13:11 #7
Og hvis du på forhånd ved at du ikke skal bruge alle felterne, så kan du jo nøjes med at trække dem ud som du skal bruge:

my $sql = "SELECT title FROM bookmark";

... og et svar :^)


DBI-manualen fra CPAN:

http://search.cpan.org/~simkin/Apache-LoggedAuthDBI-0.12/DBI.pm
Avatar billede triple-x Nybegynder
23. august 2005 - 13:16 #8
smid mig en mail på martin(at)tygsen.dk så vil jeg gerne finde ud af lidt anden betaling end bare de her exp point.

Og endnu en gang tusind tak.
Avatar billede nielle Nybegynder
23. august 2005 - 14:06 #9
Nej tak - points er alt rigeligt :^)

... men et "tusind tak" er heller ikke at foragte. :^)

Det er ikke så tit at folk huster den slags her på sitet.
Avatar billede triple-x Nybegynder
23. august 2005 - 14:13 #10
forstår slet ikke man kan glemme det :) jeg hjælper gerne hvor jeg kan, og så er det jo dejligt at få hjælp tilbage igen.

Men du har min mail hvis du ombestemmer dig.

Kan være du lige kan hjælpe mig med en sidste ting.


Det script jeg skal lave skal fungere ala en gæstebog faktisk. Det vil sige jeg gerne vil ha lavet det sådan
---------------
|titel        |
---------------
---------------
|link        |
---------------
---------------
|beskrivelse  |
---------------
og så forfra igen.

jeg har lavet det sådan

while (my @row = $sth->fetchrow_array )
{
my $title = "$row[1]";
my $link = "$row[2]";
my $beskrivelse = "$row[3]";
}

Så jeg hiver hver led ud i en variabel, men problemet er jo at den sætter allte titler efter hinanden alle links efter hinanden og alle beskrivelser efter hinanden

det problem har jeg imidlertidig løst ved at sætte WHERE id=1 ind i mit sql sætning, men meningen er jo den gerne skal liste alle neden under hinanden i en mini tabel jeg har lavet.

Kan man på nogen måde sætte ind så den laver en løkke og forhøjer id konstant og så udskriver tabelen igen og igen.

Det var svært at forklare håber du forstår mig.

Jeg har prøvet mig lidt frem med at definere id til at stige med en, men synes ikke rigtig jeg kan få det til at virke helt.

på forhånd tak, og sig til hvis du skal have lidt ekstra point for det :)
Avatar billede nielle Nybegynder
23. august 2005 - 15:38 #11
Foreløbigt er der jo faktisk ikke noget i din kode som udskriver noget, men det er jo bare at lave:

my $sql = "SELECT * FROM bookmark ORDER BY id";
my $sth = $dbh->prepare($sql);
$sth->execute();

while (my @row = $sth->fetchrow_array )
{
    print "<table>";
    printf "<tr><td>titel</td><td>%s</td></tr>", $row[1];
    printf "<tr><td>link</td><td><a href='%s'>%s</a></td></tr>", $row[2], $row[2];
    printf "<tr><td>beskrivelse</td><td>%s</td></tr>", $row[3];
    print "</table>";
}

Du bør jo selvfølgelig i stedet bruge de relevante funktioner fra CGI-modulet.
Avatar billede triple-x Nybegynder
23. august 2005 - 15:47 #12
ahh nej men while løkke og sql sætning ser således ud:

my $sql = "SELECT * FROM bookmark WHERE id=1";
my $sth = $dbh->prepare($sql);
$sth->execute();

while (my @row = $sth->fetchrow_array )
{
my $title = "$row[1]";
my $link = "$row[2]";
my $beskrivelse = "$row[3]";

print qq(<table width="500" height="100" border="1">
  <tr>
    <td>Titel: $title</td>
  </tr>
  <tr>
    <td>Link: $link</td>
  </tr>
  <tr>
    <td>Beskrivelse: $beskrivelse</td>
  </tr>
</table>);
}

Men den skriver kun id=1 ud

jeg vil gerne have sådan at den skriver dem alle ud :)

Kan se du bruger order by id, den prøver jeg lige
Avatar billede triple-x Nybegynder
23. august 2005 - 15:49 #13
se det var bare ORDER BY jeg skulle bruge, må hellere få læst lidt på de mest brugte sql ting, de viser sig jo at være rigtig gode og effektive. Endnu en gang mange tak. hvis jeg gør noget dumt i min kode må du endelig bare sige til. Man lærer jo af kritik.
Avatar billede nielle Nybegynder
23. august 2005 - 15:55 #14
... men burde det ikke heller være:

my $sql = "SELECT * FROM bookmark ORDER BY titel";

Alfabetisk sortering er da som regel pænere. :^)
Avatar billede triple-x Nybegynder
23. august 2005 - 15:59 #15
det er rigtig smart, jeg ser tusind tak, og du hører nok mere fra mig hvis du tjekker perl kategorien hehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester