webForumDet fria alternativet

Hämta id.

Perl & Rubyur Perl, Python, Ruby och övrig CGI

23 svar · 482 visningar · startad av Kent

Medlem sedan juli 2000355 inlägg
Frågan#1

Hur gör man för att hämta ett unikt id i perl, ex jag har 50 olika txt filer, 1.txt 2.txt osv, som jag vill öppna i guestbook.cgi?id=12, ungefär som en gästbokhosting, hur löser jag det.

Medlem sedan juni 20001 521 inlägg
#2

Vill du generera ett unikt id-nummer eller vill du hämta ett som redan existerar?

Om du vill generera ett unikt id-nummer så finns den funktionen inbyggd i t.ex. MySQL. Du kan även skapa en vanlig textfil som innehåller en siffra vars värde ökas varje gång en ny gästbok skapas.

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

[Redigerat av Gislaved.net den 05 dec 2000]

Medlem sedan juli 2000355 inlägg
#3

Jag vill hämta ett unikt id.

Medlem sedan juni 20001 521 inlägg
#4

Ja, det var ju precis det du skrev innan. Jag trodde att du ville skapa ett unikt id-nummer, men jag fattade visst fel. Sorry.

Var ska du hämta id-numret ifrån? Om du talar om det så kan jag nog förklara hur du ska hämta det.

Är det en gästbokstjänst du försöker göra?

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Medlem sedan juli 2000355 inlägg
#5

Hur menar du med var jag ska hämta det ifrån, jag har txt filer 1.txt 2.txt osv upp till 50 st som alla inlägg ska sparas i, vill öppna det i guestbook.cgi så 50 olika användare kan skriva i den.

Medlem sedan juni 20001 521 inlägg
#6

Har jag fattat rätt nu?

Om någon går till guestbook.cgi?id=12 så ska filen 12.txt öppnas och visas för användaren?

Lite tips på hur du får in siffra in scriptet finns på http://www.gislaved.net/visa.php?id=83

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Medlem sedan juli 2000355 inlägg
#7

Din kurs beskriver ju inte hur man hämtar ett id, om man anropar guestbook.cgi?id=12 så ska 12.txt öppnas, hur gör man det.?

Medlem sedan juni 20001 521 inlägg
#8

Jodå, om du använder form.lib som i exemplet så hamnar id-numret i $gislaved{'id'} när du anropar scriptet. Kolla på sidan igen, det står hur du ska göra... leta efter "Tips!".

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Medlem sedan juli 2000355 inlägg
#9

Nope, funkar inte.!!!
Det kommer inte upp något felmeddelande,
får bara inte de olika filerna att öppna sig.
Du kan inte visa med lite mer kod?

Medlem sedan juni 20001 521 inlägg
#10

Koden på den sidan öppnar inga filer, den hämtar bara id-numret, och det var ju det du ville.

require "form.lib";
&formular_kontroll;

$id = $gislaved{'namn'};

Om du kör ovanstående kod får du in id-numret i variabeln $id, och sen kan du öppna filen $id.txt med hjälp av open.

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Medlem sedan nov. 19991 033 inlägg
#11

Jag tror Kent menar att han vill öppna olika textfiler beroende på vilket id han länkar till i en URL-adress.
(nu har jag i.o.f.s. inte tittat i din form-lib)

$in = $ENV{'QUERY_STRING'};
@in = split(/[&;]/,$in); 

	foreach $i (0 .. $#in) {
		$in[$i] =~ s/\+/ /g;  
		($key, $val) = split(/=/,$in[$i],2);

		$key =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
		$val =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;

		$in{$key} .= "\0" if (defined($in{$key}));
		$in{$key} .= $val;
	}

$id = "";
if ($in{'id'}) {
	$id_number = ($in{'id'});
	}

open (GUESTBOOK, "$id_number\.txt");
och så vidare...

Resten fixar du nog själv tror jag.

Medlem sedan dec. 19992 555 inlägg
#12

open (GUESTBOOK, "$id_number\.txt");

OBS säkerhetsrisk! För att illustrera varför - prova med att skriva ut en giltig header innan filöppningen:

print "Content-type: text/plain\n\n";

Sedan anropar du scriptet med id=%7C+%2Fusr%2Fgames%2Ffortune+%3B. Om sökvägen till fortune stämmer så bör du få ett trevligt citat i din webläsare. Vad vi har är alltså ett script som låter besökaren köra valfritt systemkommandon. Ingen höjdare kanske (går säkerligen att hitta på något bra mycket otrevligare än fortune att köra). :)

Sätt en < som första tecken så blir det något säkrare. Dessutom bör man alltid kolla så att filöppningen verkligen lyckades (annars kan scriptet komma försöka läsa från en oöppnad fil, och resultatet kan bli minst sagt oväntat).

open (GUESTBOOK, "<$id_number.txt") or die "Unable to open file:$!";

Eftersom vi här dessutom vet att $id_number inte skall innehålla något annat än nuffror så är det lika bra att undersöka detta innan filöppningen.

$id_number =~ s/[^0-9]//g;

Nu har vi ett bra mycket säkrare script.

[Redigerat av Robban den 07 dec 2000]

Medlem sedan dec. 19992 555 inlägg
#13

Att läsa perls säkerhetsmanual rekommenderas för var och en som kodar perl. Där tas många saker upp som man kanske inte skulle tänka på annars.

Den som har perl installerad har troligen denna manual installerad också. Nås genom att vid prompten skriva:

perldoc perlsec

------------------
Robban < robban@lipogram.com >

Medlem sedan juli 2000355 inlägg
#14

Jag anropar scriptet med guestbook.cgi?id=12, men det funkar inte.
Vad är fel.?

Medlem sedan dec. 19992 555 inlägg
#15

Kollat felloggen? Lite svårt att hjälpa dig med så knapp information.

------------------
Robban < robban@lipogram.com >

Medlem sedan juni 20001 521 inlägg
#16

Precis, om du inte hittar något fel får du väl posta scriptet här.

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Medlem sedan juni 20001 521 inlägg
#17

Precis, om du inte hittar något fel får du väl posta scriptet här.

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Medlem sedan nov. 19991 033 inlägg
#18

Blir ju klart lättare om man kan se skriptet :)

Om du la till Robbans atteraljer så kanske du infogade något på fel ställe?
Här har du en kod som du kan köra som "stand alone" för att testa själva filöppningen.
(Robbans säkerhetsdetaljer inkluderade ;))

#!/usr/bin/perl

$in = $ENV{'QUERY_STRING'};
@in = split(/[&;]/,$in); 

	foreach $i (0 .. $#in) {
		$in[$i] =~ s/\+/ /g;  
		($key, $val) = split(/=/,$in[$i],2);

		$key =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
		$val =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;

		$in{$key} .= "\0" if (defined($in{$key}));
		$in{$key} .= $val;
	}

$id = "";
if ($in{'id'}) {
	$id_number = ($in{'id'});
	$id_number =~ s/[^0-9]//g;
	}

open (GUESTBOOK, "<$id_number\.txt") or die "Kan inte öppna filen: $!\n";
@lines = (<GUESTBOOK> );
close (GUESTBOOK);

print "Content-type:text/html\n\n";
print "@lines";

exit;

Sökvägen till dina txt-filer får du kanske justera och får du öppningen att fungera, så borde du kunna foga in koden i ditt skript.

Medlem sedan juli 2000355 inlägg
#19

Nej funkar inte ändå,
här kommer hela koden:

#!/usr/bin/perl

use CGI ":standard";

$in = $ENV{'QUERY_STRING'};@in = split(/[&;]/,$in); 	
foreach $i (0 .. $#in) {		
$in[$i] =~ s/\+/ /g;  		
($key, $val) = split(/=/,$in[$i],2);		
$key =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;		
$val =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;		
$in{$key} .= "\0" if (defined($in{$key}));		
$in{$key} .= $val;	}$id = "";if ($in{'id'}) {	
$id_number = ($in{'id'});	
$id_number =~ s/[^0-9]//g;	
}
open (GUESTBOOK, "<$id_number\.txt") or die "Kan inte öppna filen: $!\n";@lines = (<GUESTBOOK> );
close (GUESTBOOK);
print "Content-type:text/html\n\n";
print "@lines";
exit;

print header, start_html("Gästbok!"), h1("G&auml;stbok!");
if (param) { &skriv_inlagg; }
&rita_formular;
&visa_inlagg;
sub rita_formular {
  print hr, start_form;
  print p, "Namn: ", textfield("namn","", 40), br;
  print "  E-post: ", textfield("epost", "", 40), br;
  print "Meddelande: ", textarea("meddelande", "", 4, 40, 1);
  print br, p, submit("", "Skicka!"), "&nbsp", reset("Rensa!");
  print end_form, hr;
  }
sub skriv_inlagg {
  $rad{namn} = param('namn');
  $rad{epost} = param('epost');
  $rad{meddelande} = param('meddelande');
  ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
  $rad{datum} = $date_time_now=sprintf("%04d-%02d-%02d %02d:%02d:%02d", 1900 + $year, ++$mon, $mday, $hour,$min, $sec);
  $helaraden = $rad{datum};
  foreach $faltnamn (qw(epost namn meddelande)) {
    $rad{$faltnamn} =~ s/\r\n&#0124;\n/\\n/g;
    $rad{$faltnamn} =~ s/\t/ /g;
   $helaraden .= "\t" . $rad{$faltnamn}
   }
  return if $rad{meddelande} !~ /\w/;
  open (DATAUT, ">> $id_number.txt") &#0124;&#0124; die("Kan inte skriva till datafilen $datafil: $!\n");
  print DATAUT "$helaraden\n";
  close(DATAUT);
  }
sub visa_inlagg{
  open(DATAIN, "< $id_number.txt") &#0124;&#0124; die("Kan inte öppna datafilen $datafil: $!\n");
  while(<DATAIN> ) { @inlagg=<DATAIN>; }
  close(DATAIN);
  foreach $rad (reverse @inlagg) {
    $rad =~ s/</</g;
    $rad =~ s/\\n/<BR>/g;
    ($datum, $epost, $namn, $meddelande) = split(/\t&#0124;\n/, $rad);
   print qq#$datum, <A HREF="mailto:$epost">$namn</A><BR>$meddelande<HR>#;
   print br;
   }
  }
Medlem sedan nov. 19991 033 inlägg
#20

Kan du använda wFkoden [perl] istället eller länka till en txt-fil.
Just nu blir det lite konstigt med vissa rader...

138 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)