Автор Тема: Чем отличается запуск perl cgi-скрипта в консоли от запуска его из браузера?  (Прочитано 4742 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Гаррик

  • Новичок
  • *
  • Сообщений: 1
  • +0/-0
    • Просмотр профиля
Всем, привет!

Задача простая, нужно из perl-скрипта получить данные из MS SQL Server 2008 и после обработки выдать отчет через apache2.

Установил драйвер ODBC - FreeTDS.
Установил DBD:ODBC (unicode).

С помощью клиентов таких как isql, fisql, osql, psql запрос:

select TaskName from MSP_EpmTask_UserView where TaskName like N'Этап 1 Н%'

- отрабатывает нормально.

А вот с cgi-скриптом проблема. Из консоли скрипт отрабатывает, а из браузера нет. Точнее скрипт  из браузера отрабатывает без ошибок, но в запросе, то что на русском языке после "like" отправляется в непонятой для SQL-сервера кодировке(если после like на английском - проблемы нет). В связи с этим вопрос, чем отличатся (в плане кодировок) запуск скриптов из консоли и из браузера? Вот сам скрипт:

#!/usr/bin/perl -w
use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);
use Encode;

use CGI qw(:all);
use DBI;
use DBD::ODBC;

my $data_source = q(dbi:ODBC:MSSQL-SHPOINT);
my $user = q(report_pwa);
my $password = q(12345qweR);

# Соединение с базой данных
my $dbh = DBI->connect($data_source, $user, $password)
        or die "Can't connect to $data_source: $DBI::errstr";

my $LIKE = "N\'Этап 1 Н%\'";
my $sql = "select TaskName from MSP_EpmTask_UserView where TaskName like $LIKE";
$sql = encode('utf8', $sql);

my $q = new CGI;

my $sth = $dbh->prepare($sql)
        or die "Can't prepare statement: $DBI::errstr";

$sth->execute();

# Начало страницы
print $q->header(-type=>'text/html', -charset=>'utf-8');

print $q->start_html();

# Начало таблицы
print $q->start_table({cellspacing=>0});

# делать выборку данных пока ничего не останется
my @string = ();
while ( @string = $sth->fetchrow_array())  {
        print $q->start_Tr();
        print $q->td("$string[0]");
        print $q->end_Tr()."\n";
}

print $q->end_table()."\n";
#Конец таблицы

print $q->end_html()."\n";
# Конец страницы

# Отключение от базы данных
$sth->finish();

$dbh->disconnect;

exit 0;

Результат в консоли:
Content-Type: text/html; charset=utf-8

<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Тест</title>
<link rel="stylesheet" type="text/css" href="/css/style1.css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<table cellspacing="0"><caption>Привет!</caption>
<tr><th>TaskName</th></tr>
<tr><td>Этап 1 Настройка первоочередных функциональных ролей</td></tr>
</table>

</body>
</html>


Результат в браузере:
<!DOCTYPE html
   PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Тест</title>
<link rel="stylesheet" type="text/css" href="/css/style1.css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<table cellspacing="0"><caption>Привет!</caption>
<tr><th>TaskName</th></tr>
</table>
 
</body>
</html>


 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28