Forum Webscript.Ru
		Программирование => Perl => Тема начата: Egiki от 05 Ноября 2002, 11:05:01
		
			
			- 
				при отправки данных скрипту который пишет их в БД происходит глюк, если среди данных встречатеться значок № то все данный перекодируються ио кои - 8 в вин-1251. (((( типо кто знает что это такой напишите бцдц рад 
 
 Ежики.
- 
				Не верю! Покажи скрипт записи в БД.
			
- 
				щас напишу, вообщем вот оно
 
 my $query = new CGI;
 my $CGI = new CGI;
 my $forward = $CGI->param (\'forward\');
 print $CGI->redirect("$forward");
 #print $CGI->header();
 #Если надо обновить базу внесенными изменениями
 if ($CGI->param(\'ac\')=~\'savechange\')
 {
 #опишем переменные
 my (@parametr, $param, $dbh,$counter);
 my (@id, $tmp, $counter, $name, $fieldname, $table, $type, $value, $sql, $idfield,$in_file,$bytesread,$buffer,$tmp_file,$updir);
 #получим все переданные параметры
 @parametr=$CGI->param();
 #найдем ключевое поле и его значение
 foreach $param (@parametr){
 ($tmp, $counter, $name, $fieldname)=split (/\\&/,$param,4);
 if ($tmp=~/field/ and $name=~/CodeField/){
 $value=$CGI->param($param);
 ($tmp, $idfield, $type)=split (/\\&/,$fieldname);
 if ($type=~/s/){$value=~s/\\\'/\\"/g;$value="\'".$value."\'"};
 if ($id[$counter]){
 $id[$counter]=$id[$counter]." and $idfield = $value"
 }
 else{
 $id[$counter]="$idfield = $value";
 };
 }
 }
 #распарсим все поля
 foreach $param (@parametr){
 my $file=$param;
 ($tmp, $counter, $name, $fieldname)=split (/\\&/,$param,4);
 if ($tmp=~/field/ and $name!~/CodeField/){
 $value=$CGI->param($param);
 ($table, $fieldname, $type)=split (/\\&/,$fieldname);
 $value =~ s/ {2,}/ /g;
 print qq($value);
 # Передаем два параметра.
 #    1 Путь к файлу на машине клиента принимаем из формы имя type
 #    2 Путь к файлайм на сервере, заносим в базу.
 #    Примечание надо определять что это Описание или картинка. И от этого ставиьт путь на сервер.
 # Сохранение файлов на сервере
 if ($fieldname=~/FileInfo/) {
 if ($value) {
 print (\'*\');
 print $value;
 print (\'*
 \');
 my $DATA_DIR = \'\';
 my $DEFAULT_UPLOAD_DIR = \'\';
 
 my $MAX_SIZE_UPLOAD = 25; # Ko
 
 my $FORM_URL = \'../upload.html\';
 
 my $WEBMASTER_EMAIL = \'Egiki@olviko.ru\';
 
 my $DISPLAY_LANG = \'En\'; # Fr -> french
 
 if ($MAX_SIZE_UPLOAD) { $CGI::POST_MAX=12000 * $MAX_SIZE_UPLOAD; } # Ko
 
 my $query = new CGI;
 
 #         Выделяем директорию куда сохранять
 my $typedir   = $query->param(\'forward\');
 my ($hlam);
 $_=$typedir;
 s/\\w://;
 s/([^\\/\\\\]+)$//;
 $_ = $1;
 s/\\.\\.+//g;
 s/\\s+//g;
 $typedir = $_;
 ($hlam , $typedir)=split (/\\?/,$typedir);
 ($typedir , $hlam)=split (/\\&/,$typedir);
 ($hlam , $typedir)=split (/\\=/,$typedir);
 print $typedir;
 my $dir = \'/home/uvd/html/upfile/\'.$typedir;
 print &Upload($query, $dir, $file);
 }
 }
 #КОНЕЦ МОЕЕЕЕЕее
 if (!($value eq "")) {
 if ($type=~/s/){$value=~s/\\\'/\\"/g;$value="\'".$value."\'"};# Если пришли символы
 if ($value=~/\'\'/ and $type=~/s/){$value=\'NULL\'}; #Если пришло пусто.
 
 #сформируем sql запрос
 
 my $sql=qq(
 UPDATE $table SET $fieldname = $value
 WHERE $id[$counter]
 );
 #выполним запрос
 #         print "$sql
 ";
 &SQLDo($sql);
 }
 }
 }
 };
 
 
 ###########            Функция UPLOADв           #################
 sub Upload  {
 my($query, $upload_dir, $file) = @_;
 my($file_query, $file_name, $size, $buff, $time, $bytes_count);
 $size = $bytes_count =0;
 $_ = $file_query = $query->param($file);
 
 
 s/\\w://;
 s/([^\\/\\\\]+)$//;
 $_ = $1;
 s/\\.\\.+//g;
 s/\\s+//g;
 $file_name = $_;
 
 if (!(-e "$upload_dir/$file_name")) {
 
 
 open(FILE,">$upload_dir/$file_name") || &Error("Error opening file $file_name for writing, error $!", 1);
 binmode FILE;
 $time=time();
 while ($bytes_count = read($file_query,$buff,12000)) {
 $size += $bytes_count;
 print FILE $buff;
 }
 close(FILE);
 }
 
 }
 ###########            КОНЕЦ Функции UPLOADв           #################
 sub win2koi{
 my($result);
 $result=$_[0];
 $result =~ tr[ЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪюабцдефгхийклмнопярстужвьызшэщчъ][абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ];
 return $result;
 }
 
 Типа вот оно скрипт универсальный кто разбереться приник тому ))) но вот трабл при встрече значка № он данный конвертит в вин1251, причем проверял данный конверченный пришли уже скрипту тоесть кто то их уже конвертнуллл????????????
- 
				зы я там кое чего скипнул а то скрипт большой процедура SQLDo выполняет запросы в бауз кому не ясно.
			
- 
				втыкни вот это:
 sub win2koi {
 my($result)=shift;
 $result=~ tr/ xC0xC1xC2xC3xC4xC5xC6xC7xC8xC9xCAxCBx CCxCDxCExCFxD0xD1xD2xD3xD4xD5xD6xD7xD8 xD9xDAxDBxDCxDDxDExDFxE0xE1xE2xE3xE4x E5xE6xE7xE8xE9xEAxEBxECxEDxEExEFxF0xF1 xF2xF3xF4xF5xF6xF7xF8xF9xFAxFBxFCxFDxFExFF/ xE1xE2xF7xE7xE4xE5xF6xFAxE9xEAxEBxECx EDxEExEFxF0xF2xF3xF4xF5xE6xE8xE3xFExFB xFDxFFxF9xF8xFCxE0xF1xC1xC2xD7xC7xC4x C5xD6xDAxC9xCAxCBxCCxCDxCExCFxD0xD2xD3 xD4xD5xC6xC8xC3xDExDBxDDxDFxD9xD8xDCxC0xD1/;
 return $result;
 }
 
- 
				не ну это есесно какая разница какую функцию мою или твою испольнят прикол не в том что скрипт данные конвертит прикол в том что они скрипту уже приходят конверченный тоесть если я в самом начале напишу.
 
 my $CGI = new CGI;
 my @blabla = $CGI->param();
 foreach my $bla_2 (@blabla){
 my $text = $CGI->param($bla_2);
 print qq($text);
 }
 
 то текст будет конверченным.
 
 ЗЫ. Я исправил этот глюк у себя но мне хотелосьбы знать почему данные приходят переконверченным.
 ЗЫ-2. В кодировке кои нет такого значка как " № ". ????