PDA

Tam Sürümünü Görmek İçin : CGI [Türkçe ve sembol karakter filitresi]


MuratCetin
20/05/2006, 13:03
Dostlar CGI üzerinde Türkçe ve sembol karakterlerini filitre etmek istiyorum. Örneğin, türkçe-karakter*çok gibi bir text düşünürsek bunun t_rk_e_karakter__ok şeklinde yada turkce_karakter_cok şeklinde olmasını istiyorum. CGI hakkında pek bilgim yok proje gerektirdiği için kullanmam gerekiyor. Bilgisi olan arkadaşlar yardımcı olursa çok memnun olurum.

Şimdiden teşekkürler.


cappytoi
20/05/2006, 14:26
CGI olarak hangi dili kullanıyorsun, perl?

MuratCetin
20/05/2006, 15:26
Perl evet.

cappytoi
20/05/2006, 17:24
yanlış hatırlamıyorsam aşağıdaki gibi yapabiliriz:

$degisken = "türkçe-karakter*çok";
$degisken =~ s/[^A-Za-z0-9]/_/g;
print $degisken;

MuratCetin
20/05/2006, 17:39
Çok teşekkürler, başarılı bir kod işe yaradı : ).

Ek olarak aşağıdaki kod devamlı 500 Internal Server Error veriyor. Acaba hatayı bulmam da yardımcı olabilirmisiniz? (chmod 755)

#!/usr/bin/perl
use CGI;
use CGI qw/:standard/;
use Config;
my $cg = new CGI;
my $ID_IDENTIFIER = $cg->param('ID_IDENTIFIER');
#my $FILE_IDENTIFIER = $cg->param('FILE_IDENTIFIER');

my $target_dir = "$c->{target_dir}/$ID_IDENTIFIER";
#my $target_file = "$c->{target_dir}/$ID_IDENTIFIER/$FILE_IDENTIFIER";

&DelData($target_dir);

sub DelData
{
my ($dir) = @_;
opendir(DIR, $dir) || die"Hata";
my @ff = readdir(DIR);
closedir(DIR);
for my $fn(@ff)
{
unlink("$dir/$fn");
print("$dir/$fn kaldirildi");
}
rmdir("$dir");
print("$dir kaldirildi");
}

cappytoi
20/05/2006, 17:50
perl -cw deneme.pl

Global symbol "$c" requires explicit package name at example.pl line 9.
Global symbol "$c" requires explicit package name at example.pl line 10.
example.pl had compilation errors.

MuratCetin
20/05/2006, 18:03
$c değişkenini Config.pm de ayar olarak tanımladım ama : ).

cappytoi
20/05/2006, 21:22
tam olarak ne yapmaya çalıştığını anlatırsan daha kolay yardım edebilirim, Config.pm 'de nereye ayarladın değişkeni? Config.pm de bu değişkenleri export_ok listesine ekledin mi?

perlci
20/05/2006, 22:48
use strict;

kaldır. Tekrar dene.
Config.pm ile bir ilgisi yok. $c tanımlanmamış diyor. bunu genelde değişkenin başına my konularak tanımlanır ama bu kodlarda gerek yok. use strict; kaldırman sorunu çözecektir.

MuratCetin
21/05/2006, 13:17
use strict kaldırdım. Şuan konsol üzerinde hiçbir syntax hatası vermiyor. Lakin http üzerinde hala 500 hatası alıyorum.

Config.pm dosyası:

package Config;

BEGIN
{
use Exporter;
@Config::ISA = qw( Exporter );
@Config::EXPORT = qw( $c );
}

our $c=
{
target_dir => '/usr/home/site/public_html/target',
};
1;

Yapmaya çalıştığım olay ise, target_dir içindeki ID_IDENTIFIER klasörünün içindeki tüm dosyaları silmek, daha sonra ID_IDENTIFIER klasörünü silmek.

Yardımlarınız için şimdiden teşekkürler, umarım olayı çözebiliriz.

cappytoi
21/05/2006, 16:39
yazma, silme izni var mı? kullanıcı ve grup izinleri farklıysa klasörü izni 0777 yapmalısın.

