Как соединить базу данных с сайтом через php
Перейти к содержимому

Как соединить базу данных с сайтом через php

  • автор:

Как соединить сайт с базой данных?

В университете дали задание: создать одностраничный сайт, чтобы на нем была любая форма(например ФИО), при введении ФИО в каждое поле(получается их 3) и нажатии кнопки(например «Ввести»), нужно чтобы они автоматически заносились в любую базу данных(хоть файл Excel). Хотелось бы использовать MySQL, чтобы был опыт в его использовании. Времени очень мало, буквально пару недель. Что нужно изучить, чтобы быстро это реализовать?

  • Вопрос задан более трёх лет назад
  • 27803 просмотра

1 комментарий

Оценить 1 комментарий

Работа с базами данных ¶

Этот раздел расскажет о том, как создать новую страницу, отображающую данные по странам, полученные из таблицы countries базы данных. Для достижения этой цели вам будет необходимо настроить подключение к базе данных, создать класс Active Record, определить action и создать view.

Изучив эту часть, вы научитесь:

  • Настраивать подключение к БД.
  • Определять класс Active Record.
  • Запрашивать данные, используя класс Active Record.
  • Отображать данные во view с использованием пагинации.

Обратите внимание, чтобы усвоить этот раздел, вы должны иметь базовые знания и навыки использования баз данных. В частности, вы должны знать, как создать базу данных и как выполнять SQL запросы, используя клиентские инструменты для работы с БД.

Подготавливаем базу данных ¶

Для начала создайте базу данных под названием yii2basic , из которой вы будете получать данные в вашем приложении. Вы можете создать базу данных SQLite, MySQL, PostgreSQL, MSSQL или Oracle, так как Yii имеет встроенную поддержку для многих баз данных. Для простоты, в дальнейшем описании будет подразумеваться MySQL.

После этого создайте в базе данных таблицу country и добавьте в неё немного демонстрационных данных. Вы можете запустить следующую SQL инструкцию, чтобы сделать это:

CREATE TABLE `country` ( `code` CHAR(2) NOT NULL PRIMARY KEY, `name` CHAR(52) NOT NULL, `population` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `country` VALUES ('AU','Australia',24016400); INSERT INTO `country` VALUES ('BR','Brazil',205722000); INSERT INTO `country` VALUES ('CA','Canada',35985751); INSERT INTO `country` VALUES ('CN','China',1375210000); INSERT INTO `country` VALUES ('DE','Germany',81459000); INSERT INTO `country` VALUES ('FR','France',64513242); INSERT INTO `country` VALUES ('GB','United Kingdom',65097000); INSERT INTO `country` VALUES ('IN','India',1285400000); INSERT INTO `country` VALUES ('RU','Russia',146519759); INSERT INTO `country` VALUES ('US','United States',322976000); 

На данный момент у вас есть база данных под названием yii2basic и внутри неё таблица country с тремя столбцами, содержащими десять строк данных.

Настраиваем подключение к БД ¶

Перед продолжением убедитесь, что у вас установлены PHP-расширение PDO и драйвер PDO для используемой вами базы данных (например, pdo_mysql для MySQL). Это базовое требование в случае использования вашим приложением реляционной базы данных. После того, как они установлены, откройте файл config/db.php и измените параметры на верные для вашей базы данных. По умолчанию этот файл содержит следующее:

 return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ]; 

Файл config/db.php — типичный конфигурационный инструмент, базирующийся на файлах. Данный конфигурационный файл определяет параметры, необходимые для создания и инициализации экземпляра yii\db\Connection, через который вы можете делать SQL запросы к подразумеваемой базе данных.

Подключение к БД, настроенное выше, доступно в коде приложения через выражение Yii::$app->db .

Информация: файл config/db.php будет подключен главной конфигурацией приложения config/web.php , описывающей то, как экземпляр приложения должен быть инициализирован. Для детальной информации, пожалуйста, обратитесь к разделу Конфигурации.

Если вам необходимо работать с базами данных, поддержка которых не включена непосредственно в фреймворк, стоит обратить внимание на следующие расширения:

Создаём потомка Active Record ¶

Чтобы представлять и получать данные из таблицы country , создайте класс — потомок Active Record, под названием Country и сохраните его в файле models/Country.php .

 namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord  

