четверг, 16 сентября 2010 г.

Postgresql в Windows. Установка и импорт старой базы.

Установка нового сервера.
Через "Управление" в Моем компьютере создаем пользователя postgres. Копируем PostgerSQL на диск C. Для этого надо определится с версией и скачать архив с названием  postgresql-x.x.x-binaries-no-installer.zip ее скачать отсюда.
Ок. Теперь надо инициализировать кластер. Для этого надо открыть консоль от пользователя postgres. Нажимаем Пуск->Выполнить и вводим
runas /user:postgres cmd
Появится окошко с запросом пароля пользователя postgres. Теперь собственно инициализация кластера. 
c:\pgsql\bin\initdb.exe -E win1251 -D c:\pg_data
Файлы базы данных будут хранится в папке c:\pg_data, включая и файлы настройки доступа. После успешной инициализации кластера предагается его запустить парой способов. Но в windows есть службы, которыми гораздо удобнее пользоваться чем скриптами запуска в автозагрузке.
Создаем службу. Для этого нужно запустить консоль от имени администратора. 
c:\pgsql\bin\pg_ctl.exe register -N "PostgreSQL" -U postgres -D с:\pg_data
Теперь Панель управления->Администрирование->Службы. В списке появилась новая служба PostgreSQL. В ее свойствах, во вкладке "Вход в систему" нужно ввести правильный пароль пользователя postgres и нажать Применить. Все, теперь службу можно запустить. 
Если предполагается подключение из локальной сети, то нужно изменить некоторые настройки. Во-первых надо открыть файл c:\pg_data\pg_hda.conf. В нем найти строку 
host    all         all         127.0.0.1/32          trust
и под ней добавить новую
host    all         all         192.168.1.1/24      trust
в которой написано, что подключаться могут компьютеры локальной сети с адресами 192.168.1.х. Далее, в файле c:\pg_data\postgresql.conf нужно отредактировать параметры listen_addresses и port. Должно получится так 
listen_addresses = '*'       
port = 5432              
Все, после перезагрузки сервера к нему можно будет подключится из локальной сети.
Теперь самое интересное. Импорт старой базы. Если импорт производился правильно, т.е. так:
c:\pgsql\bin\pg_dump -Fc mydb > db.dump
то экспорт особого труда не составит. Нужно создать базу данных с названием mydb. Это можно сделать из pgadmin'а. Все, теперь можно импортировать. 
c:\pgsql\bin\pg_restore -C -d mydb db.dump
  Вот и все.

воскресенье, 5 сентября 2010 г.

[upload][php]тонкости. Или то, о чем мало пишут.

как это делается описано во многих местах, например
http://www.phpclub.ru/detail/article/upload
но есть 3 момента, из-за которых будут проблемы.
1) не забыть в форму задать в виде
enctype="multipart/form-data" action="/upload.php" method="post">
важный момент выделен жирным.

2) при создании каталога для хранения файлов нужно дать ему разрешение на все т.е.
chmod 777 uploaddir
3) существует заблуждение, что владельцем каталога должен быть пользователь, от имени которого работает apache или php. Нет! Владельцем каталога должен быть именно тот пользователь, который владеет скриптом.

Далее)
Как хранить ссылки на файлы, так чтоб их можно было скачать?
Это конечно интересный вопрос. Казалось бы, что может быть проще, записали в базу имя и вперед. Но, опять это дурацкое но)) Все я не пробовал проверять, но у меня возникают сомнения по поводу русских названий и пробелов. А если вспомнить кодировки и то, что хостинг обычно крутится на BSD или Linux, а большенство пользователей сидит на винде... Вобщем, универсальным решением я, для себя, выбрал перевод имен файлов в транслит. Вот такой замечательной функцией:


  1. <?php
  2. public function encodeS($st)
  3.     {
  4.         $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_","abvgdeeziyklmnoprstufh'iei");
  5.         $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_","ABVGDEEZIYKLMNOPRSTUFH'IEI");
  6.         $st=strtr($st," ","_");
  7.     // Затем - "многосимвольные".
  8.  
  9.        $st=strtr($st,
  10.                     array(
  11.                         "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
  12.                         "щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
  13.                         "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
  14.                         "Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA",
  15.                         "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
  16.                         )
  17.              );
  18.     // Возвращаем результат.
  19.        return $st;
  20.     }
  21. ?>