PHP и IIS, пример работы с базой данных

В данной статье Мы раскажем как установить PHP на Microsoft IIS, и рассмотрим простой пример "Форум", работа с базой данных (Microsoft Access) через драйвер ODBC.

Установка PHP

Скачиваем последнюю версию PHP под Windows c http://www.php.net, распаковываем на диск С:\ и переименовываем папку в PHP.
Открываем файл С:\PHP\PHP.INI-DIST

Раскоментируем строку
;cgi.force_redirect = 1
И заменим на
cgi.force_redirect = 0

Сохраним этот файл как PHP.INI в системный каталог C:\WINNT.

Настройка IIS для работы с PHP

Открываем консоль управления IIS
Пуск -> Настройка -> Панель управления -> Администрирование -> Internet Information Service:

На позиции "default web site" нажимаем правую кнопку мыши и выбираем "Свойства"

Выбираем закладку "Домашний каталог" и нажимаем на кнопку "Настройка"
В закладке "Сопоставления" нажимаем кнопку "Добавить"

Указываем что расширение .php обрабатывать интерпретатором c:\php\php.exe
После чего IIS настроен на обработку php страниц.

Проверка работоспособности PHP

Для проверки в любом редакторе создаем файл test.php

<?
phpinfo();
?>

Функция phpinfo(); выводит на экран текущие настройки PHP, а также информацию о сервере и переменных, операционной системе, HTTP заголовки, лицензионное соглашение.
Файл test.php нужно сохранить в каталог C:\INETPUB\WWWROOT
Затем в обозревателе набрать http://localhost/test.php
Если Вы сделали все правильно, то увидите на экране:

Делаем форум.

В Microsoft Access создайте базу данных Forum и в ней таблицу Forum со следующей структурой:

Имя поля Тип данных
code Счетчик
parentcode Числовой
title Текстовый
description Текстовый
uname Текстовый
email Текстовый

Code - Уникальное автоинкрементное поле, Parentcode - количество вложений, Title, description, uname и email - поля форума.

Создаем системный источник (DSN) В ODBC, для этого открываем:
Пуск -> Настройка -> Панель управления -> Администрирование -> Источники данных (ODBC):
Выбираем закладку "Системный DSN" и добавляем источник "forum", драйвер - Microsoft Access driver (*.mdb)
В нем выбираем базу данных forum.mdb.

Note! Во время создания DSN база данных должна быть закрытой, иначе Вы получите сообщение об ошибке.

Дальше, Вам нужно будет создать два PHP файла (forum.php и node.php) и поместить их в папку C:\INETPUB\WWWROOT.

Файл forum.php


  <?
  // Подключаемся к источнику DSN
  $connect = odbc_connect("forum", "root", "");
  ?> 
  <HTML> 
  <BODY> 
  Пример форума дискуссий написано на PHP/Access под IIS<BR> 
  <BR>
  <A HREF='node.php?node=0'>Новое сообщение</A>
  <?

  shownode(0); // Показать все главные вложения.

  function shownode($nodecode) 
  { 
     global $connect; // Используем глобальную переменную подключения
     // Берем список всех вложений для выбранного parentcode
     $noderesult = odbc_exec($connect,"select * from forum where parentcode = $nodecode");
     echo "<UL type='disc'>";
     while(odbc_fetch_row($noderesult)) // Взять все значения
     {
         $code = odbc_result($noderesult,"code");
         $title = odbc_result($noderesult,"title"); 
         $uname = odbc_result($noderesult,"uname"); 
         $email = odbc_result($noderesult,"email"); 
         echo "<LI>";
         echo "<A HREF='node.php?node=$code'> $title </A>";
         echo "-- by ($uname) $email<BR>";
         shownode($code);
     }
     echo "</UL>";
  }
  ?>
  </BODY>
  </HTML>"
    

Файл note.php


  <?
  $connect = odbc_connect("forum", "root", "");
  $node = $_GET[node];

  if(isset($_POST[submit])) // check if submitted button is clicked 
  {
     // insert the record in the database
     $query = "insert into forum (parentcode,title,description,uname,email)".
     "VALUES ($_POST[node],'$_POST[title]','$_POST[description]','$_POST[postname]','$_POST[email]')";
     $resultupdate=odbc_exec($connect,$query);
     header("location:forum.php"); // open forum.php file to display the thread
     exit; 

  }
  ?>
  <CENTER>Post to Discussion Forum using PHP/Access under IIS</CENTER> 

  <?
  if ( $node != 0 )
  {
     // Displaying the details of the thread
     echo "<HR>";
     $noderesult = odbc_exec($connect,"select * from forum where code = $node");
     $noderow=odbc_fetch_row($noderesult);
     $title = odbc_result($noderesult,"title");
     $description = odbc_result($noderesult,"description");
     $uname = odbc_result($noderesult,"uname");
     $email = odbc_result($noderesult,"email");
     echo "$title by ($uname) $email<BR>";
     echo "$description <BR><HR>";
  }
  ?>
  <!-- Form to enter the message -->
  <FORM method='post'>
  Name : <INPUT TYPE=TEXT NAME=postname> <BR>
  E-Mail : <INPUT TYPE=TEXT NAME=email> <BR>
  Title : <INPUT TYPE=TEXT NAME=title VALUE = '' size=50> <BR>
  Description : <BR> <TEXTAREA name=description rows=10 cols=45></TEXTAREA> 

  <!-- we need a hidden field to store the node -->
  <INPUT TYPE=hidden NAME=node value='<? echo $node;?>'> <BR> 

  <INPUT type=submit name=submit value='Post Message'>
  </FORM>
    

