MySQL Для новичков

Тема в разделе 'MySQL', создана пользователем XmP, 9 май 2011.

  1. XmP ADD ebx, 110h

    Обучающая статья от ведущего разработчика phpMyAdmin Марка Делисла

    Автор: Марк Делисл
    Перевод: Иван Шумилов

    Данная статья предназначена для веб-мастеров, которые только начинают знакомиться с основами SQL. В качестве инструментария используются сервер баз данных MySQL и интерфейс их администрирования - phpMyAdmin. Последний и будет использоваться в данной статье в качестве инструмента для изучения SQL.

    Что такое SQL?

    SQL
    (англ. Structured Query Language - язык структурированных запросов) - универсальный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. Этот язык был разработан IBM (экспериментальная СУБД "System R") в 1974-1979 годах. Первый стандарт языка SQL был принят Американским национальным институтом стандартизации (ANSI) в 1987 (так называемый SQL level 1) и несколько уточнён в 1989 году (SQL level 2), 1992 и 1999 году. После этого, индустрия начала широко использовать SQL как язык реляционных баз данных, и на сегодняшний день практически каждая база данных основана на SQL.
    Архитектура данных, к которой обращается SQL называется
    реляционной
    . В реляционных базах данных все данные представлены в виде простых таблиц, разбитых на строки и столбцы, на пересечении которых расположены данные. Запросы к таким таблицам возвращают таблицы, которые сами могут становиться предметом дальнейших запросов. Каждая база данных может включать несколько таблиц, которые, как правило, связаны друг с другом, откуда и произошло название реляционные.
    В данной статье мы будем использовать MySQL, популярную открытую реализацию SQL, которая предоставляется абсолютным большинством хостинг-провайдеров.

    Инструментарий для данной статьи

    Для выполнения упражнений, приведенных в данной статье, потребуется доступ к MySQL-серверу. В качестве интерфейса для MySQL используется phpMyAdmin - PHP приложение, запущенное на Web-сервере. Для полного ознакомления с возможностями phpMyAdmin рекомендуется прочитать книгу "Mastering phpMyAdmin for effective MySQL Management".
    Эта статья познакомит Вас с основами синтаксиса SQL, время от времени, предлагая Вам ввести выражения; покажет, как phpMyAdmin генерирует MySQL-запросы на основе ваших действий через интерфейс.

    Создание таблиц в phpMyAdmin
    В качестве примера, мы будем использовать географическую информационную систему. Допустим, мы решили, что нам необходима информация о городах и странах - таким образом, нам понадобятся две таблицы, которые будут частью базы данных `geodb`. Для создания таблиц можно использовать вкладку "Structure" на странице просмотра базы данных, или использовать блок SQL-запросов для ввода соответствующего выражения:
    Чтобы создать таблицу, воспользуемся выражением CREATE TABLE, в котором мы зададим имя нашей новой таблицы. Выражение начинается с CREATE TABLE, после которой следует имя таблицы. Затем в скобках указывается список столбцов, и информация о ключах. Каждому столбцу дается имя, указывается тип данных, указывается атрибут NULL или NOT NULL (здесь, NOT NULL означает, что колонка не может иметь значение NULL), и значение по умолчанию, если оно уместно.
    Код:
    CREATE TABLE cities ( id int(11) NOT NULL auto_increment, city_name varchar(50) NOT NULL default '', latitude varchar(15) NOT NULL default '', longitude varchar(15) NOT NULL default '', population int(11) NOT NULL default '0', country_code char(2) NOT NULL default '', PRIMARY KEY (id) ) TYPE=MyISAM AUTO_INCREMENT=1 ;
    Столбец id - это первичный ключ (primary key), колонка, которая уникально идентифицирует каждый город. Тип данных этого столбца - INT (целое число нормального размера), MySQL назначает уникальные значения для этого столбца, благодаря атрибуту auto_increment. Обратите внимание на то, что мы не можем использовать название городов в качестве первичного ключа, т.к. некоторые имена городов не уникальны в мире. Для отображения численности населения мы также используем целое число.
    Другие столбцы используют в качестве типов данных строки фиксированной длины (CHAR) либо строки переменной длины (VARCHAR). Когда мы точно знаем длину строки, лучше использовать CHAR, задавая длину столбца как CHAR(2). В противном случае, мы используем в качестве типа данных строки переменной длины, указывая только максимальную длину строки, например: VARCHAR(15).
    После списка столбцов, мы можем указать дополнительные параметры таблицы, например, её тип, первое значение для столбца автоинкремента. SQL-выражение заканчивается точкой с запятой.
    Создав таблицу для городов, мы делаем ту же операцию, но на этот раз для таблицы стран.
    Код:
    CREATE TABLE countries ( country_code char(2) NOT NULL default '', country_name varchar(100) NOT NULL default '' ) TYPE=MyISAM;
    Заметьте, что столбец `country_code` присутствует в обеих таблицах. Это отражает принцип связи: country_code в `cities` связан с одноименным столбцом в таблице `countries`. Таким образом, мы экономим на месте, указывая название страны в базе данных только однажды.
    В другой статье (Migrating to InnoDB) техника связывания рассматривается более подробно. После того как таблицы созданы, следует ввести в них какие-нибудь данные.

    Изменение табличных данных с помощью phpMyAdmin.

    В данном разделе мы изучим базовый синтаксис выражений INSERT, UPDATE, DELETE, и SELECT.

    Добавление данных с помощью INSERT
    Для начала изучим выражение INSERT, на примере кода, который генерирует phpMyAdmin при выполнении операции INSERT. Для этого открываем вкладку Insert на странице просмотра таблицы `countries`, и вводим данные о стране:
    После того как мы кликаем на Go, данные записываются в таблицу и phpMyAdmin показывает нам использованное выражение INSERT:
    Код:
    INSERT INTO `countries` (`country_code` , `country_name` ) VALUES ('ca', 'Canada');
    После части INSERT INTO, следует имя таблицы. В MySQL, мы можем заключать имена таблиц и имена столбцов в обратные галочки "`", если в именах используются спецсимволы, зарезервированные слова. Затем мы открываем первую скобку, перечисляем столбцы в которые будет осуществлена вставка, разделяя их друг от друга запятыми. После перечисления списка названий столбцов скобка закрывается и указывается зарезервированное слово VALUES, после которого в скобках перечисляются значения которые нужно вставить в таблицу, причем перечисляются в том же порядке, что и названия столбцов. Если значения имеют символьный тип данных, необходимо заключать их в кавычки.
    Давайте занесем в таблицу `cities` данные города:
    Код:
    INSERT INTO `cities` ( `id` , `city_name` , `latitude` , `longitude` , `population`, `country_code` ) VALUES ('', 'Sherbrooke', '45 23 59.00', '-71 46 11.00', 125000, 'ca');
    Здесь, мы указываем пустое значение для id, потому что атрибут автоинкремента данного столбца обеспечивает автоматическое выставление уникального значения. Также следует обратить внимание, что значение `population` - числовое, поэтому не заключено в кавычки.
    Давайте закончим этот раздел вставкой некоторых данных для нескольких других стран и городов, которые понадобятся нам позже.
    Код:
    INSERT INTO `countries` ( `country_code` , `country_name` ) VALUES ('zh', 'China'); INSERT INTO `cities` ( `id` , `city_name` , `latitude` , `longitude` , `population` , `country_code` ) VALUES ('', 'Shanghai', '31 13 58.00', '121 26 59.99', 11000000, 'zh');

    Обновление данных с помощью UPDATE

    Сначала кликните на `Browse` для таблицы `cities` в результате будет выведена пока единственная запись
    Кликая по иконке в виде карандаша на бумаге (или ссылке Edit), мы переходим на панель редактирования данной строки. Изменим значение столбца `population` на 130000. После щелчка на `Save`, phpMyAdmin отображает следующее выражение:
    Код:
    UPDATE `cities` SET `population` = '130000' WHERE `id` = '1' LIMIT 1 ;
    Ключевое слово в данном выражении - `UPDATE`, за которым следует название таблицы. Слово `SET` предваряет список модификаций (в нашем случае - только для столбца `population`) который записывается в формате "столбец = новое значение".
    Мы видим, что в выражении присутствует условие: WHERE `id` = '1', в котором используется первичный ключ, чтобы ограничить изменение значения столбца `population` только данной строкой, т.е. только для данного города.
    Часть limit 1 добавляется phpMyAdmin-ом и является гарантией, что если первичный ключ не задан, изменения не будут применены более чем к одной записи.
    За один запрос `UPDATE` могут быть изменены значения сразу нескольких столбцов:
    Код:
    UPDATE `cities` SET `city_name` = 'Sherbrooke, Quebec', `population` = '130001' WHERE `id` = '1' LIMIT 1 ;
    Удаление данных с помощью DELETE
    В режиме `Browse` (просмотр) таблицы `cities`, кликните по красной иконке корзины (или ссылке Delete) - будет сгенерирован запрос, запрашивающий подтверждение выполнения следующего выражения:
    Код:
    DELETE FROM `cities` WHERE `id` = '1' LIMIT 1 ;
    Синтаксис здесь очень прост, и включает только название таблицы, и условие при котором будет выполнена операция удаления.
    Исключение условия WHERE из запросов UPDATE или DELETE вполне допустимо в SQL, но в таком случае действие выражения будет применено к каждой записи таблицы!

    Выборка данных с помощью SELECT
    Извлечение информации из таблиц - вероятно наиболее часто используемый вид запроса. Например, запросы SELECT позволяют получить ответы на подобные вопросы: "какие города имеют численность населения большую, чем данное число?".
    Фактически, мы уже предварительно использовали SELECT, когда кликали на ссылку Browse для таблицы `cities`. Это сгенерировало простейшую форму выражения запроса SELECT:
    Код:
    SELECT * FROM `cities` LIMIT 0,30;
    Звездочка здесь означает "все столбцы". Мы добавили FROM и имя таблицы, в которой будет выполнен запрос на выборку. LIMIT 0,30 означает что выборка начинается с записи номер 0 (самой первой), и содержит максимум 30 записей.
    Вкладка Search позволяет увидеть большее количество опций для запроса SELECT. Выберем вкладку Search для таблицы cities, и выберем только те столбцы, которые нам нужны:
    Затем справа от списка столбцов мы выберем порядок сортировки полученной выборки по столбцу `population` по убыванию:
    В результате phpMyAdmin сгенерирует следующий запрос:
    Код:
    SELECT `city_name` , `population`
    FROM `cities`
    WHERE 1
    ORDER BY `population` DESC LIMIT 0,30;
    Мы видим, что звездочка была заменена списком столбцов, разделенных запятыми. Условие WHERE 1, добавленное phpMyAdmin-ом, всегда истинно и выбирает все записи. Чуть позже мы увидим, что можно заменить его другим условием. Кроме того, появляется условие ORDER BY , после которого следует название столбца по которому мы хотим сортировать результат выборки, и ключевое слово DESC для сортировки по убыванию (мы могли также использовать ASC для сортировки по возрастанию).

    Условия в SQL-запросах

    Самым простым способом добавить условие - клик по SQL-query: Edit, на странице результатов, в результате которого будет открыто всплывающее окно "Query". Добавим условие для столбца `country`:
    Код:
    SELECT `city_name` , `population`
    FROM `cities`
    WHERE country_code = 'zh'
    ORDER BY `population` DESC;
    Это условие выберет все города, находящиеся в Китае. При обозначении условий может быть использовано богатое множество операторов и функций. Вот - два примера:
    Найти канадские города с численностью населения более 100000:
    Код:
    WHERE population > 100000 AND country_code = 'ca';
    Найти города, чьи названия начинаются с символа "A":
    Код:
    WHERE city_name like 'A%'
    Функции группировки
    Итоговая информация может быть сгенерирована в результате группировки по определенному столбцу. Давайте узнаем среднюю численность городского населения в стране:
    Код:
    SELECT country_code, AVG(population)
    FROM cities
    GROUP BY country_code
    Другие возможные функции группировки - MIN(), MAX(), SUM() и COUNT(), которые вычисляют соответственно минимальное значение, максимальное значение, сумму значений, и число записей. Например, с помощью следующего запроса мы можем получить число городов в стране:
    SELECT country_code, count(city_name) FROM cities
    GROUP BY country_code;

    Объединения

    Обычно, реляционная база данных включает множество таблиц, связанных общими ключами. Часто возникает необходимость в запросах сразу для нескольких таблиц. Связать, или объединить, таблицы можно с помощью различных методов; мы сосредоточимся на самом простом методе, заключающемся в сравнении ключей.
    В нижерассмотренном запросе, условие FROM содержит список названий таблиц, разделенных запятыми. В списке столбцов, мы используем названия таблиц и точку в качестве префикса перед каждым названием столбца (в этом нет необходимости в случае, если все столбцы из одной таблицы).
    Код:
    SELECT cities.city_name, cities.population, countries.country_name
    FROM cities, countries
    WHERE cities.country_code = countries.country_code LIMIT 0,30

    Заключение

    Те элементарные выражения, что были рассмотрены нами здесь не раскрывают полностью возможности SQL. Однако, эта статья поверхностно осветила основы SQL, и показала как использовать phpMyAdmin в качестве инструмента для углубления знаний в SQL.

    Об авторе

    Марк Делисл начал свое участие в развитии phpMyAdmin в декабре 1998 (именно он разработал первую многоязычную версию). С мая 2001, принимал активное участие в проекте как разработчик и проектный администратор.
    Работает с 1980 в колледже Cegep de Sherbrook (Квебек, Канада), разработчиком программного обеспечения и системным администратором. Он также преподавал организацию сети, безопасность, серверы Linux, и прикладное программирование PHP/MySQL.
    Издательство Packt Publishing выпустило первую книгу по phpMyAdmin: Mastering phpMyAdmin for effective MySQL Management, автором которой является Марк Делисл
    Byblik и Admin нравится это.
  2. nikki Новичок

    Спасибо! Отличная статья! А какую литературу еще вы можете посоветовать по MySQL? Можно и иностранную. Главное чтоб доступный для начинающего язык был!:)
  3. Iris Новичок

    Т.е. в MySql все выражения (запросы) формируются на базе стандартного синтаксиса SQL? Или есть все-таки какие-то тонкости, которых я не заметила при прочтении статьи?
  4. XmP ADD ebx, 110h

    Я лишь посоветую онлайн документацию(На английском) - ***Для просмотра ссылок необходимо войти или зарегистрироваться*** и на русском: ***Для просмотра ссылок необходимо войти или зарегистрироваться***
    Тонкости конечно есть, но для новичков они не нужны. Новичкам пригодятся примеры в стандартных запросах.
  5. Антон Новичок

    Доброго времени суток. Столкнулся с такой проблемой , что не могу подключить сайт к базе MySQL.
    Обвязка Stress Web 10+
    Когда ставлю в базе "мировой IP" , то база выдаёт ошибку и не открывается. Открывается лишь с сетевым айпи , хотя запустить сервер для интернета - могу. Я думаю эта проблема из-за того , что у меня роутер. Кто может помочь? Как подключить сайт к базе MySQL на роутере. Уважаемые программисты, прошу помочь! Кому не лень- пишите в почтовый ящик. Если кто живёт в минске- приглашаю к себе домой на пиво))) писать на мыло.
  6. XmP ADD ebx, 110h

    Для этого необходим внешний IP+ Разрешить MySQL соеденения из вне.
    Admin нравится это.
  7. f-duck Новичок

    ***Для просмотра ссылок необходимо войти или зарегистрироваться***
  8. Andersen1313 Новичок

    Возник такой вопрос.. пишу свой первый сайт, пока, что разобрал HTML и CSS уже вполне могу все оформить, но вот возник вопрос поиск по сайту можно сделать пользуясь базой данных? И могу ли я сначала создать страницы с каким то содержанием, просто как html страницы, а потом добавить их в базу данных и осуществить поиск по ним? или же это будет как то взаимосвязано и пока я не могу в силу не хватки знаний писать базу данных и поиск, лучше не делать эти страницы?

    Вообще по логике как я понимаю, у меня будут написаны страницы а в базе данных будут храниться ссылки на них?! и задавая поиск будет находиться нужная ссылка? Ну или что в этом роде?!
  9. XmP ADD ebx, 110h

    Обычно в базе данных храниться текст, а в файлах нечего такого нет. Поиск по файлам делать не советую.
    Для сайта обычно пишут небольшую CMS(В последующих проектов её дорабатывают(ООП, сложная взаимосвязан ость статичных и динамичных классов, функций, структур...)), однако новички обычно пишут разные скрипты для разных страниц: news.php, arctices.php, reg.php, user.php...
    Andersen1313 нравится это.
  10. Andersen1313 Новичок

    Т.Е. я правильно понял будет база данных и CMS для работы с содержимым и базой данных? они будут связаны да?!
    И через CMS можно будет в последствии добавить регистрацию на сайте?

    Я кажется уже сам понял, задал вопрос до того как начал читать о CMS системах! Спасибо за ответ я кажется понял в каком направлении двигаться и развиваться!
    -----------
    Как я понял CMS это уже существующие системы, которые нет необходимости писать самому(ну конечно если, вы не создатель facebook.com, vkontakte.ru и т.д.) для обычного сайта каких в сети миллиарды можно пользоваться готовыми? К примеру CMS Drupal.. Или я чего-то не понимаю и эти системы только помогают написать свою CMS или они уже и являются таковыми?

    Т.Е. Это как писать текстовый редактор для своих целей, когда можно открыть блокнот и набрать текст в нем?!
  11. XmP ADD ebx, 110h

    Это уже готовые CMS, нужно всего лишь для них переделать шаблон и всё:)
    Правда не всё так просто, есть куча подводных камней. Для форума конечно нужно взять готовый движок. А вот что сделать для сайта следует решать самому.

    Я изначально разделил понятия собственная ЦМС и собственные скрипты для сайта. Первое - сложное дело. Некоторые начали небольшое творение и раpширили его для нормальных масштабов - Fapos CMS(Дрюня ЦМС). Она всё то имеет здоровенные бреши в своей архитектуре. другие написали немного скриптов, и у них получился довольно неплохой сайт - ***Для просмотра ссылок необходимо войти или зарегистрироваться***. Третие написали что то наподобие первого, но гораздо меньше в масштабах и неимеющие брешей в безопасности.

    Что делать - решать вам, но помните - все мы когда то находились на начальном уровне.
  12. Andersen1313 Новичок

    Т.е. у меня получаются варианты:
    1) Скрипты - этот вариант для начала проще?! Как я понял.. И это будет связка php+Mysql, к примеру да?!
    2) Готовая CMS.. ну тут думаю все понятно надо разобраться в работе с выбранной CMS
    3) Самописная CMS - тут возник вопрос какие языки и в каком сочетании нужны? Тут я смогу сначала реализовать первостепенные функции к примеру поиск и регистрация, позже более меньшие задачи или менее важные для начала..

    База данных нужна при любом выбранном варианте?!

    Наверное, вопрос "какие языки" покажется глупым, но взялся за это дело, чтобы разобраться на практике с веб-программированием и приступать что-то делать или изучать не хочется с расчетом, что будет проделано много лишней работы из-за не понимания сути дела. Я к примеру думал, что все страницы должны быть созданы и занесены в базу данных, но по ходу этого разговора понял, что однотипные страницы могут создавать через CMS и заноситься в базу..

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

    Кажется тот же самый PHP и используется для написания CMS... :) ну точнее один из языков на которых можно это сделать:)
  13. XmP ADD ebx, 110h

    Языки любые, хоть ассемблер. Но самая распространённая связка - PHP, MySQL:)(Советую).

    Да, база данных нужна при любом выбраном варианте. За исключением файловых скриптов/файловой CMS/Статичного сайта.

    В принципе те самые скрипты можно называть CMS, что и часто делают новички. Их можно использовать в последующих разработках.

    Однако профессионалы пишут гораздо больше кода, непонятного для новичка. Однако такой способ написание для них, как и для меня гораздо удобнее;) Пример:

    Проффесионал:
    PHP:
    <?php
    /*======================================================================*\
    || #################################################################### ||
    || # vBulletin 3.8.4
    || # ---------------------------------------------------------------- # ||
    || # Copyright ©2000-2009 Jelsoft Enterprises Ltd. All Rights Reserved. ||
    || # This file may not be redistributed in whole or significant part. # ||
    || # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
    || # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
    || #################################################################### ||
    \*======================================================================*/

    // ####################### SET PHP ENVIRONMENT ###########################
    error_reporting(E_ALL & ~E_NOTICE & ~8192);

    // #################### DEFINE IMPORTANT CONSTANTS #######################
    define('THIS_SCRIPT''login');
    define('CSRF_PROTECTION'true);
    define('CSRF_SKIP_LIST''login');

    // ################### PRE-CACHE TEMPLATES AND DATA ######################
    // get special phrase groups
    $phrasegroups = array();

    // get special data templates from the datastore
    $specialtemplates = array();

    // pre-cache templates used by all actions
    $globaltemplates = array();

    // pre-cache templates used by specific actions
    $actiontemplates = array(
        
    'lostpw' => array(
            
    'lostpw',
            
    'humanverify'
        
    )
    );

    // ######################### REQUIRE BACK-END ############################
    require_once('./global.php');
    require_once(
    DIR '/includes/functions_login.php');

    // #######################################################################
    // ######################## START MAIN SCRIPT ############################
    // #######################################################################

    $vbulletin->input->clean_gpc('r''a'TYPE_STR);

    if (empty(
    $_REQUEST['do']) AND empty($vbulletin->GPC['a']))
    {
        
    exec_header_redirect($vbulletin->options['forumhome'] . '.php');
    }

    // ############################### start logout ###############################
    if ($_REQUEST['do'] == 'logout')
    {
        
    define('NOPMPOPUP'true);

        
    $vbulletin->input->clean_gpc('r''logouthash'TYPE_STR);

        if (
    $vbulletin->userinfo['userid'] != AND !verify_security_token($vbulletin->GPC['logouthash'], $vbulletin->userinfo['securitytoken_raw']))
        {
            eval(
    standard_error(fetch_error('logout_error'$vbulletin->session->vars['sessionurl'], $vbulletin->userinfo['securitytoken'])));
        }

        
    process_logout();

        
    $vbulletin->url fetch_replaced_session_url($vbulletin->url);
        if (
    strpos($vbulletin->url'do=logout') !== false)
        {
            
    $vbulletin->url $vbulletin->options['forumhome'] . '.php' $vbulletin->session->vars['sessionurl_q'];
        }
        
    $show['member'] = false;
        eval(
    standard_error(fetch_error('cookieclear'create_full_url($vbulletin->url), $vbulletin->options['forumhome'], $vbulletin->session->vars['sessionurl_q']), ''false));

    }

    // ############################### start do login ###############################
    // this was a _REQUEST action but where do we all login via request?
    if ($_POST['do'] == 'login')
    {
        
    $vbulletin->input->clean_array_gpc('p', array(
            
    'vb_login_username'        => TYPE_STR,
            
    'vb_login_password'        => TYPE_STR,
            
    'vb_login_md5password'    => TYPE_STR,
            
    'vb_login_md5password_utf' => TYPE_STR,
            
    'postvars'                => TYPE_BINARY,
            
    'cookieuser'              => TYPE_BOOL,
            
    'logintype'                => TYPE_STR,
            
    'cssprefs'                => TYPE_STR,
        ));

        
    // can the user login?
        
    $strikes verify_strike_status($vbulletin->GPC['vb_login_username']);

        if (
    $vbulletin->GPC['vb_login_username'] == '')
        {
            eval(
    standard_error(fetch_error('badlogin'$vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'], $strikes)));
        }

        
    // make sure our user info stays as whoever we were (for example, we might be logged in via cookies already)
        
    $original_userinfo $vbulletin->userinfo;

        if (!
    verify_authentication($vbulletin->GPC['vb_login_username'], $vbulletin->GPC['vb_login_password'], $vbulletin->GPC['vb_login_md5password'], $vbulletin->GPC['vb_login_md5password_utf'], $vbulletin->GPC['cookieuser'], true))
        {
            (
    $hook vBulletinHook::fetch_hook('login_failure')) ? eval($hook) : false;

            
    // check password
            
    exec_strike_user($vbulletin->userinfo['username']);

            if (
    $vbulletin->GPC['logintype'] === 'cplogin' OR $vbulletin->GPC['logintype'] === 'modcplogin')
            {
                
    // log this error if attempting to access the control panel
                
    require_once(DIR '/includes/functions_log_error.php');
                
    log_vbulletin_error($vbulletin->GPC['vb_login_username'], 'security');
            }
            
    $vbulletin->userinfo $original_userinfo;

            if (
    $vbulletin->options['usestrikesystem'])
            {
                eval(
    standard_error(fetch_error('badlogin_strikes'$vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'], $strikes)));
            }
            else
            {
                eval(
    standard_error(fetch_error('badlogin'$vbulletin->options['bburl'], $vbulletin->session->vars['sessionurl'])));
            }
        }

        
    exec_unstrike_user($vbulletin->GPC['vb_login_username']);

        
    // create new session
        
    process_new_login($vbulletin->GPC['logintype'], $vbulletin->GPC['cookieuser'], $vbulletin->GPC['cssprefs']);

        
    // do redirect
        
    do_login_redirect();

    }
    else if (
    $_GET['do'] == 'login')
    {
        
    // add consistency with previous behavior
        
    exec_header_redirect($vbulletin->options['forumhome'] . '.php');
    }

    // ############################### start lost password ###############################
    if ($_REQUEST['do'] == 'lostpw')
    {
        
    $vbulletin->input->clean_gpc('r''email'TYPE_NOHTML);
        
    $email $vbulletin->GPC['email'];

        if (
    $permissions['forumpermissions'] & $vbulletin->bf_ugp_forumpermissions['canview'])
        {
            
    $navbits construct_navbits(array('' => $vbphrase['lost_password_recovery_form']));
            eval(
    '$navbar = "' fetch_template('navbar') . '";');
        }
        else
        {
            
    $navbar '';
        }

        
    // human verification
        
    if (fetch_require_hvcheck('lostpw'))
        {
            require_once(
    DIR '/includes/class_humanverify.php');
            
    $verification =& vB_HumanVerify::fetch_library($vbulletin);
            
    $human_verify $verification->output_token();
        }
        else
        {
            
    $human_verify '';
        }

        
    $url =& $vbulletin->url;
        eval(
    'print_output("' fetch_template('lostpw') . '");');
    }

    // ############################### start email password ###############################
    if ($_POST['do'] == 'emailpassword')
    {

        
    $vbulletin->input->clean_array_gpc('p', array(
            
    'email' => TYPE_STR,
            
    'userid' => TYPE_UINT,
            
    'humanverify'  => TYPE_ARRAY,
        ));

        if (
    $vbulletin->GPC['email'] == '')
        {
            eval(
    standard_error(fetch_error('invalidemail'$vbulletin->options['contactuslink'])));
        }

        if (
    fetch_require_hvcheck('lostpw'))
        {
            require_once(
    DIR '/includes/class_humanverify.php');
            
    $verify =& vB_HumanVerify::fetch_library($vbulletin);
            if (!
    $verify->verify_token($vbulletin->GPC['humanverify']))
            {
                  
    standard_error(fetch_error($verify->fetch_error()));
              }
        }

        require_once(
    DIR '/includes/functions_user.php');

        
    $users $db->query_read_slave("
            SELECT userid, username, email, languageid
            FROM " 
    TABLE_PREFIX "user
            WHERE email = '" 
    $db->escape_string($vbulletin->GPC['email']) . "'
        "
    );
        if (
    $db->num_rows($users))
        {
            while (
    $user $db->fetch_array($users))
            {
                if (
    $vbulletin->GPC['userid'] AND $vbulletin->GPC['userid'] != $user['userid'])
                {
                    continue;
                }
                
    $user['username'] = unhtmlspecialchars($user['username']);

                
    $user['activationid'] = build_user_activation_id($user['userid'], 21);

                eval(
    fetch_email_phrases('lostpw'$user['languageid']));
                
    vbmail($user['email'], $subject$messagetrue);
            }

            
    $vbulletin->url str_replace('"'''$vbulletin->url);
            eval(
    print_standard_redirect('redirect_lostpw'truetrue));
        }
        else
        {
            eval(
    standard_error(fetch_error('invalidemail'$vbulletin->options['contactuslink'])));
        }
    }

    // ############################### start reset password ###############################
    if ($vbulletin->GPC['a'] == 'pwd' OR $_REQUEST['do'] == 'resetpassword')
    {

        
    $vbulletin->input->clean_array_gpc('r', array(
            
    'userid'      => TYPE_UINT,
            
    'u'            => TYPE_UINT,
            
    'activationid' => TYPE_STR,
            
    'i'            => TYPE_STR
        
    ));

        if (!
    $vbulletin->GPC['userid'])
        {
            
    $vbulletin->GPC['userid'] = $vbulletin->GPC['u'];
        }

        if (!
    $vbulletin->GPC['activationid'])
        {
            
    $vbulletin->GPC['activationid'] = $vbulletin->GPC['i'];
        }

        
    $userinfo verify_id('user'$vbulletin->GPC['userid'], 11);

        
    $user $db->query_first("
            SELECT activationid, dateline
            FROM " 
    TABLE_PREFIX "useractivation
            WHERE type = 1
                AND userid = 
    $userinfo[userid]
        "
    );

        if (!
    $user)
        {
            
    // no activation record, probably got back here after a successful request, back to home
            
    exec_header_redirect($vbulletin->options['forumhome'] . '.php');
        }

        if (
    $user['dateline'] < (TIMENOW 24 60 60))
        {  
    // is it older than 24 hours?
            
    eval(standard_error(fetch_error('resetexpired'$vbulletin->session->vars['sessionurl'])));
        }

        if (
    $user['activationid'] != $vbulletin->GPC['activationid'])
        { 
    //wrong act id
            
    eval(standard_error(fetch_error('resetbadid'$vbulletin->session->vars['sessionurl'])));
        }

        
    // delete old activation id
        
    $db->query_write("DELETE FROM " TABLE_PREFIX "useractivation WHERE userid = $userinfo[userid] AND type = 1");

        
    $newpassword fetch_random_password(8);

        
    // init user data manager
        
    $userdata =& datamanager_init('User'$vbulletinERRTYPE_STANDARD);
        
    $userdata->set_existing($userinfo);
        
    $userdata->set('password'$newpassword);
        
    $userdata->save();

        (
    $hook vBulletinHook::fetch_hook('reset_password')) ? eval($hook) : false;

        eval(
    fetch_email_phrases('resetpw'$userinfo['languageid']));
        
    vbmail($userinfo['email'], $subject$messagetrue);

        eval(
    standard_error(fetch_error('resetpw'$vbulletin->session->vars['sessionurl'])));

    }

    /*======================================================================*\
    || ####################################################################
    || # NulleD - FintMax
    || # CVS: $RCSfile$ - $Revision: 31381 $
    || ####################################################################
    \*======================================================================*/
    ?>
    Новичёк:
    PHP:

    <?php 
     
    if (isset($_POST['login'])) { $login $_POST['login']; if ($login == '') { unset($login);} } //Присваеваем логину переменную $login, если она пуста уничтожаем её 
     
    if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } 
     
    //так же присваеваем паролю переменную $password проверяем.... 

             
         // В общих чертах, или 
     /* 
     if (empty($login)) //Проверяем на введенность данных 
     { 
     exit ("Не введен логин, исправьте"); 
     } 
     if (($password)) //Проверяем на введенность данных 
     { 
     exit ("Не введен пароль, исправьте"); 
     } 
     */ 
     
    if (empty($login) or empty($password)) //Проверяем на введенность данных 
     

     exit (
    "Введена не вся информация, вернитесь и исправьте"); 
     } 

     
    $login stripslashes($login); 
     
    $login htmlspecialchars($login); 

     
    $password stripslashes($password); 
     
    $password htmlspecialchars($password); 

     
    $login trim($login); 
     
    $password trim($password); 

     include (
    "/connect.php");     

     
    // проверка на существование пользователя с таким же логином 
     
    $result mysql_query("SELECT id FROM users WHERE login='$login'",$db); 
     
    $myrow mysql_fetch_array($result); 
     if (!empty(
    $myrow['id'])) { 
     exit (
    "Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); 
     } 

     
    // если такого нет, то сохраняем данные 
     
    $result2 mysql_query ("INSERT INTO users (login,password) VALUES('$login','$password')"); 
     
    // Проверяем, есть ли ошибки 
     
    if ($result2=='TRUE'
     { 
     echo 
    "Вы успешно зарегистрированны, теперь вы можете войти на сайт <a href='/index.php'>войти</a>"
     } 

     else { 
     echo 
    "Ошибка! регистрация не прошла"
             } 
     
    ?>
    Andersen1313 нравится это.
  14. Andersen1313 Новичок

    Большое, спасибо, за ясные ответы! :)
    XmP нравится это.

Поделиться этой страницей