Класс Country наследуется от yii\db\ActiveRecord. Вам не нужно писать ни строчки кода внутри него! С кодом, приведённым выше, Yii свяжет имя таблицы с именем класса.

Информация: Если нет возможности задать прямую зависимость между именем таблицы и именем класса, вы можете переопределить метод yii\db\ActiveRecord::tableName(), чтобы явно задать имя связанной таблицы.

Используя класс Country , вы можете легко манипулировать данными в таблице country , как показано в этих фрагментах:

use app\models\Country; // получаем все строки из таблицы "country" и сортируем их по "name" $countries = Country::find()->orderBy('name')->all(); // получаем строку с первичным ключом "US" $country = Country::findOne('US'); // отобразит "United States" echo $country->name; // меняем имя страны на "U.S.A." и сохраняем в базу данных $country->name = 'U.S.A.'; $country->save(); 

Информация: Active Record — мощный способ доступа и манипулирования данными БД в объектно-ориентированном стиле. Вы можете найти подробную информацию в разделе Active Record. В качестве альтернативы, вы также можете взаимодействовать с базой данных, используя более низкоуровневый способ доступа, называемый Data Access Objects.

Создаём Action ¶

Для того, чтобы показать данные по странам конечным пользователям, вам надо создать новый action. Вместо размещения нового action’a в контроллере site , как вы делали в предыдущих разделах, будет иметь больше смысла создать новый контроллер специально для всех действий, относящихся к данным по странам. Назовите новый контроллер CountryController , и создайте action index внутри него, как показано ниже.

 namespace app\controllers; use yii\web\Controller; use yii\data\Pagination; use app\models\Country; class CountryController extends Controller < public function actionIndex() < $query = Country::find(); $pagination = new Pagination([ 'defaultPageSize' => 5, 'totalCount' => $query->count(), ]); $countries = $query->orderBy('name') ->offset($pagination->offset) ->limit($pagination->limit) ->all(); return $this->render('index', [ 'countries' => $countries, 'pagination' => $pagination, ]); > > 

Сохраните код выше в файле controllers/CountryController.php .

Action index вызывает Country::find() . Данный метод Active Record строит запрос к БД и извлекает все данные из таблицы country . Чтобы ограничить количество стран, возвращаемых каждым запросом, запрос разбивается на страницы с помощью объекта yii\data\Pagination. Объект Pagination служит двум целям:

  • Устанавливает пункты offset и limit для SQL инструкции, представленной запросом, чтобы она возвращала только одну страницу данных за раз (в нашем случае максимум 5 строк на страницу).
  • Он используется во view для отображения пагинатора, состоящего из набора кнопок с номерами страниц, это будет разъяснено в следующем подразделе.

В конце кода action index выводит view с именем index , и передаёт в него данные по странам вместе c информацией о пагинации.

Создаём View ¶

Первым делом создайте поддиректорию с именем country внутри директории views . Эта папка будет использоваться для хранения всех view, выводимых контроллером country . Внутри директории views/country создайте файл с именем index.php , содержащий следующий код:

 use yii\helpers\Html; use yii\widgets\LinkPager; ?> h1>Countries h1> ul>  foreach ($countries as $country): ?> li> = Html::encode("code> (name>)") ?>: = $country->population ?> li>  endforeach; ?> ul> = LinkPager::widget(['pagination' => $pagination]) ?> 

View имеет 2 части относительно отображения данных по странам. В первой части предоставленные данные по странам выводятся как неупорядоченный HTML-список. Во второй части выводится виджет yii\widgets\LinkPager, используя информацию о пагинации, переданную из action во view. Виджет LinkPager отображает набор постраничных кнопок. Клик по любой из них обновит данные по странам в соответствующей странице.

Испытываем в действии ¶

Чтобы увидеть, как работает весь вышеприведённый код, перейдите по следующей ссылке в своём браузере:

https://hostname/index.php?r=country%2Findex 

Список Стран

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

https://hostname/index.php?r=country%2Findex&page=2 

За кадром Pagination предоставляет всю необходимую функциональность для постраничной разбивки набора данных:

  • В начале Pagination показывает первую страницу, которая отражает SELECT запрос стран с параметрами LIMIT 5 OFFSET 0 . Как результат, первые пять стран будут получены и отображены.
  • Виджет LinkPager выводит кнопки страниц используя URL’ы, созданные Pagination. Эти URL’ы будут содержать параметр запроса page , который представляет различные номера страниц.
  • Если вы кликните по кнопке «2», сработает и обработается новый запрос для маршрута country/index . Таким образом новый запрос стран будет иметь параметры LIMIT 5 OFFSET 5 и вернет следующие пять стран для отображения.

