Добавление сообщения в базу
Минимальный набор программ, который необходим, чтобы пользователи сайта могли работать с гостевой книгой - это программа добавления сообщений и программа, которая будет выводить сообщения из нашей базы данных. На первом этапе администрирование гостевой книги можно вести через оболочку 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 созданную вами базу данных и убедится, что сообщения добавляются.
|