Note! Если у Вас раздел NTFS Вам нужно добавить доступ на запись в файл forum.mdb для пользователя Интернет гость (IUSR_<имя компьютера>)
Если при добавлении в форум у Вас будет возникать ошибка "Operation must use an updateable query", это означает что нехватает прав на запись.

Если Вы хотите подключать через ODBC другие базы данных, например Dbase, XLS, текстовые файлы:
То вам нужно будет изменить переменную $connect в зависимости от настроек. К многим SQL серверам (MySQL, PostgreSQL, Oracle) в PHP есть встроенные функции подключения.

Синтаксис PHP функции odbc_connect

odbc_connect (string dsn, string user, string password [, int cursor_type])

Возвращает id ODBC-соединения, 0 (FALSE) при ошибке.
id соединения, возвращаемый этой функцией, необходим для других ODBC-функций. Вы можете иметь одновременно открытыми несколько соединений. Необязательный четвёртый параметр устанавливает тип курсора, используемый для этого соединения. Обычно этот параметр не нужен, но может использоваться при решении проблем с некоторыми драйверами ODBC.

Некоторые ODBC-драйверы, выполняющие сложные хранимые процедуры, могут завершаться с ошибкой: "Cannot open a cursor on a stored procedure that has anything other than a single select statement in it". Использование SQL_CUR_USE_ODBC поможет избежать появления этой ошибки.
Также некоторые драйверы не поддерживают необязательный параметр row_number parameter в odbc_fetch_row(). И SQL_CUR_USE_ODBC может помочь в этом случае.

Для типа курсора определены следующие константы:

Дополнение к IIS 6.0

Как выяснилось для того чтобы поставить PHP на IIS 6.0 тоесть на 2003 сервер, нужно выполнить в дополнение всему написанному несколько телодвижений.

Заходим в "Internet Information Services Manager", Выбираем название компьютера Далее "Web services extensions".
Здесь регистриуем PHP приложение:
Для этого жмем "Add a new web service extensions"

В файле PHP.INI обязательно определяем переменную:
doc_root = "c:\inetpub\wwwroot"
Корень для PHP файлов.

Для NTFS незабываем проверить права для каталога
c:\inetpub\wwwroot - Где находится Веб сайт.
Для пользователей: IUSR_<имя компьютера>, IIS_WPG
Права на чтение и выполнение.

Я не писал выше что нужно скопировать библиотеки (.dll) из каталога c:\php\dlls в системную C:\WINNT\SYSTEM32 и прописать в PHP.INI
extension_dir = "c:\php\extensions"
Это так-же остается и для IIS 5.x.

Перезапуск IIS, но не перезапуск самого сайта и все готово :)

Проблемы с ODBC и встроенные функции (extensions) PHP для подключения к базам данных:

По правде сказать я никогда не встречал проблем именно с ODBC за исключением наличия самого драйвера. Например до сих пор помоему нет драйвера ODBC для Paradox.
Если у кого-то возникают проблемы с ODBC напишите подробнее, можно мне на Email или здесь в статье, я обязательно посмотрю в чем прична.
Этот пример подключения через драйвер ODBC был взят специально, всвязи с простым использованием. Ненужно менять синтаксис программы если Вы возмете не Access, как в примере, а например DBF или XLS. На сегодня драйверы ODBC существуют почти ко всем современным базам данных. Единственное что можно сказать в минус ODBC так это его скорость, но большинству не нужно обрабатывать гигабайтные базы данных, а, например, для форумов, гостевых книг, регистраций и многим другим маленьким программам это вполне подходит.
Если заглянуть в C:\PHP\EXTENSIONS то Мы увидим встроенные библиотеки подключения к базам данных, Вот стандартная поставка PHP 4.3.2 из названий видно к чему они относятся:

php_db.dll
php_dba.dll
php_dbase.dll
php_dbx.dll
php_domxml.dll
php_interbase.dll
php_ldap.dll
php_msql.dll
php_mssql.dll
php_oracle.dll
php_pgsql.dll - Необходима дополнительная библиотека libpq.dll
php_sybase_ct.dll

Все это тестировалось и работало на версии "PHP 4.3.2" и "IIS 5.1" и "IIS 6.0".
Переменная: register_globals = Off подробнее про переменные.

Написал:  Konstantin Petrenko


 

Hosted by uCoz