Заключение ¶

В этом разделе вы научились работать с базой данных. Также вы научились получать и отображать данные с постраничной разбивкой с помощью yii\data\Pagination и yii\widgets\LinkPager.

В следующем разделе вы научитесь использовать мощный инструмент генерации кода, называемый Gii, чтобы с его помощью быстро осуществлять некоторые часто используемые функции, такие как операции Create-Read-Update-Delete (CRUD) для работы с данными в таблице базы данных. На самом деле код, который вы только что написали, в Yii может быть полностью сгенерирован автоматически с использованием Gii.

#15 — Создание базы данных и подключение к ней

#15 - Создание базы данных и подключение к ней

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

Видеоурок

Материалы для курса

Чтобы скачивать материалы к видеокурсам необходимо оформить подписку на сайт

База данных · Начало работы

Почти каждое современное веб-приложение взаимодействует с базой данных. Laravel делает взаимодействие с базами данных чрезвычайно простым через поддержку множества баз данных, используя либо сырой SQL построителя запросов, либо Eloquent ORM. В настоящее время Laravel обеспечивает поддержку пяти баз данных:

  • MariaDB 10.2+ (Version Policy)
  • MySQL 5.7+ (Version Policy)
  • PostgreSQL 9.6+ (Version Policy)
  • SQLite 3.8.8+
  • SQL Server 2017+ (Version Policy)

Конфигурирование

Конфигурация служб баз данных Laravel находится в конфигурационном файле config/database.php вашего приложения. В этом файле вы можете определить все соединения к базе данных, а также указать, какое соединение должно использоваться по умолчанию. Большинство параметров конфигурации в этом файле определяется значениями переменных окружения вашего приложения. В этом файле представлены примеры для большинства систем баз данных, поддерживаемых Laravel.

По умолчанию пример конфигурации окружения Laravel готов к использованию с Laravel Sail, который представляет собой конфигурацию Docker для разработки приложений Laravel на вашем локальном компьютере. Однако вы можете изменить конфигурацию своей базы данных по мере необходимости для своей локальной базы данных.

Конфигурация SQLite

Базы данных SQLite содержатся в одном файле вашей файловой системы. Вы можете создать новую базу данных SQLite, используя команду touch в консоли: touch database/database.sqlite . После создания базы данных вы можете легко настроить переменные окружения так, чтобы они указывали на эту базу данных, указав абсолютный путь к базе данных в переменной DB_DATABASE окружения:

DB_CONNECTION=sqlite DB_DATABASE=/absolute/path/to/database.sqlite 

Чтобы включить ограничения внешнего ключа для соединений SQLite, установите переменную DB_FOREIGN_KEYS окружения в true :

DB_FOREIGN_KEYS=true 
Конфигурация Microsoft SQL Server

Чтобы использовать базу данных Microsoft SQL Server, вы должны убедиться, что у вас установлены расширения PHP sqlsrv и pdo_sqlsrv , а также любые зависимости, которые могут им потребоваться, например, драйвер Microsoft SQL ODBC.

Конфигурация с использованием URL

Обычно соединения с базой данных конфигурируются с использованием нескольких значений, таких как host , database , username , password и т.д. Каждое из этих значений имеет свою собственную соответствующую переменную окружения. Это означает, что при указании информации о соединении с базой данных на рабочем веб-сервере вам необходимо управлять несколькими переменными окружения.

Некоторые поставщики СУБД, такие, как AWS и Heroku, предоставляют единый «URL» базы данных, который содержит всю информацию о соединении в одной строке. Пример URL-адреса базы данных может выглядеть так:

mysql://root:password@127.0.0.1/forge?charset=UTF-8 

Эти URL обычно следуют соглашению стандартной схемы:

driver://username:password@host:port/database?options 

Для удобства Laravel поддерживает эти URL-адреса в качестве альтернативы настройке базы данных с несколькими параметрами конфигурации. Если присутствует параметр конфигурации url (или соответствующая переменная DATABASE_URL окружения), то он будет использоваться для получения информации о соединении с базой данных и об учетных данных.

