webForumDet fria alternativet

Hämta id.

23 svar · 482 visningar · startad av Kent

KentMedlem sedan juli 2000359 inlägg
#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.

Gislaved.netMedlem sedan juni 20001 274 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]

KentMedlem sedan juli 2000359 inlägg
#3

Jag vill hämta ett unikt id.

Gislaved.netMedlem sedan juni 20001 274 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."

KentMedlem sedan juli 2000359 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.

Gislaved.netMedlem sedan juni 20001 274 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."

KentMedlem sedan juli 2000359 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.?

Gislaved.netMedlem sedan juni 20001 274 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."

KentMedlem sedan juli 2000359 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?

Gislaved.netMedlem sedan juni 20001 274 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."

FlashXMedlem sedan nov. 1999992 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.

RobbanMedlem sedan dec. 19992 272 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]

RobbanMedlem sedan dec. 19992 272 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 >

KentMedlem sedan juli 2000359 inlägg
#14

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

RobbanMedlem sedan dec. 19992 272 inlägg
#15

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

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

Gislaved.netMedlem sedan juni 20001 274 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."

Gislaved.netMedlem sedan juni 20001 274 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."

FlashXMedlem sedan nov. 1999992 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.

KentMedlem sedan juli 2000359 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;
   }
  }
FlashXMedlem sedan nov. 1999992 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...

Genererad på 391 ms · cache AV · v20260730165559-full.f96bc7eb