Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Создание сайта для хостинга файлов с помощью CodeIgniter

by
Difficulty:IntermediateLength:LongLanguages:

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Я видел несколько вводных руководств для Codeigniter и надеялся показать вам что-то более продвинутое. В этом уроке вы узнаете, как создать мощное веб-приложение для размещения изображений, используя гибкость Codeigniter. В этом учебном пособии вы узнаете о философии MVC, которая является неотъемлемой частью создания веб приложений.


Шаг 1: Настройка

Прежде чем мы отправимся писать код, нам нужно сделать некоторые настройки. Запустите свой любимый редактор базы данных (я буду использовать SQLBuddy) и создаю новую базу данных под названием 'uploadr'. В этом случае создайте две таблицы: « users» и « files». Настройте пользователей, чтобы они имели первичный ключ, авто-нумерованный столбец «id», а также два столбца varchar: «password» и «username». Таблице файлов нужен столбец «id» (опять-таки первичный ключ и авто-нумерованный), а также столбец «owner» и столбец «name» varchar.

Поскольку этот урок сосредоточен на изучении программирования Codeigniter и MVC, мы собираемся отказаться от всех стилей (например, CSS, photoshop). С этой целью я создал для вас специальную установку Codeigniter, со всеми созданными файлами и представлениями (в основном) HTML-d и CSS-d. Две вещи, которые вам нужно изменить, - это настройки конфигурации и базы данных. Я даже включил штамп «Бета», поэтому проект еще больше будет походить на реальный веб-запуск!

Шаг 2: Регистрация

Теперь наш первый кусочек мяса! Откройте 'login.php' контроллер и создайте функцию под названием «register». Она будет контролировать весь процесс регистрации. Во-первых, нам нужно проверить, были ли отправлены запросы POST на сервер. В этом случае это означают, что кто-то пытается зарегистрироваться. Мы можем это сделать, проверив, установлен ли $ _POST['username']. Если это так, то мы знаем, что кто-то пытался зарегистрироваться, и может добавить его в БД.

Если пользователь еще не попытался зарегистрироваться, метод обнаруживает это и автоматически отправляет их в представление «register», которое я уже добавил для вас. Вы видите строку:

Это вызывает функцию «register» в модели users. На данный момент это не сработает, так как мы не загрузили модель. Мы делаем это так же, как и с загрузкой видов, но поскольку мы будем широко использовать эту модель в этом классе, мы загрузим ее в конструкторе (функция с тем же именем, что и класс), так что она будет всегда загружена и доступна:

Вероятно, вы заинтересованы в том, что фактически содержится в функции регистрации. Ну, она просто использует пару функций Codeigniter Active Record, которые позволяют манипулировать БД. Большое преимущество использования встроенных функций Codeigniter Active Record (помимо того, что они приятные и простые) заключается в том, что они не привязаны к конкретной базе данных: вы можете легко переключаться между разными типами баз данных (например, mySQL, SQLite), не влияя на приложение. В случае нашей регистрации мы добавляем запись в таблицу пользователей. Создайте эту функцию в 'users.php' модель:

Единственное, что стоит заметить в представлении регистрации, это функции site_url() и base_url(). Они соответственно дают URL вашего сайта с и без index.php/ суффикса. Наибольшее преимущество в их использовании состоит в том, что вы можете изменить структуру URL своего сайта, не переходя через все ссылки: это просто одно изменение в вашем файле конфигурации.

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

Шаг 3: Вход

Теперь, когда у нас настроено несколько пользователей, нам нужен способ фактически позволить им попасть на сайт. Для этого мы будем использовать класс сессии Codeigniter. Хотя это фактически использует куки-файлы, его работа очень похожа на обычные PHP-сессии, просто с большим количеством опций (я рекомендую вам проверить userguide).

Для начала нам нужно создать функцию, на которую на данный момент указывает кнопка входа в систему, 'go'. Эта функция должна будет собирать информацию, которую отправила форма, а затем проверить ее в БД с использованием модели. Если все правильно, он начнет сеанс и перенаправит пользователя на свои файлы. Если данные введены неверно, пользователь будет перенаправлен на страницу входа в систему.