Соединения для чтения и записи

По желанию можно использовать одно соединение с базой данных для операторов SELECT , а другое – для операторов INSERT , UPDATE и DELETE . Laravel упрощает эту задачу, и всегда будут использоваться соответствующие соединения, независимо от того, используете ли вы сырые запросы построителя запросов или Eloquent ORM.

Чтобы увидеть, как должны быть настроены соединения для чтения / записи, давайте посмотрим на этот пример:

'mysql' => [ 'read' => [ 'host' => [ '192.168.1.1', '196.168.1.2', ], ], 'write' => [ 'host' => [ '196.168.1.3', ], ], 'sticky' => true, 'driver' => 'mysql', 'database' => 'database', 'username' => 'root', 'password' => '', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ], 

Обратите внимание, что в массив конфигурации были добавлены три ключа: read , write и sticky . Ключи read и write имеют значения массива, содержащие один ключ: host . Остальные параметры базы данных для соединений read и write будут объединены из основного массива конфигурации mysql .

В массивы read и write вам нужно помещать только те элементы, значения которых вы хотите переопределить из основного массива mysql . Таким образом, в этом случае 192.168.1.1 будет использоваться в качестве хоста для соединения «чтение», а 192.168.1.3 – для соединения «запись». Учетные данные БД, префикс, набор символов и все другие параметры из основного массива mysql будут совместно использоваться обоими соединениями. Если в массиве конфигурации host существует несколько значений, то для каждого запроса хост базы данных будет выбран случайным образом.

Параметр sticky

Параметр sticky – это необязательное значение, которое может использоваться для разрешения немедленного чтения записей, которые были записаны в базу данных во время текущего цикла запроса. Если опция sticky включена и в текущем цикле запроса к базе данных была выполнена операция «записи», то любые дальнейшие операции «чтения» будут использовать соединение «запись». Это гарантирует, что любые данные, записанные во время цикла запроса, могут быть немедленно обратно прочитаны из базы данных во время того же запроса. Вам решать, является ли это желаемым поведением для вашего приложения.

Выполнение SQL-запросов

После того как вы настроили соединение с базой данных, вы можете выполнять запросы, используя фасад DB . Фасад DB содержит методы для каждого типа запроса: select , update , insert , delete , и statement .

Выполнение Select-запроса

Чтобы выполнить базовый запрос SELECT , вы можете использовать метод select фасада DB :

 namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; class UserController extends Controller < /** * Показать список всех пользователей приложения. * * @return \Illuminate\Http\Response */ public function index() < $users = DB::select('select * from users where active = ?', [1]); return view('user.index', ['users' => $users]); > > 

Первым аргументом, переданным методу select , является SQL-запрос, а вторым аргументом – любые привязки параметров, необходимые для запроса. Обычно это значения ограничений выражений where . Привязка параметров обеспечивает защиту от SQL-инъекций.

Метод select всегда возвращает «массив» результатов. Каждый результат в массиве будет объектом stdClass PHP, представляющим запись из базы данных:

use Illuminate\Support\Facades\DB; $users = DB::select('select * from users'); foreach ($users as $user) < echo $user->name; > 
Использование именованных псевдопеременных

Вместо использования символа ? для связывания параметров вы можете выполнить запрос, используя именованные привязки:

