« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
    Популярное
Функция AccessResource

Русификация компонента TRichEdit

Основы HTML

Шифрование в Delphi

Лицензирование активных форм и ActiveX

Возможности реализации средств защиты сетевой информации на уровне ядра

Введение в технологию AJAX

Выражение

Пример работы с сокетами для Windows

Визуальный HTML редактор своими руками




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 172
Пользователей: 1
  • Psycho222

  • Статьи:: Интернет технологии :: PHP :: Пишем скрипт гостевой книги



    отправить ссылку другу версия для печати  Обсудить на форуме

    Пишем скрипт гостевой книги



    © Золотов Алексей 2005
    http://zolotov.h14.ru
    Zolotov A.

    В этой статье мы рассмотрим, как написать свою гостевую книгу. И так поставим цель: простейшую гостевую книгу на PHP с использованием базы данных MySQL. Наша гостевая не будет обременена красивым интерфейсом и защитой, главное, чтобы она работала. Приведенные здесь скрипты основаны на скриптах мой гостевой книги, но значительно упрощены для лучшего понимания принципа работы скриптов, а все остальное: форматирование текста, смайлы, скины и пр. можно легко добавить. Скачать готовые скрипты можно здесь.

    Этап первый: планирование.

    Для начала определимся с таблицей MySQL, в которой мы будем хранить сообщения нашей гостевой книги. Нам хватит одной таблицы. Основные параметры, которые должны быть в любой гостевой это имя, сообщение и дата, когда было оставлено сообщение. Но мы введем еще пару полей: адрес электронной почты, url сайта, и ICQ. Исходя из этого нам нужно составить SQL-запрос, создающий нужную нам таблицу. Он будет выглядеть так:

      CREATE TABLE $table(
        k_msg int primary key auto_increment,
        guest varchar(20),
        email varchar(40),
        url varchar(60),
        icq varchar(15),
        time int,
        msg mediumtext,
        replay mediumtext
    

    Что же мы сделали. Этот запрос создаст таблицу gbook и в ней будут определены следующие поля:

  • k_msg - уникальный номер сообщения, первичный ключ таблицы, он нам понабиться, когда мы будем работать над панелью модерирования нашей гостевой.
  • guest - имя гостя, 30 символов должно быть достаточно, но при желании можно и увеличить;
  • email - адрес электронной почты гостя;
  • url - URL-адрес сайта;
  • icq - аська гостя;
  • time - время, когда было оставлено сообщение;
  • msg - собственно сообщение. Тип mediumtext позволяет хранить текст размером до 64Кб;
  • replay - ответное сообщение от администратора.

    Этап второй: скрипт установки

    Рядовой пользователь может быть незнаком с PHP или MySQL, по этому мы не будем его обременять ручным созданием нужной нам таблицы и настройки нашей гостевой книги. Поэтому нам нужен инсталляционный скрипт который все сделает за него (и за нас тоже). Наш инсталляционный скрипт должен запросить у пользователя основные параметры у пользователя, подключиться к базе данных, создать таблицу и конфигурационный файл нашей гостевой книги.

    install.php

    <html>
    <head><title>Установка гостевой книги</title></head>
    <body>
    <h2>Установка гостевой книги</h2>
    <form action=<?=$SCRIPT_NAME?> method=post>
    <table>
    <tr><td align=right>Хост:</td>
    <td align=left><input type=text name=host value=<?=$host?>></td></tr>
    <tr><td align=right>Логин:</td>
    <td align=left><input type=text name=login value=<?=$login?>></td></tr>
    <tr><td align=right>Пароль:</td>
    <td aling=left><input type=password name=password></td></tr>
    <tr><td align=right>База:</td>
    <td align=left><input type=text name=database value=<?=$database?>></td></tr>
    <tr><td align=right>Таблица:</td>
    <td align=left><input type=text name=table value=<?=$table?>></td></tr>
    <tr><td align=right>Пароль админа:</td>
    <td align=left><input type=password name=pass></td></tr>
    </table>
    <input type=submit name=go value="Install">
    </form>
    <?
    function error()
    // Выводим сообщение об ощибке и выходим
    {
      echo "Error #".mysql_errno().": ".mysql_error();
      exit;
    }
    if(isset($go)):// Если пользователь передал параметры
    echo "Полключаемся к MySQL...<br>n";
    mysql_connect($host,$login,$password) or error();
    echo "Выбираем базу данных $database...<br>n";
    mysql_select_db($database) or error();
    echo "Удаляем таблицу (если существует) $table...<br>n";
    mysql_query("DROP TABLE IF EXISTS $table") or error();
    echo "Создаем новую таблицу $table...<br>n";
    mysql_query("
      CREATE TABLE $table(
        k_msg int primary key auto_increment,
        guest varchar(20),
        email varchar(40),
        url varchar(60),
        icq varchar(15),
        time int,
        msg mediumtext,
        replay mediumtext
      )") or error();
    // Создадим файл конфигурации и запишим в него
    // параметры подключения и пароль модератороа гостевой
    $f=fopen('gbook.conf','w');
    flock($f,LOCK_EX); // Исключительная блокировка файла
    fputs($f,"$host\n$login\n$password\n$database\n$table\n$pass");
    flock($f,LOCK_UN); // Снимаем блокировку с файла
    fclose($f);
    // Создадим файл .htaccess и укажем в нем
    // что поумолчанию нужно открывать файл gbook.php
    $f=fopen('.htaccess','w');
    flock($f,LOCK_EX);
    fputs($f,"DirectoryIndex gbook.phpn");
    flock($f,LOCK_UN);
    fclose($f);
    // Установим права на чтение/запись
    // только для владельца
    exec('chmod 600 gbook.conf');
    exec('chmod 600 install.php');
    // Все сделано можно перейти на готовую гостевую
    echo "<b>Инсталяция завершена</b><br>";
    echo "<a href=gbook.php>Гостевая книга</a>";
    endif;
    ?>
    </body>
    </html>
    

    Замечание. После создания конфигурационного файла мы выставляем на него права для чтения и записи только для хозяина. Это сделано для того, чтобы злоумышленник не смог прочесть наш файл конфигурации: в нем мы храним параметры подключения к базе данных и пароль модератора гостевой книги. Данная защита будет работать только на Unix/Linux хостинге. Для Windows-хостинга нужна другая защита, но приведенные команды не должны порождать ошибок.

    Этап третьий: отображение гостевой книги

    ЗЗдесь мы рассмотрим скрипт, отображающий нашу гостевую книгу. Мы в нескольких скриптах будем выполнять ряд одинаковых действий и, чтобы не повторяться вынесем их в один файл gbook.lib.

    gbook.lib

    <?
    function htmltrim($str)
    { // Просто для краткости
      return HtmlSpecialChars(trim($str));
    }
    function error($msg)
    // Выведм сообщение об ощибке и остановим скрипт
    {
      echo "<b>Ошибка:</b> $msg";
      exit;
    }
    function my_error()
    // Ошибка MySQL
    {
      echo "<b>Ошибка MySQL</b> #".mysql_errno().": ".mysql_error()."</b><br>";
      exit;
    }
    function my_no_cache()
    // Отключить кеширование страницы
    {
      Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
      Header("Cache-Control: no-cache, must-revalidate");
      Header("Pramga: no-cache");
      Header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); 
    }
    function my_redirect($url)
    // Включить перенаправление
    {
      echo '<html><head><meta http-equiv="refresh" content=1>
      <script language=JavaScript>location="'.$url.'"</script></head></html>';
    }
    $MY_MONTH_RU=array('января','февраля','марта','апреля','мая',
      'июня','июля','августа','сентября','октября','ноября','декабря');
    function my_date($d)
    // Форматирвание даты
    {
      global $MY_MONTH_RU;
      return date("j ",$d).$MY_MONTH_RU[date("m",$d)-1].date(" Y - H:i:s",$d);
    }
    function gbook_init()
    // Инициализация
    {
    // Объявим глобальные переменные
    global $table, $admin;
    // Прочитаем праметры подключения к БД
    $f=@fopen('gbook.conf','r') or error("<b>Нет файла конфигурации</b>");
    flock($f,LOCK_SH);
    $host=trim(fgets($f));
    $login=trim(fgets($f));
    $password=trim(fgets($f));
    $database=trim(fgets($f));
    $table=trim(fgets($f));
    $pass=trim(fgets($f));
    flock($f,LOCK_UN);
    fclose($f);
    // Подключаемся к БД
    mysql_connect($host,$login,$password) or my_error();
    mysql_select_db($database) or my_error();
    // Проверим пароль
    if(isset($_GET['sid']) || isset($_POST['sid']) || isset($_COOKIE['sid']))
    {
      if(isset($_POST['sid'])) $sid=$_POST['sid'];
      elseif(isset($_GET['sid'])) $sid=$_GET['sid'];
      else $sid=$_COOKIE['sid'];
      @SetCookie("sid",$sid,time()+60*15);
      $admin=($sid===md5($pass.date('dmYH')));
    }
    }
    my_no_cache();
    ?>
    

    Итак собственно скрипт отображающий гостевую книгу:

    gbook.php

    <?
    require_once "gbook.lib";
    gbook_init();
    // Выберем все сообщения из таблицы
    // записи сортируем по убыванию времени:
    // от последних сообщений к первым
    $r=mysql_query("select k_msg, guest, email, url, icq, time, 
      msg, replay from $table order by time desc") or my_error();
    $pgsz=8; // Количество сообщений на страницу
    $pgbar=''; // Здесь будет сформирован текст ссылок на страницы
    if(!isset($pg))$pg=0; // По умолчанию с первого сообщения
    $rows=mysql_num_rows($r); // Число записей = число сообщений
    $pgcnt=$rows/$pgsz; // Число страниц
    // Формируем строку страниц
    for($i=0;$i<$rows;$i+=$pgsz)
      if( ($i>=$pg) && ($i<($pg+$pgsz)) )
        $pgbar.=($i/$pgsz+1);
      else
        $pgbar.="<a href=gbook.php?pg=$i>".($i/$pgsz+1)."</a> ";
    ?>
    <html>
    <head>
    <title>Гостевая книга</title>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    </head>
    <body>
    <h2 align=center>Гостевая книга</h2>
    <div align=center><?=$pgbar?></div>
    <table width=100% border=1>
    <?
    // Выведем сообщения
    $i=0;
    while($f=mysql_fetch_array($r))
    {
      if( ($i>=$pg) && ($i<($pg+$pgsz)) )
      {
        echo "<tr><td align=center valign=top width=25%>";
        echo htmltrim($f['guest'])."<br>";
        $email=htmltrim($f['email']);
        $href='mailto:'.$email;
        echo "<a href=$href>$email</a><br>";
        $url=htmltrim($f['url']);
        echo "<a href=$url>$url</a><br>";
        echo "ICQ: ".htmltrim($f['icq'])."<br>";
        echo my_date($f['time']);
        echo "</td>";
        $mes=nl2br(htmltrim($f['msg']));
        echo "<td align=left valign=top>$mes";
        $replay=nl2br(htmltrim($f['replay']));
        if($replay):
          echo "<hr>$replay";
        endif;
        echo "</td>";
        if($admin):
          // А это только для адмнистратора
          echo "<td width=10% align=center valign=top>";
          // Ссылка для редактирования сообщения
          echo "<a href=replay.php?sid=$sid&id=$f[k_msg]>Ответить</a><br>";
          // Ссылка для удаления сообщения
          echo "<a href=drop.php?sid=$sid&id=$f[k_msg]>Удалить</a>";
          echo "</td>";
        endif;
        echo "</tr>";
      }
      $i++;
      if($i>=($pg+$pgsz)) break;
    }
    ?>
    </table>
    <div align=center><?=$pgbar?></div>
    <table align=center><tr><td>
    <form action="post.php" name=frm method=post>
    <h3 align=center>Оставьте свое сообщение</h3>
    <table>
    <tr><td align=right><b><font color=red>*</font>Имя:</b></td>
    <td><input class=e type=text name=Login size=40></td></tr>
    <tr><td align=right><b>e-mail:</b></td>
    <td><input class=e type=text name=Email size=40></td></tr>
    <tr><td align=right><b>URL сайта:</b></td>
    <td><input class=e type=text name=Url size=40></td></tr>
    <tr><td align=right><b>ICQ:</b></td>
    <td><input class=e type=text name=Icq size=40></td></tr>
    </table>
    <b><font color=red>*</font>Сообщение:</b><br>
    <center>
    <textarea class=t cols=40 rows=8 name=Msg></textarea><br>
    <input type=submit value="Отправить">
    </center>
    </form>
    <div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>
    <a href=http://zolotov.h14.ru>http://zolotov.h14.ru</a>
    </div>
    </body>
    </html>
    

    Вот и все. Это самое основное, осталось сделать панель модерирования гостевой книги, чтобы можно было легко удалять и редактировать оставленные сообщения. Для входа в режим администрирования создадим отдельный скрипт. Когда пользователь вводит пароль, то на основе его и текущей даты генерируется код сессии, если переданный в скрипт код сессии правильный, то считается, что зашел администратор, и ему открываются все возможности.

    admin.php

    <?
    $addr=dirname($SCRIPT_NAME);
    if($addr=='/')$addr='/gbook.php'; else $addr.='/gbook.php';
    $addr="http://".$SERVER_NAME.$addr;
    require_once "gbook.lib";
    if(isset($pass))
    {
      my_redirect($addr."?sid=".md5($pass.date('dmYH')));
      exit;
    }
    ?>
    <html>
    <head>
    <title>Гостевая книга</title>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    </head>
    <body>
    <h3 align=center>Вход в режим модерирования</h3>
    <form action=admin.php method=post>
    <table align=center><tr><td>
    <b>Введите пароль:</b>
    <input type=password name=pass>
    <input type=submit value="Войти">
    </td></tr></table></form>
    <div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>
    <a href=http://zolotov.h14.ru>http://zolotov.h14.ru</a></div>
    </body>
    </html>
    

    В главном скрипте в режиме адмнистратора мы создали ссылки для редактирования и удаления сообщений. Для начала приведу скрипт для удаления сообщения - он короче.

    drop.php

    <?
    require_once "gbook.lib";
    $id=trim($id);
    gbook_init();
    if(!$admin) error("Отказано в доступе");
    if(!$id) error("Незадан идентификатор удаляемого собщения<b>id</b>");
    // Удалим сообщение
    mysql_query("delete from $table where k_msg=$id") or my_error();
    $addr=dirname($SCRIPT_NAME);
    if($addr==='/') $addr.='gbook.php'; else $addr.='/gbook.php';
    $addr="http://".$SERVER_NAME.$addr;
    my_redirect($addr);
    echo "<b>Сообщение удалено. <a href=$addr>Назад</a></b>"
    ?>
    

    А теперь скприпт, отображающий страницу для редактирования сообщения.

    replay.php

    <?
    require_once "gbook.lib";
    $id=trim($id);
    gbook_init();
    if(!$admin) error("Отказано в доступе");
    if(!$id) error("Незадан идентификатор редактируемого собщения<b>id</b>");
    $r=mysql_query("select k_msg, guest, email, url, icq, time, msg, replay 
      from $table where k_msg=$id") or my_error();
    if(mysql_num_rows($r)==0) error("Сообщения с id=$id нет в гостевой таблице");
    $f=mysql_fetch_array($r);
    $name=htmltrim($f['guest']);
    $email=htmltrim($f['email']);
    $url=htmltrim($f['url']);
    $icq=htmltrim($f['icq']);
    $msg_n=htmltrim($f['k_msg']);
    $replay=htmltrim($f['replay']);
    $msg=htmltrim($f['msg']);
    $date=my_date($f['time']);
    ?>
    <html>
    <head>
    <title>Гостевая книга</title>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    </head>
    <body>
    <h3 align=center>Редактирование сообщения</h3>
    <form action=save.php method=post>
    <table align=center><tr><td>
    <table>
    <tr><th align=right>Имя:</th>
    <td><input class=e type=edit name=Login value='<?=$name?>'></td></tr>
    <tr><th align=right>E-Mail:</th>
    <td><input class=e type=edit name=Email value='<?=$email?>'></td></tr>
    <tr><th align=right>ICQ:</th><td>
    <input class=e type=edit name=Icq value='<?=$icq?>'></td></tr>
    <tr><th align=right>Сайт:</th><td>
    <input class=e type=edit name=Url value='<?=$url?>'></td></tr>
    <tr><th align=right>Дата:</th><td><?=$date?></td></tr>
    </table>
    </td><td>
    <b>Сообщение:</b><br>
    <textarea cols=40 rows=10 name=Msg><?=$msg?></textarea><br>
    <b>Ответ:</b><br>
    <textarea cols=40 rows=10 name=Replay><?=$replay?></textarea>
    </td></tr></table>
    <input type=hidden name=sid value=<?=$sid?>>
    <input type=hidden name=id value=<?=$msg_n?>>
    <center><input type=submit value='Сохранить'></center>
    </from>
    <div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>
    <a href=http://zolotov.h14.ru>http://zolotov.h14.ru</a></div>
    </body></html>
    

    Сохранение редактированного сообщения происходит в скрипте save.php

    save.php

    <?
    require_once "gbook.lib";
    $Login=trim($Login);
    $Email=trim($Email);
    $Url=trim($Url);
    $Icq=trim($Icq);
    $Msg=trim($Msg);
    $Replay=trim($Replay);
    $k_msg=trim($id);
    gbook_init();
    if(!$admin) error("Отказано в доступе");
    if(!$k_msg) error("Неуказан идентификатор <b>id</b> сохраняемого сообщения");
    if(!$Login || !$Msg)
      error("Поля <b>Имя</b> и <b>Сообщение</b> должны быть заданы");
    // Обновим запись
    mysql_query("update $table set guest='$Login', email='$Email', url='$Url',
      icq='$Icq', msg='$Msg', replay='$Replay' where k_msg=$k_msg") or my_error();
    $addr=dirname($SCRIPT_NAME);
    if($addr==='/') $addr.='gbook.php'; else $addr.='/gbook.php';
    $addr="http://".$SERVER_NAME.$addr;
    my_redirect($addr);
    echo "<b>Сообщение отправлено. <a href=$addr>Назад</a></b>"
    ?>
    

    Вот и весь скрипт. Осталось только установить и использовать.




  • Рубрика: PHP




    HTML 5: пять вещей вызывающих особый интер....

    Html

    HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.


    Подробнее... | Рубрика: Html | Добавлено: 22.12.2008

    asp.net: ListView с разных сторон.

    .NET компоненты

    Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.


    Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

    Создание кросс-таб отчета в Stimulsoft Rep....

    .NET компоненты

    Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.


    Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

    Остальные статьи:

    VivaMP - инструмент для OpenMP
    Создаем контекстно-зависимое WPF-приложени...
    Windows Vista SP2: что внутри и что важно?
    Вышел MySQL 5.1.30, первый стабильный рели...
    Тестирование параллельных программ
    Архитектура AMD64 (EM64T)
    Платформа 2009. Определяя будущее
    Windows Vista Bridge Sample Library - упра...
    Оптимизация 64-битных программ
    Подгрузка через AJAX HTML-кода, содержащег...
    Обзор нового релиза самой мощной Ajax библ...
    Firebug 1.3 и 1.4 alpha — что нового и инт...
    Релиз Microsoft Silverlight 2.0. Что новог...
    XML документация в C#
    Курсоры в MySQL 5
    Microsoft опубликовала подробности о сесси...
    Microsoft делится подробностями о том, что...
    Тестируем новый javascript от нового брауз...
    MySQL Query Cache
    Использование провайдеров компиляции в As...


    Цитата дня (все,добавить):

    Портал фрилансеров

    работа на дому


        Рубрикатор

    Программирование

    C/С++
    Обучение
    Windows API
    XAML
    Моделирование
    Паттерны
    Visual Basic 7 .NET
    WxWidgets
    Функции WinApi
    Функции С++
    Разработка под Mac OS
    Eiffel
    Visual Studio 2008
    UI дизайн
    Алгоритмы
    Конкурсные статьи
    Turbo Pascal
    Visual Studio
    CASE-средства
    Visual Studio 2005
    Без VCL
    Delphi
    Тех. документация
    Тестирование
    Software Testing
    ООП
    TCP/IP
    Google Android
    Windows Installer
    .NET Framework
    Драйвера
    C# C Sharp
    Справка
    Проектирование
    Информ. системы
    Visual Basic
    Assembler
    Оптимизация кода
    Gtk+
    Компоненты
    Реинжиниринг
    Управление проектами
    Extreeme programming
    Lotus Notes
    Алгебраическое проектирование


    Интернет технологии

    PHP
    Perl
    ASP
    WAP
    Cookies
    SSI
    CGI
    Web Servers
    VB Script
    DNS
    CSS
    XML
    Html
    Java Script
    Java2ME
    Firewall
    Flash
    .htaccess
    Apache
    VRML
    Протоколы
    Поисковые системы
    Технология JAVA
    Учебник по PHP
    Учебник по JavaScript
    Учебник по XML
    Java Q&A
    AJAX
    DHTML
    XHTML
    Dreamweaver
    Web 2.0
    Python
    Вебмастеру
    Cisco
    Ruby on Rails
    Silverlight

    Базы данных

    Access
    InterBase
    MySQL
    Oracle
    ADO .NET
    Основы SQL
    Учебник по Access 2002
    MS
    Microsoft FoxPro
    Доступ к данным
    XML в MS SQL Server 2000
    ODBC и MyODBC
    Обучение
    Caché
    DB2
    PostgresSQL
    Sybase
    Теория
    Хранилища данных
    Безопасность
    Реляционные данные
    MySQL и mSQL

    Остальное:

    Разное
    Обзоры книг
    Безопасность
    Графика и дизайн
    Юмор
    Linux
    Фракталы
    Microsoft Axapta
    Многоядерность
    Сети
    Microsoft Office
    Работа
    MS-DOS
    Криптография
    Графика и игроделание
    Новости SDK
    Системы защиты
    Учебник по AutoCad
    CVS
    Windows XP
    Windows Server 2003
    Windows Vista
    Windows 7
    Мероприятия