Части этой функции должны быть хорошо знакомы вам из функции register: она собирает $username и $password, прежде чем отправлять их в модель (на этот раз «login»). После этого, однако, начинают возникать различия.

Затем функция проверяет, не удалось ли войти в систему; если не удалось, то пользователь перенаправляется обратно на страницу входа. Однако, если вход успешно завершен, сценарий создает сеанс, устанавливая «userid» для идентификатора пользователя. Все, что нам нужно для скрипта входа в систему, - это модель. Добавьте эту функцию в модель users , которую мы использовали ранее:

Быстро пробежимся по коду: во-первых, она запрашивает базу данных, ища при этом пользователей с точно такими же именем пользователя и паролем. Если она ничего не найдет, то число строк будет равно 0, а функция вернет false. Если кто-то был найден, она использует другую функцию Codeigniter Active Record для загрузки этой записи в качестве объекта. Эти объекты появляются как массив строк БД, каждый из которых содержит объект с информацией об этих строках. Поскольку нам нужна первая и единственная строка, мы берем ее из $result, а затем возвращаем идентификатор.

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

Последнее, что нам нужно сделать, это сделать возможным выход из системы. Это достигается простой установкой идентификатора пользователя на null, удаляя его. Все, что требуется, - одна простая функция:

Шаг 4: Просмотр и загрузка файлов

Итак, мы только что вошли в систему в первый раз. С чем мы встречаемся?

Неплохо, неплохо, хотя этот «образец файла» не создается из нашей базы данных, он статичен. Мы скоро исправим это, но сначала нам нужно изменить разрешения папки «файл», чтобы Codeigniter мог читать и писать в нем. Я изменил на 777:

Теперь, когда все в порядке, давайте вернемся к коду! Нам нужно загрузить все файлы пользователей из базы данных, и для этого нам понадобится ...

... модель! Однако на этот раз мы создадим ее в файле files.php , чтобы разделить таблицы users и files.. Вставьте эту функцию:

Это было проиллюстрировано в предыдущих разделах этого руководства, поэтому вы должны все понимать. В основном, функция получает все строки, в которых владелец = идентификатор пользователя, и возвращает их в симпатичном массиве объектов. Давайте создадим что-то в контроллере профилей для взаимодействия с ним и передадим информацию на просмотр. Измените функцию index следующим образом:

Опять же, очень простая функция. Она принимает результаты, переданные ей из модели файлов, и упаковывает их в представление. Codeigniter передает данные в представление обычно через массив (в данном случае данные). Затем он автоматически раскладывает массив на множество переменных, поэтому, когда мы перейдем к представлению, он сможет получить доступ к результатам базы данных через $file, а не $data['file']. Давайте поместим этот прекрасный результат базы данных в представление! Вставьте это в 'profile.php', заменяя код, о котором говорит вам комментарий HTML.

Цикл foreach загружает каждую строку массива поочередно и делает ее доступной через объект $file. Затем, используя образец «section» в качестве шаблона, заполните все ссылки и имя с информацией для нового объекта $file. Мы увидим как работает как функция удаления чуть позже, и как работает ссылка просмотра после того, как мы что-то загрузили.

Если вы откроете это в своем браузере сейчас, вы ничего не увидите. Это потому, что у нас нет загруженных файлов! Ну, нам нужно это исправить, поэтому нам нужно создать форму для загрузки. Давайте сначала сделаем контроллер; откройте 'profile.php' и добавьте эту функцию:

Эта функция добавляет немало новых вещей: особенно обработка файлов Codeigniter. Все начинается довольно просто, проверяя, была ли форма отправлена путем поиска файла. Если файл не существует, он просто показывает представление загрузки (которое мы будем обновлять далее). Если файл существует, то он считывает временный файл, который был сгенерирован сервером. Каталог временного файла можно найти в $_FILES['your_file']['tmp_name'], и файл можно прочитать из этого каталога через функцию read_file Codeigniter. Она загружает всю информацию о файлах в переменную $file.

Следующая строка получает имя файла из глобальной переменной $_FILES аналогично получению временного каталога. Вооружившись этими двумя частями информации, codeigniter записывает файл в папку с файлами в том же каталоге, что и файл index. Наконец, файл необходимо добавить в базу данных. Опять же, мы собираемся сделать это с помощью модели, на этот раз функция add в модели files. Мы скоро увидим, как это работает, но теперь нам нужно создать форму загрузки в представлении. Добавьте это в 'upload.php' где комментарий HTML говорит вам:

Замените текущий HTML этим. Важно отметить, что при загрузке файлов мы используем файл input type=file, который позволяет нам выбирать файл для загрузки. Кроме того, мы должны указать enctype в нашем теге формы, чтобы сервер знал, что он получает файл и сохраняет его. Для нас это не слишком интересные нюансы, но это очень важно! Давайте быстро посмотрим, что мы создали:

Теперь мы переходим к финальному сценарию загрузки файлов, к модели. Это добавляет файл в базу данных с его именем и владельцем, чтобы сервер знал, кому какие файлы принадлежат. Давайте взглянем; добавьте это в свою модель файлов:

Снова используя Codeigniter Active Record, мы добавляем строку в базу данных с именем файла и владельца. Мы получаем владельца путем получения идентификатора пользователя из данных сеанса, которые мы сохранили ранее при входе в систему. В целом, довольно простая функция. Попробуем загрузить красивую фотографию, а?

И вуаля!

Просматривая папку «files», мы видим, что файл, который мы загрузили, появился там, как по волшебству (магия Codeigniter!), И мы видим, почему работает ссылка просмотра, поскольку она просто указывает непосредственно на файл в каталоге. При этом все, что осталось сделать в этой статье - это удаление файлов.

Шаг 5: Удаление файлов

Хорошо, последний бит. Это не займет много времени, так как вы сможете использовать идеи, которые вы узнали ранее. Сначала мы добавим этот код в наш контроллер профилей:

И этот код для нашей модели файлов:

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

Модель немного сложнее. Она должна вернуть имя файла, а также удалить его, поэтому сначала она запрашивает базу данных для получения сведений о файлах. Затем загружает это в переменную $result, а затем переходит к удалению файла. Затем она возвращает столбец «имя» первой строки массива (единственная строка, возвращаемая запросом), которая затем используется в вышеуказанном контроллере.

Попробуем удалить файл:

И нажмите delete ...

Ура! Это сработало. Наверное, мы все закончили!

Последние мысли

Удаление файлов

Конечно, этот код не должен запускаться на сервере без каких-либо серьезных улучшений. Вот несколько основных проблем:

  • Все пароли незашифрованы. Это означает, что если кто-то сможет проникнуть в вашу базу данных, они с минимальными усилиями смогут украсть все данные ваших пользователей. Уверен,  что вы все согласитесь, что это нехорошо. Это легко решить, добавив несколько простых функций хэширования к паролям.
  • Файлы не являются частными. Пользователь может захотеть убедиться, что файлы, которые они загружают, видны только им, а не кем-то, кто просто может угадать кучу URL-адресов. Для этого, вероятно, потребуется другой контроллер для обслуживания файлов (который проверяет данные сеанса).
  • Сценарий не проверяет наличие файлов перед записью файлов. Это может привести к конфликтам с вашими файлами или может привести к перезаписи файлов. Как бы то ни было: это нехорошо. Это можно решить с помощью простой проверки БД, чтобы убедиться, что файл не был занят или можно предоставить пользователям собственные каталоги в папке с файлами.
  • Никакие ошибки не генерируется. Это не помогает пользователю узнать, что они делают неправильно, и хотя это не слишком большая проблема на таком маленьком сайте с таким ограниченным функционалом, это все равно можно улучшить.

В общем, вы создали довольно мощное небольшое веб-приложение, особенно благодаря небольшому количества кода, который вам нужно было написать. По своей природе Codeigniter довольно просто расширить, как для решения вышеуказанных проблем, так и для добавления новых функций, таких как переименование файлов. Я также надеюсь, что в этом уроке вы немного научились использовать концепции MVC и силу, которую они приносят: просто скорректировав модели в нашем приложении, мы можем обменять нашу БД на текстовые файлы, XML или что угодно, а также изменив представления , мы можем полностью поменять внешний вид без нарушения функциональности. Удивительно!

  • Подпишитесь на RSS-канал NETTUTS для получения ежедневных новостей о веб-разработке.


Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.