$results = DB::select('select * from users where ['id' => 1]); 
Выполнение Insert-запроса

Чтобы выполнить запрос с INSERT , вы можете использовать метод insert фасада DB . Как и select , этот метод принимает запрос SQL в качестве первого аргумента, а привязки – в качестве второго аргумента:

use Illuminate\Support\Facades\DB; DB::insert('insert into users (id, name) values (?, ?)', [1, 'Marc']); 
Выполнение Update-запроса

Метод update следует использовать для обновления существующих записей в базе данных. Количество затронутых выражением строк будут возвращены этим методом:

use Illuminate\Support\Facades\DB; $affected = DB::update( 'update users set votes = 100 where name = ?', ['Anita'] ); 
Выполнение Delete-запроса

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

use Illuminate\Support\Facades\DB; $deleted = DB::delete('delete from users'); 
Выполнение запроса общего типа

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

DB::statement('drop table users'); 
Выполнение неподготовленного запроса

По желанию может потребоваться выполнить запрос SQL без привязки каких-либо значений. Для этого используйте метод unprepared фасада DB :

DB::unprepared('update users set votes = 100 where name = "Dries"'); 

Поскольку неподготовленные запросы не связывают параметры, они могут быть уязвимы для SQL-инъекций. Вы никогда не должны пропускать в неподготовленное выражение значения, управляемые пользователем.

Неявные фиксации (implicit commit)

При использовании в транзакциях методов statement и unprepared фасада DB вы должны быть осторожны, чтобы избежать операторов, которые вызывают неявные фиксации. Эти операторы заставят ядро базы данных косвенно зафиксировать всю транзакцию, в результате чего Laravel не будет знать об уровне транзакции базы данных. Примером такого оператора является создание таблицы базы данных:

DB::unprepared('create table a (col varchar(1) null)'); 

Пожалуйста, обратитесь к руководству по MySQL для ознакомления со списком всех операторов, которые выполняют неявные фиксации.

Использование нескольких соединений к базе данных

Если ваше приложение определяет несколько соединений в конфигурационном файле config/database.php , то вы можете получить доступ к каждому соединению с помощью метода connection фасада DB . Имя соединения, передаваемое методу connection , должно соответствовать одному из подключений, перечисленных в вашем конфигурационном файле config/database.php , включая переопределенные с помощью глобального помощника config во время выполнения скрипта:

use Illuminate\Support\Facades\DB; $users = DB::connection('sqlite')->select(. ); 

Вы можете получить доступ к сырому, базовому экземпляру PDO текущего соединения, используя метод getPdo экземпляра соединения:

$pdo = DB::connection()->getPdo(); 

Прослушивание событий запроса

По желанию можно указать замыкание, которое будет вызываться для каждого SQL-запроса, выполняемого вашим приложением, используя метод listen фасада DB . Этот метод может быть полезен для логирования запросов или их отладки. Вы можете зарегистрировать замыкание слушателя запросов в методе boot поставщика служб:

 namespace App\Providers; use Illuminate\Support\Facades\DB; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider < /** * Регистрация любых служб приложения. * * @return void */ public function register() < // > /** * Загрузка любых служб приложения. * * @return void */ public function boot() < DB::listen(function ($query) < // $query->sql; // $query->bindings; // $query->time; >); > > 

Транзакции базы данных

Вы можете использовать метод transaction фасада DB , для выполнения набора операций в транзакции базы данных. Если при закрытии транзакции возникает исключение, то транзакция автоматически откатывается, а исключение генерируется повторно. Если замыкание выполнено успешно, то транзакция будет автоматически зафиксирована. Вам не нужно беспокоиться о ручном откате или фиксации при использовании метода transaction :

use Illuminate\Support\Facades\DB; DB::transaction(function () < DB::update('update users set votes = 1'); DB::delete('delete from posts'); >); 
Обработка взаимоблокировок

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

use Illuminate\Support\Facades\DB; DB::transaction(function () < DB::update('update users set votes = 1'); DB::delete('delete from posts'); >, 5); 
Использование транзакций вручную

Если вы хотите вручную начать транзакцию и иметь полный контроль над откатами и фиксациями, то вы можете использовать метод beginTransaction фасада DB :

use Illuminate\Support\Facades\DB; DB::beginTransaction(); 

Вы можете откатить транзакцию с помощью метода rollBack :

DB::rollBack(); 

Наконец, вы можете зафиксировать транзакцию с помощью метода commit :

DB::commit(); 

Методы транзакций фасада DB контролируют транзакции как для построителя запросов, так и для Eloquent ORM.

Подключение к базе данных с помощью интерфейса командной строки Artisan

Если вы хотите подключиться к своей базе данных с помощью интерфейса командной строки, то вы можете использовать команду db Artisan:

php artisan db 

При необходимости, вы можете указать имя соединения для подключения к базе данных, не являющееся соединением по умолчанию:

php artisan db mysql 
Русскоязычное комьюнити
  • Группа в VK
  • Телеграм LaravelRUS
  • Телеграм Laravel для новичков
  • Телеграм LaravelPro
Обучающие ресурсы
  • Laracasts
  • Codecourse
  • Курс Дмитрия Елисеева
  • Adam Wathan
Блоги разработчиков
  • Laravel News
  • Freek Van der Herten
  • Brent Roose
  • Marcel Pociot

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *