Commit bd34adf7 authored by Георгий Попов's avatar Георгий Попов

Merge branch 'new-client' into 'master'

New client Изменения клиента See merge request !1
parents 8066b045 c9fb870d
configuration.php configuration.php
/nbproject/private/
\ No newline at end of file
<?php
//Database
define('DB_DRIVER', 'mysql');
define('DB_HOSTNAME', 'localhost');
define('DB_USERNAME', 'barbass');
define('DB_PASSWORD', 'pass');
define('DB_DATABASE', 'barbass_typos_new');
//Support languages
define('DEFAULT_LANGUAGE', 'ru');
$LANGUAGES = array('ru');
//Минимальное время между запросами пользователя (секунды)
define('MIN_TIME', 60);
define('EMAIL', "typos@etersoft.ru");
?>
<div id="e_typos_div">
<div id="e_typos_title">
<span>Сервис опечаток</span>
<span title="Закрыть окно" id="e_typos_close" onclick="ETY.close();"><b>х</b></span>
</div>
<p id="e_typos_desc">Выделите текст и нажмите кнопку "Отправить"</p>
<p>
<nobr>Комментарий: <input type="text" id="e_typos_comment" name="e_typos_comment" size='19' maxlength="50" placeholder="Должна быть буква..."/></nobr>
</p>
<p id="e_typos_error"></p>
<p>
<input type="button" title="Отправить сообщение об опечатке" value="Отправить" class="e_typos_button" onclick="ETY.post_data();" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="button" title="Закрыть окно" value="Закрыть" class="e_typos_button" onclick="ETY.close();" />
</p>
</div>
...@@ -48,6 +48,9 @@ ETYPOS.prototype = { ...@@ -48,6 +48,9 @@ ETYPOS.prototype = {
//время последнего запроса //время последнего запроса
last_query_time: 0, last_query_time: 0,
//задержка между запросами
request_delay: 60000,
//сайт обработки опечаток //сайт обработки опечаток
server_url: "http://barbass.pubsandbox.eterhost.ru/typos/server.php", server_url: "http://barbass.pubsandbox.eterhost.ru/typos/server.php",
...@@ -198,7 +201,7 @@ ETYPOS.prototype = { ...@@ -198,7 +201,7 @@ ETYPOS.prototype = {
/*Создание формы с данными*/ /*Создание формы с данными*/
formData: function() { formData: function() {
if (!FormData()) { if (! new FormData()) {
throw new Error("FormData() не поддерживается"); throw new Error("FormData() не поддерживается");
return false; return false;
} }
...@@ -249,7 +252,6 @@ ETYPOS.prototype = { ...@@ -249,7 +252,6 @@ ETYPOS.prototype = {
try { try {
var response = window.JSON.parse(this_object.request.responseText); var response = window.JSON.parse(this_object.request.responseText);
if (response['success'] && response['message']) { if (response['success'] && response['message']) {
if (response['success'] == 'true') { if (response['success'] == 'true') {
var success = 'success'; var success = 'success';
...@@ -258,14 +260,14 @@ ETYPOS.prototype = { ...@@ -258,14 +260,14 @@ ETYPOS.prototype = {
} }
this_object.printMessage(success, response['message']); this_object.printMessage(success, response['message']);
} else { } else {
this_object.printMessage('attention', this.language[this.default_language]['error_response']); this_object.printMessage('attention', this_object.language[this_object.default_language]['error_response']);
} }
} catch (e) { } catch (e) {
this_object.printMessage('error', this.language[this.default_language]['error_response_parse']); this_object.printMessage('error', this_object.language[this_object.default_language]['error_response_parse']);
} }
}; };
this.request.onerror = function() { this.request.onerror = function() {
this_object.printMessage("error", this.language[this.default_language]['error_post_data']); this_object.printMessage("error", this_object.language[this_object.default_language]['error_post_data']);
}; };
this.request.send(form_data); this.request.send(form_data);
}, },
...@@ -288,7 +290,7 @@ ETYPOS.prototype = { ...@@ -288,7 +290,7 @@ ETYPOS.prototype = {
return true; return true;
} }
if ( (this.getTime() - prev_time) < 60000) { if ( (this.getTime() - prev_time) < this.request_delay) {
return false; return false;
} }
......
<html> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<title>Сервис опечаток</title> <title>Сервис опечаток</title>
<script src="etersoft_typos.js"></script> <script src="etersoft_typos.js"></script>
<script src="etersoft_typos_language-ru.js"></script> <script src="etersoft_typos_language-ru.js"></script>
<link type="text/css" href="stylesheet.css" rel="stylesheet" /> <link type="text/css" href="stylesheet.css" rel="stylesheet" />
</head> </head>
<body> <body>
<script type='text/javascript'> <script type='text/javascript'>
window.onload = function() { window.onload = function () {
var typos = new ETYPOS(); var typos = new ETYPOS();
document.querySelectorAll('.e_typos_div .e_typos_close')[0].addEventListener('click', function() {typos.closeWindow();}, false); document.querySelectorAll('.e_typos_div .e_typos_close')[0].addEventListener('click', function () {
document.querySelectorAll('.e_typos_div .e_typos_close')[1].addEventListener('click', function() {typos.closeWindow();}, false); typos.closeWindow();
document.querySelector('.e_typos_div .e_typos_post').addEventListener('click', function() {typos.postData();}, false); }, false);
document.querySelectorAll('.e_typos_div .e_typos_close')[1].addEventListener('click', function () {
window.document.onkeydown = function(e) { typos.closeWindow();
if (e.ctrlKey == 1 && e.keyCode == 13) { }, false);
typos.controlPanel(); document.querySelector('.e_typos_div .e_typos_post').addEventListener('click', function () {
} typos.postData();
}; }, false);
}
</script> window.document.onkeydown = function (e) {
if (e.ctrlKey == 1 && e.keyCode == 13) {
<div class="e_typos_div"> typos.controlPanel();
<div class="e_typos_title"> }
<span>Сервис опечаток</span> };
<span title="Закрыть окно" class="e_typos_close"><b>х</b></span> }
</div> </script>
<p class="e_typos_desc">Выделите текст и нажмите кнопку "Отправить"</p> <div class="e_typos_div">
<div class="e_typos_title">
<p> <span>Сервис опечаток</span>
<nobr>Комментарий: <input type="text" class="e_typos_comment" size='19' maxlength="50" placeholder="Должна быть буква..."/></nobr> <span title="Закрыть окно" class="e_typos_close"><b>х</b></span>
</p> </div>
<p class="e_typos_message"></p> <p class="e_typos_desc">Выделите текст и нажмите кнопку "Отправить"</p>
<p class='e_typos_controll_buttons'> <p>
<input type="button" title="Отправить сообщение об опечатке" value="Отправить" class="e_typos_button e_typos_post" /> <nobr>Комментарий: <input type="text" class="e_typos_comment" size='19' maxlength="50" placeholder="Должна быть буква..."/></nobr>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<input type="button" title="Закрыть окно" value="Закрыть" class="e_typos_button e_typos_close" />
</p> <p class="e_typos_message"></p>
</div>
<p class='e_typos_controll_buttons'>
<div> <input type="button" title="Отправить сообщение об опечатке" value="Отправить" class="e_typos_button e_typos_post" />
Казахста́н (официально Респу́блика Казахста́н, каз. Қазақстан [qɑzɑqˈstɑn]) — государство, располагающееся в центре Евразии, бо́льшая часть которого относится к Азии, а меньшая — к Европе, Казахстан располагается между Каспийским морем, Нижним Поволжьем, Уралом, Сибирью, Китаем и Средней Азией. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="button" title="Закрыть окно" value="Закрыть" class="e_typos_button e_typos_close" />
По площади территории занимает девятое место среди государств мира (2 млн 724,9 тыс. км²). Расположение: от восточной окраины дельты Волги на западе до Алтайских гор на востоке, от Западно-Сибирской равнины и южной оконечности Урала на севере до Тянь-Шаньской горной системы и пустыни Кызылкум на юге страны. </p>
</div>
Граничит на севере и западе с Россией — 7548,1 км, на востоке — с Китаем — 1782,8 км, на юге — с Киргизией — 1241,6 км, Узбекистаном — 2351,4 км и Туркменией — 426,0 км. Общая протяженность сухопутных границ — 13392,6 км[1]. Омывается водами внутриконтинентальных Каспийского и Аральского морей. Казахстан — крупнейшая страна, не имеющая выхода в Мировой океан.
<div>
В административно-территориальном отношении делится на 14 областей и 2 города республиканского значения. Экономико-географически делится на Центральный, Западный, Восточный, Северный и Южный регионы Казахста́н (официально Респу́блика Казахста́н, каз. Қазақстан [qɑzɑqˈstɑn]) — государство, располагающееся в центре Евразии, бо́льшая часть которого относится к Азии, а меньшая — к Европе, Казахстан располагается между Каспийским морем, Нижним Поволжьем, Уралом, Сибирью, Китаем и Средней Азией.
</div>
По площади территории занимает девятое место среди государств мира (2 млн 724,9 тыс. км²). Расположение: от восточной окраины дельты Волги на западе до Алтайских гор на востоке, от Западно-Сибирской равнины и южной оконечности Урала на севере до Тянь-Шаньской горной системы и пустыни Кызылкум на юге страны.
Граничит на севере и западе с Россией — 7548,1 км, на востоке — с Китаем — 1782,8 км, на юге — с Киргизией — 1241,6 км, Узбекистаном — 2351,4 км и Туркменией — 426,0 км. Общая протяженность сухопутных границ — 13392,6 км[1]. Омывается водами внутриконтинентальных Каспийского и Аральского морей. Казахстан — крупнейшая страна, не имеющая выхода в Мировой океан.
В административно-территориальном отношении делится на 14 областей и 2 города республиканского значения. Экономико-географически делится на Центральный, Западный, Восточный, Северный и Южный регионы
</div>
</body> </body>
<?php
/*************************************
* Вспомогательные функции:
* - работа с письмами
* - работа с данными сессии
* - получение REQUEST-данных
* - проверка ip и header-ов пользователя
* - валидация данных
* - вывод текста в json-формате
* - работа с url-ми
*************************************/
/*Отправка email-ов*/
function sendMail($subject,$body, $to, $from_email, $from_name, $type = 'plain') {
$headers = "X-PHP-Script: ".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]." for ".$_SERVER['SERVER_ADDR']."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Return-path: <".$from_email.">\r\n";
$headers .= "Content-type: text/".$type."; format=flowed; charset=utf-8; reply-type=original\r\n";
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
$headers .= "X-Priority: 3\r\n";
$headers .= "X-MSMail-Priority: Normal\r\n";
$headers .= "X-Mailer: Automatic PHP Script\r\n";
$headers .= "From:".$from_name."<".$from_email.">\r\n";
if (mail($to, $subject, $body, $headers)) {
return true;
} else {
return false;
}
}
/*Формирование списка кому отправлять email-ы*/
function toEmail($data) {
$to = "";
$count = count($data);
for ($i = 0; $i < $count; $i++) {
$to .= $data[$i]['email'];
if ($i < ($count - 1)) {
$to .= ",";
}
}
return $to;
}
/*Проверяем хэдеры на "человечость"*/
function checkHeader() {
if ( empty($_SERVER['HTTP_ACCEPT']) ||
empty($_SERVER['HTTP_ACCEPT_ENCODING']) ||
empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ||
empty($_SERVER['HTTP_CONNECTION'])
) {
return false;
}
return true;
}
/*Получаем ip*/
function getIp() {
$ip = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!empty($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
return false;
}
return $ip;
}
/*Выводим массив в json-формате*/
function echoJsonData($data) {
global $userdata;
if ($userdata['old_browser'] == 1) {
echo " <script type='text/javascript'>window.close();</script>";
} else {
echo json_encode($data);
}
return true;
}
/*Устанавливаем данные в сессию*/
function setSession($key, $value) {
$_SESSION[strval($key)] = serialize($value);
}
//Получаем данные из сессии
function getSession($key) {
return (isset($_SESSION[strval($key)])) ? unserialize($_SESSION[strval($key)]) : false;
}
/*Получаем request-данные*/
function getRequest($key = '', $return = false) {
return (isset($_REQUEST[$key])) ? trim($_REQUEST[$key]) : $return;
}
/*Проверка данных*/
function validate() {
global $error, $code_language, $_language;
if (!checkHeader() && !getIp()) {
$error = $_language[$code_language]["error_header"];
return false;
}
if (strlen(rawurldecode(getRequest('url', ''))) <= 0) {
$error = $_language[$code_language]["error_url"];
return false;
}
if (!checkUrl(getRequest('url', ''))) {
$error = $_language[$code_language]["error_valid_url"];
return false;
}
if (strlen(getRequest('text', '')) < 5 || strlen(getRequest('text', '')) > 30) {
$error = sprintf($_language[$code_language]["error_text"], 5, 30, strlen(getRequest('text', '')));
return false;
}
if (strlen(getRequest('comment', '')) > 30) {
$error = sprintf($_language[$code_language]["error_text"], strlen(getRequest('text', '')));
return false;
}
return true;
}
/*Проверка url-а*/
function checkUrl($url = '') {
//удаление опасных сиволов
$url = trim(preg_replace("/[^\x20-\xFF]/","",@strval($url)));
//проверяем УРЛ на правильность
if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".
"!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i", $url)) {
return false;
}
return true;
}
function getFormatingUrl($url) {
//удаление опасных сиволов
$url = trim(preg_replace("/[^\x20-\xFF]/","",@strval($url)));
//если нет протокола - добавляет http://
if (!strstr($url,"://")) {
$url = "http://".$url;
}
//заменить протокол на нижний регистр: hTtP -> http
$url = preg_replace("~^[a-z]+~ie","strtolower('\\0')", $url);
return $url;
}
?>
<?php
/*Языковые сообщения*/
//Error
$_language['ru']['error_time_activity'] = "Вы слишком часто отправляете данные";
$_language['ru']['error_connect_database'] = "Ошибка при подключении к базе данных";
$_language['ru']['error_database'] = "Ошибка при работе с базой данных";
$_language['ru']['error_header'] = "Отсутствуют ip или заголовки ответа";
$_language['ru']['error_url'] = "Отсутствует url сайта";
$_language['ru']['error_valid_url'] = "Не верный формат url-а сайта";
$_language['ru']['error_text'] = "Длина текста должна быть от %s до %s символов (сейчас: %s)";
$_language['ru']['error_comment'] = "Длина комментария должна быть до 30 символов (сейчас: %s)";
$_language['ru']['error_support_site'] = "Сайт не поддерживается";
//Success
$_language['ru']['text_success'] = "Данные сохранены. Спасибо за внимание!";
//Mail
$_language['ru']['mail_subject'] = "Сообщение об опечатке";
$_language['ru']['mail_from'] = "Служба опечаток Etersoft";
$_language['ru']['mail_error'] = "Ошибка при отправлении письма";
$_language['ru']['mail_site'] = "Сайт:";
$_language['ru']['mail_url'] = "Ссылка:";
$_language['ru']['mail_click_url'] = "нажмите";
$_language['ru']['mail_comment'] = "Комментарий:";
$_language['ru']['mail_text'] = "Текст с опечаткой:";
?>
<?php
/* Цель: Скрипт обработки опечаток
* автор: barbass@
* дата: 2012-04-24
*/
header('Access-Control-Allow-Origin: *');
require_once('configuration.php');
require_once('functions.php');
require_once('language.php');
/*Начинаем сессию*/
if (!session_id()) {
session_start();
}
/*Определяем переменные*/
$error = '';
$userdata = array(
'url' => '',
'text' => '',
'comment' => '',
'old_browser' => 0
);
$code_language = DEFAULT_LANGUAGE;
/*Определяем какой язык использовать (или же оставляем по-умолчанию)*/
if (in_array(getRequest('language', 'ru'), $LANGUAGES)) {
$code_language = getRequest('language', 'ru');
}
/*Если часто отправляет (более 1 раза в минуту)*/
$last_time_activity = getSession('last_activity');
setSession('last_activity', time());
if ($last_time_activity) {
if ((time() - $last_time_activity) <= MIN_TIME) {
echoJsonData(array('success' => 'false', 'message' => $_language[$code_language]['error_time_activity']));
return;
}
}
/*Подключение к базе данных*/
try {
$DBH = new PDO(DB_DRIVER.":host=".DB_HOSTNAME.";dbname=".DB_DATABASE, DB_USERNAME, DB_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
} catch (PDOException $e) {
echoJsonData(array('success' => 'false', 'message' => $_language[$code_language]['error_connect_database']));
return false;
}
if (!validate()) {
echoJsonData(array('success' => 'false', 'message' => $error));
return false;
}
//TODO - работу со старыми бразуерами будем подерживать или нет? Если будем, то надо доработать работу на стороне сервера (закрытие окна)
$userdata['old_browser'] = getRequest('old_browser', 0);
$userdata['comment'] = htmlspecialchars(rawurldecode(getRequest('comment', '')));
$userdata['url'] = getFormatingUrl(rawurldecode(getRequest('url', '')));
$userdata['text'] = htmlspecialchars(rawurldecode(getRequest('text', '')));
/*Парсим сайт для получения коренного сайта*/
$mas_url = parse_url($userdata['url']);
if (!isset($mas_url['host'])) {
echoJsonData(array('success' => 'false', 'message' => $_language[$code_language]["error_valid_url"]));
return;
}
/**********************************
* Основная часть работы:
* - получения данных по сайту
* - сохранение текста с ошибкой
* - отправка писем
**********************************/
/*Достаем номер сайта и email-ы пользователей*/
try {
$query_emails = "SELECT r.id_site AS id_site,
u.email AS email
FROM users AS u, responsible AS r
WHERE r.id IN (
SELECT r.id
FROM responsible AS r
JOIN sites AS s
WHERE s.site = ?
AND r.id_site = s.id
AND r.status = '1')
AND r.id_user = u.id";
$STH = $DBH->prepare($query_emails);
$STH->execute(array($mas_url["host"]));
if ($STH->rowCount() > 0) {
$email_users = array();
while ($row = $STH->fetch(PDO::FETCH_ASSOC)) {
$email_users[] = array(
'id_site' => $row['id_site'],
'email' => $row['email']
);
}
} else {
$email_users = false;
}
} catch (PDOException $e) {
echoJsonData(array('success' => 'false', 'message' => $_language[$code_language]["error_support_site"]));
return;
}
/*Если активных пользователей за сайт нет, то возвращаем сообщение об ошибке*/
if ($email_users) {
try {
$data = array('NULL', $email_users[0]['id_site'], $userdata['url'], $userdata['text'], $userdata['comment'], 0);
$STH = $DBH->prepare("INSERT INTO messages (id, id_site, link, error_text, comment, datetime, status) VALUES (?, ?, ?, ?, ?, DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'), ?)");
$STH->execute($data);
} catch (PDOException $e) {
echoJsonData(array('success' => 'false', 'message' => $_language[$code_language]['error_database']));
return;
}
$message_email = "<p>".$_language[$code_language]['mail_site']." <a href=".$mas_url["scheme"]."://".$mas_url["host"].">".$mas_url["scheme"]."://".$mas_url["host"]."</a></p>";
$message_email .= "<p>".$_language[$code_language]['mail_url']." <a href=".htmlspecialchars($userdata['url']).">".$_language[$code_language]['mail_click_url']."</a>"." (".$userdata['url'].")"."</p>";
$message_email .= "<p>".$_language[$code_language]['mail_text']." ".htmlspecialchars($userdata['text'])."</p>";
$message_email .= "<p>".$_language[$code_language]['mail_comment']." ".htmlspecialchars($userdata['comment'])."</p>";
$subject = '=?utf-8?B?'.base64_encode($_language[$code_language]['mail_subject']).'?=';
$to = toEmail($email_users);
$from_email = EMAIL;
$from_name = '=?utf-8?B?'.base64_encode($_language[$code_language]['mail_from']).'?=';
if(sendMail($subject, $message_email, $to, $from_email, $from_name, 'html')) {
echoJsonData(array('success' => 'true', 'message' => $_language[$code_language]['text_success']));
return;
} else {
echoJsonData(array('success' => 'false', 'message' => $_language[$code_language]['mail_error']));
return;
}
} else {
echoJsonData(array('success' => 'false', 'message' => $_language[$code_language]['error_support_site']));
return;
}
-- phpMyAdmin SQL Dump
-- version 3.3.10
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Дек 25 2012 г., 14:30
-- Версия сервера: 5.1.63
-- Версия PHP: 5.3.18
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- База данных: `barbass_typos_new`
--
-- --------------------------------------------------------
--
-- Структура таблицы `messages`
--
CREATE TABLE IF NOT EXISTS `messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_site` int(11) NOT NULL,
`link` text NOT NULL COMMENT 'Ссылка на страницу',
`error_text` varchar(100) NOT NULL COMMENT 'Выделенный текст ',
`comment` varchar(50) DEFAULT NULL COMMENT 'комментарий пользователя',
`date` datetime NOT NULL,
`status` tinyint(1) NOT NULL COMMENT '1: исправлена, 0: нет',
PRIMARY KEY (`id`),
KEY `id_site` (`id_site`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Сообщения' AUTO_INCREMENT=325 ;
-- --------------------------------------------------------
--
-- Структура таблицы `responsible`
--
CREATE TABLE IF NOT EXISTS `responsible` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_site` int(11) NOT NULL,
`id_user` int(11) NOT NULL,
`status` tinyint(1) NOT NULL COMMENT 'Возможность отписать себя с рассылки',
`date` datetime NOT NULL COMMENT 'Дата регистрации пользователя на сайт',
PRIMARY KEY (`id`),
KEY `id_site` (`id_site`),
KEY `id_user` (`id_user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Зависимость сайтов и ответственных' AUTO_INCREMENT=34 ;
-- --------------------------------------------------------
--
-- Структура таблицы `sites`
--
CREATE TABLE IF NOT EXISTS `sites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`site` varchar(150) NOT NULL COMMENT 'Формат: mysite.ru',
`date` datetime NOT NULL COMMENT 'Дата регистрации',
PRIMARY KEY (`id`),
UNIQUE KEY `site` (`site`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Список сайтов' AUTO_INCREMENT=46 ;
-- --------------------------------------------------------
--
-- Структура таблицы `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(100) NOT NULL,
`type` enum('admin','user') NOT NULL DEFAULT 'user' COMMENT 'Тип пользователя',
`email` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`firstname` varchar(100) NOT NULL,
`middlename` varchar(100) NOT NULL,
`lastname` varchar(20) NOT NULL,
`activity` enum('1','0') NOT NULL DEFAULT '0' COMMENT 'Активирован аккаунт',
`date` datetime NOT NULL COMMENT 'Дата добавления',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Пользователи системы' AUTO_INCREMENT=55 ;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment