Ключевые слова:php, win, sql, charset, (найти похожие документы)
From: das-ich <das-ich@yandex.ru>
Newsgroups: email
Date: Mon, 21 Oct 2003 14:31:37 +0000 (UTC)
Subject: Доступ из PHP скриптов к MSSQL.
Сказ про то, как я PHP на MSSQL женил и научил их на одинаковом русском
разговаривать.
Возникла недавно у меня в конторе потребность, чтобы сайт написанный
на PHP, находящийся на FreeBSD, обращался к MSSQL и забирал от туда
данные. И сайт и база написаны в вындовозной кодировке, это достаточно
существенное замечание, т.к. если бы сайт был написан в родной и
горячо любимой KOI8-R, то одной проблемой было бы меньше.
Узнать при помощи чего можно совместить работу PHP и MSSQL оказалось
достаточно простой задачей. Самым приемлемым и главное халявным
программным продуктом оказалась библиотека FreeTDS. Взять ее можно
отсюда http://www.freetds.org .
Сборка и установка показалась по началу достаточно простым делом, так же
как и собрать в месте с ней и Apache и PHP. Но вот именно с этого
момента и начались проблемы.
С начала при прочтении мануала и настройки соответственно ему файла
freetds.conf не дало не каких результатов. PHP как не забирал данные с
базы так и не хотел этого делать. После перелопачивания всего
русскоязычного инета и перехода на англоязычные сайты, т.к. оказалось,
что попытка найти на русском языке хоть какие-то внятные инструкции на
этот счет, свелась к одной статье описывающую настройку более старой
версии FreeTDS, что абсолютно не способствовало улучшению ситуации, мне
все же удалось найти описание правильных настроек файла freetds.conf .
После чего PHP стал нормально обращаться к MSSQL, но все еще на Вы,
потому что сразу появилась другая проблема. А проблема была в кодировках
(на этом месте я предлагаю дружно вспомнить дядю Била и сказать ему
большое ╚спасибо╩). Данные из базы почти начисто отказывались
отображаться по-русски, показывая вместо себя вопросительные знаки.
После более тщательного прочтения мануала по FreeTDS на их родном сайте
я обнаружил, что для перекодирования текста она пользуется библиотекой
libiconv. После этого осталось пересобрать PHP с поддержкой этой же
библиотеки, и проблема почти была решена. Почти потому что если бы сайт
был написан в KOI8-R, то дальнейшие действия не пришлось производить, но
так как у нас програмеры работают на вынде и соответственно у них все
написано в 1251, то Apache все это перекодировал в двух разных
кодировках и получалось, что часть документа все время не читалась.
Пришлось опять брать бубен и читать, читать, читать. В результате я
где-то прочел, что нужно прописать напрямую Apache что б он использовал
вындовую кодировку. И после всех этих манипуляций все заработало
нормально.
Ну, со вступительной частью вроде закончил, теперь просто распишу, что и как.
С начала собираем FreeTDS . Версия FreeTDS 0.61 √ последняя на время
написания этого документа. Это делается достаточно просто:
./configure √with-tdsver=8.0 (у нас просто MSSQL восьмой версии, а так можно и другой)
make и make install
Установку Apache и PHP я не буду подробно описывать, благо этой
документации в рунете много, а просто напишу необходимые для наших целей
параметры.
И так для PHP помимо прочих опций нужно добавить:
--with-mssql=(здесь путь до директории куда был установлен FreeTDS)/usr/local √ в моем случае
--with-iconv для поддержки перекодировки текста
И потом можно устанавливать.
Apache собирается просто с поддержкой PHP.
После этого можно настраивать FreeTDS. В файле freetds.conf прописываем:
[global]
tds version = 8.0
initial block size = 512
swap broken dates = no
swap broken money = no
try server login = yes у меня используется аутентификация на сервере
try domain login = no а не на домене
cross domain login = no
text size = 64512
[mssql]
host = (здесь пишется ip вашего компьютера не котором стоит FreeTDS, если
на нем два и более интерефейса, то пишется ip локальной сети)
port = 1433 (стандартный порт MSSQL)
tds version = 8.0
На этом с настройкой FreeTDS покончено.
Осталось прописать только один параметр в настройках Apache. Не забудьте
перед этим поставить локаль CP1251, так как по умолчанию с FreeBSD она
не идет.
В файле apachectl пишем:
LANG=ru_RU.CP1251; export LANG
LC_ALL=ru_RU.CP1251; export LC_ALL
Этим мы привязываем локаль CP1251 к Apache для нормальной перекодировки.
И все можем запускать и проверять - все должно работать.
Всяческие вопросы можно задавать по адресу das-ich@yandex.ru
З.Ы. И вот совсем недавно я нашел один документ, но в нем написано как
подключать все тоже, но к Linux. Так-то можете почитать, если нужно
ставить на Linux http://www.opennet.ru/base/dev/mssql_php.txt.html
Das-ich.