Взаимодействие через ODBC c MS Access Оглавление Отображаем сообщения из базы

Добавление сообщения в базу

Минимальный набор программ, который необходим, чтобы пользователи сайта могли работать с гостевой книгой - это программа добавления сообщений и программа, которая будет выводить сообщения из нашей базы данных. На первом этапе администрирование гостевой книги можно вести через оболочку MS Access. Но это не всегда возможно, например, если ваш веб-сайт находится на другом континенте. Поэтому, в качестве самостоятельного упражнения вы будете разрабатывать программы для администрирования гостевой книги через Internet. Это программы просмотра, редактирования и удаления сообщений. Ну а пока приступим к рассмотрению первой CGI-программы - программы добавления сообщений в гостевую книгу. Запустите Microsoft Visual Studio и в меню File подменю New.

В появившемся диалоговом окне синим маркером выберите Win32 Console Application. Имя проекту дайте gbadd. Нажмите ОК и в следующем окне выберите тип приложения "An application that supports MFC".

Нажмите Finish и в следующем окне ОК. Первым делом выберите в меню Build подменю Set Active Configuration. И установите gbadd - Win32 Release. По умолчанию проект создается в отладочном режиме. Как правило, отладкой Visual Studio приходится не так уж часто пользоваться. Для отладки CGI-программ наиболее эффективно использовать отладочную печать. Но об отладке CGI-приложений мы поговорим отдельно, в одной из последующих глав данной книги.

В меню Projects выберите подменю Setting... и перейдите на вкладку Link. В поле Object/library modules добавте библиотеки: itcgi.lib и Ws2_32.lib, как показано на рисунке ниже.
В файл StdAfx.h после строки
#include <afxdtctl.h>            
 // MFC support for Internet Explorer 4 Common Controls
добавьте строчку
#include <afxdb.h>                  
      // MFC ODBC database classes
Теперь переходим к редактированию функции _tmain. Слева на панели проекта разверните содержимое папки Globals и дважды щелкните на функцию _tmain.
Подключите библиотеку itcgi.h и отредактируйте функцию _tmain следующим образом.
/////////////////////////////////////////////////////////////////////////////
// The one and only application object

#include <itcgi.h>
CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
//Если не удается подключить библиотеку MFC, то завершаем работу
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 return -1;


CDatabase  db;        //объект db для связи с базой данных
CString dsn, query;   // dsn нашей базы данных и SQL-запрос



//dsn получаем из HTML-формы, см. выше 
// HTML-код -  <input type="hidden" name="dsn" value="gb">
GetParamByName("dsn", dsn);

//формируем строку SQL-запроса
query="INSERT INTO message(name,email,http,subj,it_text,smile,it_date,ip)\
           VALUES ('%s', '%s', '%s', '%s', '%s','%s', NOW(), '##ip##')";


//Заменяем %s на значения соответствующих параметров, полученных 
//из HTML-формы.
//Обратите внимание, что поля в SQL-запросе и 
//параметры в HTML-форме
//следуют в одинаковом порядке.
//Единичка означает, что заменять поля надо, начиная 
//со второго параметра 
//HTML-формы. Если бы вместо 1 стоял бы 0, то первый %s 
//заменился бы не на 
//значение параметра name, а на значение параметра dsn. 
//Параметры у нас нумеруются
//с нуля, как это принято в языке Си.
GetFullSQLQuery(query, 1);


//Последним параметром у нас идет IP адрес, с которого
//пользователь зашел на наш сайт. Этот параметр мы получаем во время
//выполнения нашего CGI-скрипта. Обратите внимание на прием, которым
//мы воспользовались для вставки одной строки в другую, далее этот
//прием будет очень часто применяться при работе со строками.
query.Replace("##ip##", getenv("REMOTE_ADDR"));



//соединяемся с базой данных
//в случае ошибки переходим на метку LABEL_END см. ниже
try
{
 db.OpenEx("DSN="+dsn, CDatabase::noOdbcDialog);
}
catch(CDBException* e) 
{
 //Если не удалось соединится с базой, выдаем сообщение
 //об ошибке и выходим.
 printError("Внимание! Ошибка!!!", "Error: %s\nState: %s\n", 
                 e->m_strError, e->m_strStateNativeOrigin);
 goto LABEL_END;
}



//выполняем SQL-запрос
try
{
 db.ExecuteSQL(query);
}
catch(CDBException* e)
{
 //Если не удалось выполнить SQL-запрос, выдаем сообщение
 //об ошибке и выходим.
 printError("Внимание! Ошибка!!!", "%s\n%s\nquery=%s", 
                 e->m_strError, e->m_strStateNativeOrigin, query);
 goto LABEL_END;
}


//Выдаем HTTP-заголовок и возвращаем пользователя обратно
//в гостевую книгу.
printf("Location: %s\n\n",getenv("HTTP_REFERER"));


//Если во время выполнения скрипта произойдет ошибка,
//то будет напечатано сообщение при помощи функции printError
//и программа завершит свою работу.
LABEL_END:
if (db.IsOpen())
         db.Close();
return 0;
}

Соберите этот проект, кнопка F7. Затем скопируйте файл gbadd.exe из директории Release данного проекта в директорию /cgi-bin вашего веб-сайта. Вышеприведенную HTML-форму, как вы помните, мы сохранили в файле index.html в директории gb вашего веб-сайта. В броузере откройте страницу гостевой книги http://yoursite.ru/gb/index.html. Заполните поля ввода и нажмите кнопку "Опубликовать". Сообщение будет добавлено в базу данных. Можете открыть в MS Access созданную вами базу данных и убедится, что сообщения добавляются.