MuratCetin
21/05/2006, 16:51
Belirleyici bir hata vermiyor, örneğin şu dosya silinemedi gibilerinden, sadece Internal Server Error hatası alıyorum. Chmod ve permission'lardan olsa farklı bir hata vermesi gerekmez mi? Dosyanın chmod'u 777 klasörün ise 755.

cappytoi
21/05/2006, 17:08
apache 'nin error_log 'unda gözüküyor olabilir hata ne ise ama klasörü silebilmen için klasörün 0777 olması gerekebilir ya da apache 'nin kullanıcı adı ve grubuna. sonuçta cgi 'yı çalıştıran sunucu ise. (suexec kullanmıyorsan)

MuratCetin
21/05/2006, 17:20
Çok garip bir hata gerçekten, group izinlerinde de problem görünmüyor. Umarım çözebilirim sorunu, klasörü 777 yaptım gene 500 hatası, log'lara bakacağız artıkım : ). Teşekkürler.

perlci
21/05/2006, 17:47
#!/usr/bin/perl
use CGI;
use CGI qw/:standard/;
use Config;
my $cg = new CGI;
print "Content-type: text/html\n\n";
my $ID_IDENTIFIER = $cg->param('ID_IDENTIFIER');
#my $FILE_IDENTIFIER = $cg->param('FILE_IDENTIFIER');

my $target_dir = "$c->{target_dir}/$ID_IDENTIFIER";
#my $target_file = "$c->{target_dir}/$ID_IDENTIFIER/$FILE_IDENTIFIER";

&DelData($target_dir);

sub DelData
{
my ($dir) = @_;
opendir(DIR, $dir) || die"Hata";
my @ff = readdir(DIR);
closedir(DIR);
for my $fn(@ff)
{
unlink("$dir/$fn");
print("$dir/$fn kaldirildi");
}
rmdir("$dir");
print("$dir kaldirildi");
}


header eksikti yukarıdaki gibi olacak.
print "Content-type: text/html\n\n";

anov
22/05/2006, 15:55
500 hatası tarayıcının(ie nin) hatayı maskelemesi sonucu oluşan bir hatadır.
"Açıklayıcı hata iletilerini göster" seçeneğinin onayını kaldırırsan daha açık hata iletileri görebilirsin.
(veya ie dışında bir tarayıcı ile bak sayfalara)
use CGI::Carp qw(fatalsToBrowser);

bu satırı eklemek de faydalı olacaktır.

perlci
22/05/2006, 19:40
inernal server error hatası yani 500 cgi programlarda genelde header ile alakalı. Hata olduğunda bu hata ekrana değil loglara yazılıyor.
Çözüm ise anov yadığı gibi use CGI::Carp qw(fatalsToBrowser); ile hangi satırda hata olursa yada hata nedeni neyse ekrana yazdırmasını sağlıyor.

Örneğin:



#!/usr/bin/perl
use CGI;
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
use Config;
my $cg = new CGI;
print "Content-type: text/html\n\n";
my $ID_IDENTIFIER = $cg->param('ID_IDENTIFIER');
#my $FILE_IDENTIFIER = $cg->param('FILE_IDENTIFIER');

my $target_dir = "$c->{target_dir}/$ID_IDENTIFIER";
#my $target_file = "$c->{target_dir}/$ID_IDENTIFIER/$FILE_IDENTIFIER";

&DelData($target_dir);

sub DelData
{
my ($dir) = @_;
opendir(DIR, $dir) || die"Hata";
my @ff = readdir(DIR);
closedir(DIR);
for my $fn(@ff)
{
unlink("$dir/$fn");
print("$dir/$fn kaldirildi");
}
rmdir("$dir");
print("$dir kaldirildi");
}

Doga Dostu
07/06/2006, 23:44
Çok teşekkürler, başarılı bir kod işe yaradı : ).

Ek olarak aşağıdaki kod devamlı 500 Internal Server Error veriyor. Acaba hatayı bulmam da yardımcı olabilirmisiniz? (chmod 755)

[/code]

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

satırından sonra bir boş satır bulundurman lazım yoksa programın her zaman error 500 verir.

Bu ikiliyi her zaman her scriptin en başında kullan:
#!/usr/bin/perl
print "Content-type: text/html\n\n";

# Kodlar bu satırdan başlasın.