2011-11-14 8 views
1

미안 제목이별로 이해가되지 않는다면 설명하겠습니다.perl이 페이지 출구의 데이터를 지우지 않음

필자는 직장에서 사용해야하는 Perl을 배우기 때문에 테스트 프로그램을 실행하고 있습니다. 웹 양식 (이름, 나이, 위치)에 데이터를 입력하고 MySQL 데이터베이스를 검색하여 일치하는 항목을 찾습니다. 검색 할 때 일치하는 결과가 화면에 출력됩니다. 그러나 양식으로 돌아가서 다시 검색하면 결과를 찾을 수 없다는 것을 알기 때문에 마지막으로 발견 된 레코드 만 표시되며 그 이유는 알 수 없습니다.

누군가 나를 도와 줄 수 있습니까?

미리 감사드립니다.

# Read the standard input (sent by the form): 
read(STDIN, $FormData, $ENV{'CONTENT_LENGTH'}); 
# Get the name and value for each form input: 
@pairs = split(/&/, $FormData); 
# Then for each name/value pair.... 
$db = DBI->connect($conn->DataSource(), $conn->Username(), $conn->Password()) or die "Unable to connect: $DBI::errstr\n"; 
foreach $pair (@pairs) 
{ 
    # Separate the name and value: 
($name, $value) = split(/=/, $pair); 
#replace + with space as + means space when data is collected 
$value =~ tr/+/ /; 
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 
# Store values in a hash called %FORM: 
$FORM{$name} = $value; 
} 
$query = $db->prepare("SELECT * FROM person WHERE Name = '".$FORM{'PName'}."' AND Age = '".$FORM{'Age'}."' AND Location = '".$FORM{'Location'}."'"); 
$query->execute(); 
# BIND TABLE COLUMNS TO VARIABLES 
$query->bind_columns(undef, \$name, \$age, \$location); 
# LOOP THROUGH RESULTS 
$row = 0; 
while($query->fetch()) 
{ 
push @Peeps, Person->New(); 
$Peeps[$row]->Name($name); 
$Peeps[$row]->Age($age); 
$Peeps[$row]->Location($location); 
$row++; 
} 
$db->disconnect(); #disconnect from the db 

print '<table>'; 
for($i = 0; $i <= $#Peeps; $i++) 
{ 
    print "<tr><td>$Peeps[$i]{'NAME'}</td><td>$Peeps[$i]{'AGE'}</td><td>$Peeps[$i]{'LOCATION'}</td></tr>"; 
} 
print '</table>'; 
$db->disconnect(); #disconnect from the db 
+0

을 펄 스크립트로. 이것은 무엇보다도 브라우저 캐싱 문제와 비슷하게 들립니다. – Sorpigal

+4

왜 CGI 모듈을 사용하지 않습니까? 그것은 많은 코드를 단순화합니다! –

+2

코드에 심각한 보안 문제 및 기타 문제점이 있습니다. 다른 것을하기 전에, 당신이 사용하고있는 학습 자료를 버리고 [Modern Perl] (http://onyxneon.com/books/modern_perl/)과 같은 좋은 (무료) 책을 구하거나이 [ Perl Tutorial] (http://perl-tutorial.org/) 리소스를 참조하십시오. – friedo

답변

0

mod_perl 또는 fastcgi를 사용하는 경우 서버 프로세스가 여러 요청에 대해 영속적 인 경우 전역 변수 (예제에서 사용) 요청 사이에 재설정되지 않고 이전 값을 유지할 수 있습니다.

예를 들어, 요청이 동일한 서버 프로세스에 발생하는 경우 다음 요청에 이전 요청에 의해 설정된 %FORM 값이 표시 될 수 있습니다.

스크립트 상단에 %FORM =();을 추가하여 문제가 해결되면 문제가 해결됩니다. 예를 들어 다음을 말하면 확인할 수 있습니다. print $test++;을 클릭하고 값이 증가하는지 확인합니다.

이것은 실제 해결책이 아니므로 함수 또는 모듈 안에 실제 코드를 넣고 거기에 로컬 변수와 매개 변수를 사용하는 것이 좋습니다. 더 많은 유지 관리가 필요합니다. 그리고 사용 가능한 웹 응용 프로그램 프레임 워크 중 일부 (최소 CGI.pm)를 사용합니다.

또한, 엄지 손가락의 규칙을 SQL 주입 보안 문제를 해결하기 위해 필요

: SQL 문을 문자열을 변수를 넣어하지 마십시오,하지만 같은 것을 할 : 당신이 구동되는 웹 페이지를 작성한다고 가정

 
$dbh->prepare("SELECT ... WHERE This = ? AND That = ?") 
$dbh->execute($this, $that); 
0

질문이 너무 일반적이며 유용한 답변이 있으면 약간의 코드/의사 코드가 필수적입니다. 그러나, 당신이 물어 본 것을 전적으로 기반으로, 그것은 브라우저 캐싱 문제 또는 아마도 세션 데이터 캐싱 문제처럼 보입니다. 내가 말했듯이, 약간의 코드/의사 코드를 공개하면 더 잘 이해할 수있다.

+0

브라우저 캐시를 수동으로 지우려고했지만 아무런 차이가 없었습니다. 세션 데이터 캐싱이 동시에 지워지지 않았습니까? – Enigma

+0

위에 코드 샘플을 추가했습니다. – Enigma

관련 문제