Dbase — Yii или БД


Содержание

Объекты доступа к базе данных

Созданный поверх PDO, Yii DAO (Database Access Objects) предоставляет объектно-ориентированный API для доступа к реляционным базам данных. Это основа для других более продвинутых методов доступа к базам данных, включая построитель запросов и активную запись.

При использовании Yii DAO вам в основном приходится иметь дело с простыми SQL-массивами и массивами PHP. В результате, это самый эффективный способ доступа к базам данных. Однако из-за того, что синтаксис SQL может отличаться для разных баз данных, использование Yii DAO также означает, что вам необходимо приложить дополнительные усилия для создания приложения, не привязанного к базе данных.

Yii DAO поддерживает следующие базы данных:

Создание соединений с БД

Чтобы получить доступ к базе данных, сначала необходимо подключиться к ней, создав экземпляр yii\db\Connection :

Так как соединение с БД часто требуется для доступа в разных местах, обычной практикой является настройка его с точки зрения компонента приложения, например:

Вы можете получить доступ к соединению DB с помощью выражения Yii::$app->db . При настройке соединения с БД вы всегда должны указывать свое имя источника данных (DSN) через свойство dsn. Формат DSN различается для разных баз данных.

  • MySQL, MariaDB: mysql:host=localhost;dbname=mydatabase
  • SQLite: sqlite:/path/to/database/file
  • PostgreSQL: pgsql:host=localhost;port=5432;dbname=mydatabase
  • CUBRID: cubr >
  • MS SQL Server (через драйвер sqlsrv): sqlsrv:Server=localhost;Database=mydatabase
  • MS SQL Server (через драйвер dblib): dblib:host=localhost;dbname=mydatabase
  • MS SQL Server (через драйвер mssql): mssql:host=localhost;dbname=mydatabase
  • Oracle: oci:dbname=//localhost:1521/mydatabase

Обратите внимание: если вы подключаетесь к базе данных через ODBC, вы должны настроить свойство yii\db\Connection::$driverName , чтобы Yii мог узнать фактический тип базы данных. Например:

Помимо свойства dsn, вам часто нужно настроить имя пользователя и пароль. Обратитесь к yii\db\Connection для получения полного списка настраиваемых свойств.

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

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

  • Создайте команду yii\db\Command с простым запросом SQL;
  • Параметры привязки (необязательно);
  • Вызовите один из методов выполнения SQL в yii\db\Command .

В следующем примере показаны различные способы извлечения данных из базы данных:

Параметры привязки

При создании команды БД из SQL с параметрами вы почти всегда должны использовать подход привязки параметров для предотвращения атак SQL-инъекций. Например:

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

  • bindValue () : связывает одно значение параметра
  • bindValues () : связывает несколько значений параметров в одном вызове
  • bindParam () : подобно bindValue(), но также поддерживает ссылки на параметры связывания.

В следующем примере показаны альтернативные способы привязки параметров:

Связывание параметров осуществляется с помощью подготовленных операторов. Помимо предотвращения атак SQL-инъекций, он также может повысить производительность, подготовив SQL-запрос один раз и выполняя его несколько раз с разными параметрами. Например:

Поскольку bindParam() поддерживает параметры привязки ссылками, приведенный выше код также может быть написан следующим образом:

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

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

Методы queryXyz() , представленные в предыдущих разделах, все имеют дело с SELECT-запросами, которые извлекают данные из баз данных. Для запросов, которые не возвращают данные, вы должны вместо этого вызвать метод yii\db\Command::execute() . Например:

Метод yii\db\Command::execute() возвращает количество строк, затронутых выполнением SQL.

Для запросов INSERT, UPDATE и DELETE вместо написания простых SQL-запросов вы можете вызвать insert() , update() , delete() , соответственно, для создания соответствующих SQL-запросов. Эти методы будут правильно указывать имена таблиц и столбцов и значения параметров связывания. Например:

Вы также можете вызвать batchInsert() , чтобы вставить несколько строк в один снимок, что намного эффективнее, чем вставлять по одной строке за раз:

Обратите внимание, что вышеупомянутые методы создают запрос, и вы всегда должны вызывать execute() , чтобы фактически запустить их.

Указание имен таблиц и столбцов

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

  • [[column name]] : заключить имя столбца в двойные квадратные скобки;
  • < > : заключите имя таблицы, которое будет заключено в двойные фигурные скобки.


    Yii DAO автоматически преобразует такие конструкции в соответствующие имена столбцов или таблиц в кавычках, используя специальный синтаксис СУБД. Например:

    Использование префикса таблицы

    Если большинство ваших имен таблиц базы данных имеют общий префикс, вы можете использовать функцию префикса таблицы, предоставленную Yii DAO. Во-первых, укажите префикс таблицы через свойство yii\db\Connection::$tablePrefix в конфигурации приложения:

    Затем в коде каждый раз, когда вам нужно обратиться к таблице, имя которой содержит такой префикс, используйте синтаксис <<% table_name>> . Процентный символ будет автоматически заменен префиксом таблицы, который вы указали при настройке соединения с БД. Например:

    Выполнение транзакций

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

    Следующий код показывает типичный способ использования транзакций:

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

    При вызове метода beginTransaction() запускается новая транзакция. Транзакция представлена в виде объекта yii\db\Transaction , хранящегося в переменной $transaction. Затем выполняемые запросы помещаются в блок try . catch . Если все запросы выполнены успешно, для фиксации транзакции вызывается метод commit() . В противном случае, если исключение будет запущено и поймано, вызывается метод rollBack() для отката изменений, сделанных запросами до этого неудачного запроса в транзакции. Throw $e перебрасывает исключение так, как если бы мы его не поймали, поэтому обычный процесс обработки ошибок позаботится об этом.

    Указание уровней изоляции

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

    Yii предоставляет четыре константы для наиболее распространенных уровней изоляции:

    • yii\db\Transaction::READ_UNCOMMITTED — самый слабый уровень, возможны грязные чтения, неповторяющиеся чтения и фантомы.
    • yii\db\Transaction::READ_COMMITTED — избегать грязных чтений.
    • yii\db\Transaction::REPEATABLE_READ — избегать грязных чтений и неповторяющихся чтений.
    • yii\db\Transaction::SERIALIZABLE — самый сильный уровень, избегает всех вышеупомянутых проблем.

    Помимо использования указанных констант для указания уровней изоляции, вы также можете использовать строки с допустимым синтаксисом, поддерживаемым используемой СУБД. Например, в PostgreSQL вы можете использовать SERIALIZABLE READ ONLY DEFERRABLE .

    Обратите внимание, что некоторые СУБД позволяют устанавливать уровень изоляции только для всего соединения. Любые последующие транзакции получат одинаковый уровень изоляции, даже если вы не укажете никаких. При использовании этой функции вам может потребоваться явно установить уровень изоляции для всех транзакций, чтобы избежать конфликтующих настроек. На момент написания этой статьи только MSSQL и SQLite были затронуты этим ограничением.

    Вложенные транзакции

    Если ваша СУБД поддерживает Savepoint, вы можете вложить несколько транзакций, например:

    Разделение репликации и чтения-записи

    Многие СУБД поддерживают репликацию базы данных, чтобы повысить доступность базы данных и сократить время отклика сервера. При репликации базы данных данные реплицируются с так называемых главных серверов на подчиненные серверы. Все записи и обновления должны выполняться на главных серверах, в то время как чтение может также выполняться на подчиненных серверах.

    Чтобы воспользоваться репликацией базы данных и достичь разделения чтения и записи, вы можете настроить компонент yii\db\Connection следующим образом:

    Вышеупомянутая конфигурация определяет установку с одним главным и несколькими подчиненными устройствами. Один из подчиненных устройств будет подключен и будет использоваться для выполнения запросов на чтение, в то время как мастер будет использоваться для выполнения запросов на запись. Такое разделение чтения-записи выполняется автоматически с помощью этой конфигурации. Например:

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

    Вы также можете настроить несколько мастеров с несколькими подчиненными устройствами. Например:

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

    По умолчанию транзакции используют мастер-соединение. И в транзакции все операции с БД будут использовать главное соединение. Например:

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

    Иногда вам может потребоваться принудительное использование основного соединения для выполнения запроса на чтение. Этого можно добиться с помощью метода useMaster() :

    Вы также можете напрямую установить Yii::$app->db->enableSlaves на false , чтобы направлять все запросы к мастер-соединению.

    Работа с базой данных

    Yii DAO предоставляет целый набор методов, позволяющих вам манипулировать схемой базы данных, такой как создание новых таблиц, удаление столбца из таблицы и т. д. Эти методы перечислены ниже:

    • createTable () : создание таблицы
    • renameTable () : переименование таблицы
    • dropTable () : удаление таблицы
    • truncateTable () : удаление всех строк в таблице
    • addColumn () : добавление столбца
    • renameColumn () : переименование столбца
    • dropColumn () : удаление столбца
    • alterColumn () : изменение столбца
    • addPrimaryKey () : добавление первичного ключа
    • dropPrimaryKey () : удаление первичного ключа
    • addForeignKey () : добавление внешнего ключа
    • dropForeignKey () : удаление внешнего ключа
    • createIndex () : создание индекса
    • dropIndex () : удаление индекса


    Эти методы можно использовать следующим образом:

    Вышеуказанный массив описывает имя и типы создаваемых столбцов. Для типов столбцов Yii предоставляет набор абстрактных типов данных, которые позволяют определять агностическую схему базы данных. Они преобразуются в определения конкретного типа СУБД, зависящие от базы данных, таблица создается. Для получения дополнительной информации обратитесь к документации по API метода createTable() .

    Помимо изменения схемы базы данных, вы также можете получить информацию о определении таблицы с помощью метода getTableSchema() соединения с БД. Например:

    Метод возвращает объект yii\db\TableSchema , который содержит информацию о столбцах таблицы, первичных ключах, внешних ключах и т. д. Вся эта информация в основном используется построителем запросов и активной записью, чтобы помочь вам написать код агностика базы данных.

    Как получить данные из таблицы БД в yii2

    Существует ли глобальный способ получения каких-либо данных из таблицы db, поскольку я не смог найти ничего, что сработало (новичок в Yii2 и работа над уже созданным приложением yii2).

    Работа в контроллере со следующим кодом: (не работает)

    Это не вернет ничего, кроме только ошибки.

    1 ответ

    Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

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

    Соединение с базой данных в Yii 2.x

    Из коробки Yii 2.x поддерживает работу с 7 различными системами управления базами данными

    • MySQL
    • MariaDB
    • SQLite
    • PostgreSQL
    • CUBRID: версии 9.3 или выше.
    • Oracle
    • MSSQL: версии 2008 или выше.

    Для доступа к базе, сначала необходимо создать экземпляр класса

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

    Выносим подключение в файл db.php. В файле подключения вставляем следующий код:

    Теперь вы можете получить доступ к подключению к текущей БД с помощью выражения Yii::$app->db , для доступа к последующей базе данных используйте выражение \Yii::$app->secondDb

    Рассмотрим несколько примеров описания имени источника данных для разных СУБД

    • MySQL, MariaDB: mysql:host=localhost;dbname=mydatabase
    • SQLite: sqlite:/path/to/database/file
    • PostgreSQL: pgsql:host=localhost;port=5432;dbname=mydatabase
    • CUBR >
    • MS SQL Server (via sqlsrv driver): sqlsrv:Server=localhost;Database=mydatabase
    • MS SQL Server (via dblib driver): dblib:host=localhost;dbname=mydatabase
    • MS SQL Server (via mssql driver): mssql:host=localhost;dbname=mydatabase
    • Oracle: oci:dbname=//localhost:1521/mydatabase

    Подключим 2 базы данных, для этого в файле web.php прописываем следующий код:

    Файлы firstdb.php и seconddb.php непосредственно будут отвечать за соединение с базами. Далее назначим каждой модели свою базу, для этого в модили пишем следующий код:

    Итак после не хитрых манипуляций мы подключили базы к нашему приложению!

    Объекты доступа к данным (DAO) ¶

    Построенные поверх PDO, Yii DAO (объекты доступа к данным) обеспечивают объектно-ориентированный API для доступа к реляционным базам данных. Это основа для других, более продвинутых, методов доступа к базам данных, включая построитель запросов и active record.

    При использовании Yii DAO вы в основном будете использовать чистый SQL и массивы PHP. Как результат, это самый эффективный способ доступа к базам данных. Тем не менее, так как синтаксис SQL может отличаться для разных баз данных, используя Yii DAO вам нужно будет приложить дополнительные усилия, чтобы сделать приложение не зависящим от конкретной базы данных.

    Yii DAO из коробки поддерживает следующие базы данных:

    Note: Новая версия pdo_oci для PHP 7 на данный момент существует только в форме исходного кода. Используйте инструкции сообщества по компиляции.

    Создание подключения к базе данных ¶

    Для доступа к базе данных, вы сначала должны подключится к ней, создав экземпляр класса yii\db\Connection:

    Так как подключение к БД часто нужно в нескольких местах, распространённой практикой является его настройка как компонента приложения:

    Теперь вы можете получить доступ к подключению к БД с помощью выражения Yii::$app->db .


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

    При настройке подключения, вы должны обязательно указывать Имя Источника Данных (DSN) через параметр dsn. Формат DSN отличается для разных баз данных. Дополнительное описание смотрите в справочнике PHP. Ниже представлены несколько примеров:

    • MySQL, MariaDB: mysql:host=localhost;dbname=mydatabase
    • SQLite: sqlite:/path/to/database/file
    • PostgreSQL: pgsql:host=localhost;port=5432;dbname=mydatabase
    • CUBRID: cubr >
    • MS SQL Server (via sqlsrv driver): sqlsrv:Server=localhost;Database=mydatabase
    • MS SQL Server (via dblib driver): dblib:host=localhost;dbname=mydatabase
    • MS SQL Server (via mssql driver): mssql:host=localhost;dbname=mydatabase
    • Oracle: oci:dbname=//localhost:1521/mydatabase

    Заметьте, что если вы подключаетесь к базе данных через ODBC, вам необходимо указать свойство yii\db\Connection::driverName , чтобы Yii знал какой тип базы данных используется. Например,

    Кроме свойства dsn, вам необходимо указать username и password. Смотрите yii\db\Connection для того, чтоб посмотреть полный список свойств.

    Info: При создании экземпляра соединения к БД, фактическое соединение с базой данных будет установлено только при выполнении первого SQL запроса или при явном вызове метода open().

    Tip: Иногда может потребоваться выполнить некоторые запросы сразу после соединения с базой данных, для инициализации переменных окружения. Например, чтобы задать часовой пояс или кодировку. Сделать это можно зарегистрировав обработчик для события afterOpen в конфигурации приложения:

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

    После создания экземпляра соединения, вы можете выполнить SQL запрос, выполнив следующие шаги:

    1. Создать yii\db\Command из запроса SQL;
    2. Привязать параметры (не обязательно);
    3. Вызвать один из методов выполнения SQL из yii\db\Command.

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

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

    Привязка параметров ¶

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

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

    • bindValue(): привязка одного параметра по значению
    • bindValues(): привязка нескольких параметров в одном вызове
    • bindParam(): похоже на bindValue(), но привязка происходит по ссылке.

    Следующий пример показывает альтернативный путь привязки параметров:

    Привязка переменных реализована через подготавливаемые запросы. Помимо предотвращения атак путём SQL инъекций, это увеличивает производительность, так как запрос подготавливается один раз, а потом выполняется много раз с разными параметрами. Например,

    Так как bindParam() поддерживает привязку параметров по ссылке, следующий код может быть написан следующим образом:

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

    Выполнение Не-SELECT запросов ¶

    В методах queryXyz() , описанных в предыдущих разделах, вызываются SELECT запросы для извлечения данных из базы. Для запросов не возвращающих данные, вы должны использовать метод yii\db\Command::execute(). Например,

    Метод yii\db\Command::execute() возвращает количество строк обработанных SQL запросом.

    Для запросов INSERT, UPDATE и DELETE, вместо написания чистого SQL, вы можете вызвать методы insert(), update(), delete(), соответственно, для создания указанных SQL конструкций. Например,

    Вы можете также вызвать batchInsert() для вставки множества строк за один вызов. Это более эффективно чем вставлять записи по одной за раз:

    Обратите внимание, что перечисленные методы лишь создают запрос. Чтобы его выполнить нужно вызывать execute().

    Экранирование имён таблиц и столбцов ¶

    При написании независимого от базы данных кода, правильно экранировать имена таблиц и столбцов довольно трудно, так как в разных базах данных правила экранирования разные. Чтоб преодолеть данную проблему вы можете использовать следующий синтаксис экранирования используемый в Yii:

    • [[column name]] : заключайте имя столбца в двойные квадратные скобки;
    • <
    > : заключайте имя таблицы в двойные фигурные скобки.

    Yii DAO будет автоматически преобразовывать подобные конструкции в SQL в правильно экранированные имена таблиц и столбцов. Например,

    Использование префиксов таблиц ¶


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

    Сначала, укажите префикс таблиц через свойство yii\db\Connection::$tablePrefix:

    Затем в коде, когда вам нужно ссылаться на таблицу, имя которой содержит такой префикс, используйте синтаксис <<%table name>> . Символ процента будет автоматически заменён на префикс таблицы, который вы указали во время конфигурации соединения с базой данных. Например,

    Исполнение транзакций ¶

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

    Следующий код показывает типичное использование транзакций:

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

    Note: в коде выше ради совместимости с PHP 5.x и PHP 7.x использованы два блока catch. \Exception реализует интерфейс \Throwable interface начиная с PHP 7.0. Если вы используете только PHP 7 и новее, можете пропустить блок с \Exception .

    При вызове метода beginTransaction(), будет запущена новая транзакция. Транзакция представлена объектом yii\db\Transaction сохранённым в переменной $transaction . Потом, запросы будут выполняться в блоке try. catch. . Если запросы будут выполнены удачно, будет выполнен метод commit(). Иначе, будет вызвано исключение, и будет вызван метод rollBack() для отката изменений сделанных до неудачно выполненного запроса внутри транзакции.

    Указание уровня изоляции ¶

    Yii поддерживает настройку [уровня изоляции] для ваших транзакций. По умолчанию, при старте транзакции, будет использован уровень изоляции настроенный в вашей базе данных. Вы можете переопределить уровень изоляции по умолчанию, как указано ниже:

    Yii предоставляет четыре константы для наиболее распространённых уровней изоляции:

    • yii\db\Transaction::READ_UNCOMMITTED — низший уровень, «Грязное» чтение, не повторяющееся чтение и фантомное чтение.
    • yii\db\Transaction::READ_COMMITTED — предотвращает «Грязное» чтение.
    • yii\db\Transaction::REPEATABLE_READ — предотвращает «Грязное» чтение и не повторяющееся чтение.
    • yii\db\Transaction::SERIALIZABLE — высший уровень, предотвращает все вышеуказанные проблемы.

    Помимо использования приведённых выше констант для задания уровня изоляции, вы можете, также, использовать строки поддерживаемые вашей СУБД. Например, в PostgreSQL, вы можете использовать SERIALIZABLE READ ONLY DEFERRABLE .

    Заметьте что некоторые СУБД допускают настраивать уровень изоляции только для всего соединения. Следующие транзакции будут получать тот же уровень изоляции, даже если вы его не укажете. При использовании этой функции может потребоваться установить уровень изоляции для всех транзакций, чтоб избежать явно конфликтующих настроек. На момент написания этой статьи страдали от этого ограничения только MSSQL и SQLite.

    Note: SQLite поддерживает только два уровня изоляции, таким образом вы можете использовать только READ UNCOMMITTED и SERIALIZABLE . Использование других уровней изоляции приведёт к генерации исключения.

    Note: PostgreSQL не допускает установки уровня изоляции до старта транзакции, так что вы не сможете установить уровень изоляции прямо при старте транзакции. Вы можете использовать yii\db\Transaction::setIsolationLevel() в таком случае после старта транзакции.

    Вложенные транзакции ¶

    Если ваша СУБД поддерживает Savepoint, вы можете вкладывать транзакции как показано ниже:

    Репликация и разделение запросов на чтение и запись ¶

    Многие СУБД поддерживают репликацию баз данных для лучшей доступности базы данных и уменьшения времени ответа сервера. С репликацией базы данных, данные копируются из master servers на slave servers. Все вставки и обновления должны происходить на основном сервере, хотя чтение может производится и с подчинённых серверов.

    Чтоб воспользоваться преимуществами репликации и достичь разделения чтения и записи, вам необходимо настроить компонент yii\db\Connection как указано ниже:

    Вышеуказанная конфигурация определяет систему с одним мастером и несколькими подчинёнными. Один из подчинённых будет подключен и использован для чтения, в то время как мастер будет использоваться для запросов записи. Такое разделение чтения и записи будет осуществлено автоматически с указанной конфигурацией. Например,

    Info: Запросы выполненные через yii\db\Command::execute() определяются как запросы на запись, а все остальные запросы через один из «query» методов yii\db\Command воспринимаются как запросы на чтение. Вы можете получить текущий статус соединения к подчинённому серверу через $db->slave .

    Компонент Connection поддерживает балансировку нагрузки и переключение при сбое для подчинённых серверов. При выполнении первого запроса на чтение, компонент Connection будет случайным образом выбирать подчинённый сервер и попытается подключиться к нему. Если сервер окажется «мёртвым», он попробует подключиться к другому. Если ни один из подчинённых серверов не будет доступен, он подключится к мастеру. Если настроить кеш статуса серверов, то недоступность серверов может быть запомнена, чтоб не использоваться в течении заданного промежутка времени.

    Info: В конфигурации выше, таймаут соединения к подчинённому серверу настроен на 10 секунд. Это означает, что если сервер не ответит за 10 секунд, он будет считаться «мёртвым». Вы можете отрегулировать этот параметр исходя из настроек вашей среды.

    Вы также можете настроить несколько основных и несколько подчинённых серверов. Например,

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

    Note: Когда вы используете свойство masters для настройки одного или нескольких основных серверов, все остальные свойства для настройки соединения с базой данных (такие как dsn , username , password ) будут проигнорированы компонентом Connection .

    По умолчанию, транзакции используют соединение с основным сервером. И в рамках транзакции, все операции с БД будут использовать соединение с основным сервером. Например,

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

    Иногда может потребоваться выполнить запрос на чтение через подключение к основному серверу. Это может быть достигнуто с использованием метода useMaster() :

    Вы также можете явно установить $db->enableSlaves в ложь, чтоб направлять все запросы к соединению с мастером.


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

    Yii DAO предоставляет целый набор методов для управления схемой базы данных, таких как создание новых таблиц, удаление столбцов из таблицы, и т.д.. Эти методы описаны ниже:

    • createTable(): создание таблицы
    • renameTable(): переименование таблицы
    • dropTable(): удаление таблицы
    • truncateTable(): удаление всех записей в таблице
    • addColumn(): добавление столбца
    • renameColumn(): переименование столбца
    • dropColumn(): удаление столбца
    • alterColumn(): преобразование столбца
    • addPrimaryKey(): добавление первичного ключа
    • dropPrimaryKey(): удаление первичного ключа
    • addForeignKey(): добавление внешнего ключа
    • dropForeignKey(): удаление внешнего ключа
    • createIndex(): создания индекса
    • dropIndex(): удаление индекса

    Эти методы могут быть использованы, как указано ниже:

    Вы также сможете получить описание схемы таблицы через вызов метода getTableSchema(). Например,

    Метод вернёт объект yii\db\TableSchema, который содержит информацию о столбцах таблицы, первичных ключах, внешних ключах, и т.д.. Вся эта информация используется главным образом для построителя запросов и active record, чтоб помочь вам писать независимый от базы данных код.

    Page generated on Wed, 13 Nov 2020 19:11:10 +0000

    Основные элементы СУБД типа dBASE

    Напомним некоторые термины, используемые в теории реляционных баз данных. Будем представлять информацию, составляющую базу данных, в виде совокупности прямоугольных таблиц.

    Поле — наименьший поименованный элемент информации, хранящейся в БД и рассматриваемой как единое целое (рис. 6.7).

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

    Рис. 6.7. Представление информации в реляционной БД

    Запись — совокупность полей, соответствующих одному объекту. Так, абоненту телефонной сети соответствует запись, состоящая из трех полей.

    Файл — совокупность связанных по какому-либо признаку записей (т.е. отношение, таблица). Таким образом, в простом случае база данных есть файл.

    Все данные в БД разделены по типам. Говоря точнее, вся информация полей, принадлежащих одному столбцу (домену), имеет один и тот же тип. Такой подход позволяет ЭВМ организовать контроль вводимой информации.

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

    символьный тип, обозначение С (character);

    числовой тип, обозначение N (numeric);

    логический тип, обозначение L (logical);

    тип даты, обозначение Data;

    примечаний, обозначение Memo.

    Каждый тип служит для хранения специфической информации. В поле типа С можно помещать любые имеющиеся на клавиатуре символы: буквы, цифры, знаки препинания и т.д. Символьное поле хранится как текст, выровненный по левому краю. Над символьными полями нельзя выполнять каких-либо вычислений.

    В числовом поле могут быть только цифры, знаки «плюс» и «минус», десятичная точка. Числа выровнены по правому краю. Над числовыми полями можно выполнять вычисления.

    Поле логического типа содержит величины, которые могут принимать только одно из двух значений: истинно или ложно.

    Поле типа даты может содержать реальные даты в представлении, принятом в США (месяц/день/год) или в европейских странах.

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

    Семейство СУБД dBASE. Среди СУБД для ПК наиболее распространенным в мире является семейство dBASE фирмы «Ashton-Tate». Такая популярность объясняется отчасти исторически, так как эта СУБД появилась одной из первых на рынке программных продуктов данного профиля; не в меньшей степени этому способствовала удачность заложенных основ конструкции СУБД и командного языка. Одна из наиболее широко используемых (в настоящее время устаревших) версий этого семейства — dBASE III+.

    В новой версии dBASE IV концепция СУБД и командный язык получили значительное развитие, позволившее устранить недостатки предыдущей версии, а также существенно обогатить палитру средств обработки данных и улучшить интерфейс пользователя.

    К числу СУБД реляционного типа, предназначенных для ПК, относятся семейство dBASE (dBASE II, III, III+ и IV), Clipper, Foxbase, R:BASE, Paradox и др. В этих СУБД записи и, соответственно, поля имеют обычно фиксированную длину (чаще всего длина такой записи достигает 4000. 5000 байт). Исключение составляют поля типа Memo, используемые, например, в СУБД семейства dBASE. Число полей в перечисленных СУБД варьируется от 128 до 1024.

    Длина поля зависит от типа поля и может составлять от 255 до 4000 байт для текстовых полей, до 20 байт для числовых полей и имеет фиксированные значения для полей типа даты (8 байт) и логических полей (1 байт). Поле типа Memo служит для хранения больших массивов текстовой информации и хранится в отдельном файле БД, но воспринимается как поле в составе основного файла БД. Это поле имеет плавающую длину, определяемую объемом введенной текстовой информации, и может достигать 32767 байт.

    Большинство СУБД реляционного типа для ПК позволяют создавать файлы с числом записей до 1 млрд. и объемом до 2 Гбайт. Обычно ограничением на число и объем записей, в первую очередь, выступает емкость внешней памяти ПК на магнитных дисках.

    В состав многих СУБД, предназначенных для работы на ПК, входят три основных компонента: командный язык, интерпретирующая система или компилятор для преобразования команд к выполнимому виду и средства взаимодействия пользователя с СУБД (интерфейс пользователя).

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


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

    Существует два принципиально различных способа такого преобразования. В первом способе используется интерпретирующая система, которая преобразует поочередно команды в исполнимый вид передих непосредственным выполнением. Во втором способе сначала вся исходная программа преобразуется (компилируется) в программу из исполнимых машиной команд и затем эта программа выполняется.

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

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

    Последние версии таких СУБД, как dBASE, RBASE и др., содержат генераторы прикладных программ, позволяющие пользователям без знания командного языка создавать программы средней степени сложности. Эти средства могут применяться как неподготовленными пользователями, так и профессиональными программистами для уменьшения трудозатрат при разработке прикладных программ.

    Как уже отмечалось, первой созданной в этом классе программой была dBASE II, созданная Уэйном Рэтлиффом (США) в 1981г. Варианты этой системы до сих пор используются для целей обучения на учебных ЭВМ. Вскоре эта система была усовершенствована, а ее возможности расширены. Появились СУБД dBASE III и dBASE III+, ставшие на долгое время стандартом систем управления базами данных для персональных компьютеров. Позже получили распространение системы FoxBase, FoxPro и Clipper — все имеющие набор команд, похожий на СУБД семейства dBASE, и использующие ту же организацию данных в файлах с типичным расширением .dbf (Data Base File — файл базы данных), СУБД dBASE IV. Языки этих систем послужили основой для создания огромного числа прикладных информационно-поисковых систем, автоматизированных рабочих мест (АРМ) в различных предметных областях.

    Система управления базами данных dBASE IV значительно усилена по сравнению с dBASE III+ по многим параметрам (ниже в скобках указаны данные для dBASE III+). В частности, можно создавать двумерные массивы переменных общим объемом до 1170 элементов, может быть открыто до 99 (16) файлов, увеличено максимальное число переменных — 15000 (265), число полей в файлах БД — 255 (128), число открытых индексных файлов -10 (7) и т.д. Как уже отмечалось выше, командный язык dBASE IV значительно расширен и улучшен по сравнению с командным языком dBASE III+.

    Включение в язык dBASE IV новых команд позволило существенно улучшить следующие функции пакета СУБД семейства dBASE:

    · разработку иерархических систем меню прикладныхзадач;

    · разработку экранных форм ввода и вывода данных;

    · организацию ввода и вывода информации в отдельные окна на экране;

    · вывод данных на печать;

    · возможности по поиску и обработке данных в файлах БД;

    · обеспечение работы в среде ЛВС и др.

    Команды типичной СУБД для персональных компьютеров предназначены для выполнения следующих функций:

    • поиска информации в БД;

    • формирования и вывода на экран или принтер информации в виде отчетов.

    Представление о возможностях пакета dBASE IV можно получить при знакомстве с управляющим центром (УЦ). реализующиминтерфейс пользователя, управляемый меню. В состав УЦ входят шесть меню:

    • меню Data («Данные») для создания, изменения структуры файлов БД, ввода, обновления и отображения данных на экране;

    • меню Queries («Запросы») для формирования и выполнения запросов на выборку и обновление данных;

    • меню Forms(«Формы») для разработки экранных форм ввода и вывода информации;

    • меню Reports («Отчеты») для разработки форм отчетов и вывода их на печать;

    • меню Labels («Марки») для разработки форм марок и вывода их на печать;

    • меню Applications («Прикладные программы») — генератор разработки прикладных программ.

    Функции УЦ и расположение меню на экране отражают последовательность работы пользователя при разработке прикладной информационной задачи. Работа обычно начинается с создания структуры файлов БД, которые требуются для ее решения. Возможные типы файлов приведены в табл. 6.1.

    После создания структур файлов БД прикладной задачи требуется ввести в них данные.

    Ввод и обновление данных в меню «Данные» выполняется на экране в стандартных формах. Эти формы не всегда вполне удобны для пользователя. В УЦ предусмотрено меню «Формы», позволяющее разрабатывать собственные экранные формы для ввода и вывода информации.

    Не нашли то, что искали? Воспользуйтесь поиском:

    Лучшие изречения: Увлечёшься девушкой-вырастут хвосты, займёшься учебой-вырастут рога 9794 — | 7673 — или читать все.

    188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

    Отключите adBlock!
    и обновите страницу (F5)

    очень нужно

    Доступ к базе данных Firebird из YII2

    Так получилось, что мне понадобилось переносить интерфейс пользователя из связки Delphi + Firebird в WEB. Дабы не останавливать работу комплекса программ, решено было переносить формы постепенно, а для этого необходимо сохранить работу СУБД Firebird и подключаться к ней из web приложения. При разработке web-приложения я решил использовать фреймворк YII2. На этапе разработки мне не нужен полноценный HTTP сервер, вполне сойдет Denwer или XAMMP, или что-то еще. Я выбрал XAMMP т.к. в Денвере давно не обновляется версия PHP, а руками заниматься его обновлением не хочется, идем по пути наименьшего сопротивления. Изначально ни в XAMMP PHP, ни в YII2 нет возможности работать с СУБД Firebird, но при определенных танцах с бубном сделать это вполне реально. Итак, я буду полагать, что у Вас уже установлены: Windows 7 x64, XAMMP и YII2, Firebird 2.5.

    Пути установки пакетов у меня (для себя вводите соответствующие корректировки):

    • Firebird 2.5 версия x64 (тип сервера значения не имеет) в C:\Program Files\Firebird\Firebird_2_5\
    • XAMMP установлен в D:\xampp\
    • YII2 установлен в D:\xampp\htdocs\yii\
    • БД расположена в пути D:\WORK\database\TBOT.GDB



    Теперь можно начинать.

    Установка поддержки Firebird для PHP

    Для установки поддержки Firebird необходимо остановить сервер Apache в XAMMP. Для этого открываем консоль XAMMP и проверяем, что бы напротив сервиса Apache стояла кнопка «Start» т.е. сервис не запущен, иначе нажимаем «Stop».

    Открываем любым редактором файл конфигурации PHP D:\xampp\php\php.ini и находим в нем строчку:

    Убираем «;» в начале т.е. раскомментируем и сохраняем. Драйвер PDO, используемый YII2 для доступа к СУБД, включен. Однако так просто ничего не заработает, теперь надо скопировать стандартную библиотеку доступа к СУБД fbclient.dll. Тут необходимо быть внимательным т.к. у нас установлен Windows x64 и сервер Firebird x64, а XAMMP это 32-х разрядное приложение. Соответственно библиотека fbclient.dll должна быть скомпилирована для той версии клиента (в данном случае XAMMP, точнее PHP в составе XAMMP), который используется для доступа к БД. 32-х разрядная версия библиотеки находится в каталоге WOW64 каталога установки Firebird т.е. берем файл C:\Program Files\Firebird\Firebird_2_5\WOW64\fbclient.dll и копируем в следующие пути:

    • в рабочий каталог PHP D:\xampp\php\
    • в SYSTEM32 C:\Windows\System32\. По идее копировать сюда не обязательно, но я использую билиотеку в других проектах и что бы не плодить копии по всей системе, копируем сюда.

    В некоторых источниках советуют скопировать в D:\xampp\apache\bin\, но в моем случае это ни на что не повлияло. Да и, по идее, не могло повлиять т.к. сервер Apache запускает PHP и ему самому никакие дополнительные библиотеки доступа не нужны.

    Рекомендую так же проверить наличие библиотеки PDO для доступа к Firebird, файл D:\xampp\php\ext\php_pdo_firebird.dll.

    Запускаем сервер Apache (см. рис. выше), нажимаем «Start» в консоли XAMMP. На данный момент неплохо убедиться, что драйвер PDO для Firebird появился в системе, я потратил целый день, пока понял, что драйвер не подключен. Система обработки ошибок YII2 в этом деле оказалась слабым помощником т.к. сообщала о другой ошибке в другом месте. Не загружался список таблиц в Model Generator gii, а перед этим была ошибка установки расширения для доступа к Firebird, поэтому связать ошибку с неподключенным драйвером PDO было не очевидно.

    Создаем файл test-fb.php в рабочем каталоге фреймворка YII2 D:\xampp\htdocs\yii\, в нем ишем код:

    Данный код выводит список подключенных в PHP драйверов PDO. Запускаем браузер и набираем в адресной строке URL localhost/yii/test-fb.php, в ответ получаем страничку со списком подключенных драйверов.

    firebird
    mysql
    sqlite

    Обязательно убеждаемся, что в списке есть драйвер firebird. Драйверы MySQL и SQLite всегда подключены по умолчанию.

    Установка расширений YII2 для доступа к Firebird

    Для для подключения к Firebird в YII2 существуют два расширения.

    • yii2-firebirddb от Sergey Rusakov. Судя по описанию представляет собой адаптацию расширения от YII1. Недостатком является то, что это сборка dev, а не stable, поэтому в дальнейшем придется менять «minimum-stability» в composer.json, что приведет к загрузке нестабильных версий других расширений YII2 при обновлении через Composer.
    • yii2-firebird от Edgard Lorraine Messias. Судя по исходникам данного расширения и тем же багам, это yii2-firebirddb от Sergey Rusakov, переведенная из ветки dev в ветку stable.

    Я опишу последовательно установку обоих расширений. Начну со второго расширения yii2-firebird т.к. оно имеет статус stable.

    Установка yii2-firebird

    Открываем файл D:\xampp\htdocs\yii\composer.json и находим в нем кусок кода:

    Добавляем в конец через запятую строчку «edgardmessias/yii2-firebird»: «*», получим:

    Обратите внимание, после добавленной строки запятой быть не должно т.к. она добавлена в конце массива и наличие запятой при выполнении Composer даст ошибку. Хотя сам PHP и допускает наличие запятой в конце списка элементов массива перед закрывающей скобкой, Composer это не допускает.

    Итак, мы указали Composer, что необходимо загрузить расширение yii2-firebird. Запускаем командную строку, делаем текущим каталог D:\xampp\htdocs\yii\ и даем последовательно две команды:

    composer update
    composer install

    Внимательно изучаем вывод Composer на предмет ошибок, проверяем наличие каталога D:\xampp\htdocs\yii\vendor\edgardmessias\yii2-firebird\. Расширение установлено.

    Настроим доступ к БД. В документации к yii2-firebird сказано, что необходимо изменить конфигурацию. Если внимательно изучить файл конфигурации D:\xampp\htdocs\yii\config\web.php, находим строку (примерно 40-я строка):

    из чего становится ясно, что редактировать настройки подключения к БД необходимо в файле D:\xampp\htdocs\yii\config\db.php. Открываем его и приводим к виду:

    Хочу обратить внимание на некоторые моменты:

    • в первой строке конфигурации указан класс Connection с пространством имен
    • в строке ‘dsn’ указан драйвер доступа firebird, так же кодировка БД должна быть указана в строке ‘dsn’
    • путь к БД указан через прямой слэш, тогда как в Windows пути принято указывать через обратные слеши. На самом деле нет разницы как указывать т.к. в D:\xampp\htdocs\yii\vendor\edgardmessias\yii2-firebird\src\PdoAdapter.php в конструкторе класса (строка 37) есть код:

    т.е. в строке dsn всегда делается замена обратных слешей на прямые.
    При использовании обратных слешей помните об экранировании символов в PHP, поэтому обратные слеши должны повторяться по 2 раза. т.е. строка dsn должна выглядеть так:

  • при подключении к локальной БД указывать localhost в dsn не обязательно, я просто показал как делать подключение к внешнему серверу по протоколу TCP/IP
  • Установка yii2-firebirddb

    Как я указал выше, yii2-firebirddb имеет статус dev, в связи с этим есть небольшие особенности установки этого расширения.


    Теперь в файл D:\xampp\htdocs\yii\composer.json в секцию «require» добавляем путь загрузки расширения yii2-firebirddb «srusakov/firebirddb»: «*» . А поскольку библиотека статуса dev, то над секцией «require» находим и меняем «minimum-stability»: «stable», на «minimum-stability»: «dev», . Получаем такой вид (обратите внимание на первую и последнюю строки):

    Мы указали Composer, что необходимо загрузить расширение yii2-firebirddb. Запускаем командную строку, делаем текущим каталог D:\xampp\htdocs\yii\ и даем последовательно две команды:

    composer update
    composer install

    Проверяем на отсутствие ошибок и наличие каталога D:\xampp\htdocs\yii\vendor\srusakov\firebirddb\. Расширение установлено.

    Замечание

    В документации к yii2-firebirddb сказано, что еще надо прописать путь к репозиторию для загрузки расширения. В моем случае это, кроме ошибки, ничего не дало, но на всякий случай опишу как это сделать.

    Сначала установите GIT для Windows. Скачать можно по ссылке https://git-scm.com/download/win. Перезапустите консоль командной строки что бы переменная окружения PATH обновилась. Проверьте в командной строке, что бы проходила команда

    git

    в ответ должна вывестись подсказка по использованию утилиты в командной строке.

    В файле D:\xampp\htdocs\yii\composer.json после закрывающей скобки раздела «require» пишем путь к репозиторию, получается:

    Обратите внимание на последние 4 строки. Дальше стандартно запускаем командную строку, делаем текущим каталог D:\xampp\htdocs\yii\ и даем последовательно две команды:

    composer update
    composer install

    Проверяем на отсутствие ошибок и наличие каталога D:\xampp\htdocs\yii\vendor\srusakov\firebirddb\. Расширение установлено.

    Открываем файл конфигурации подключения к БД D:\xampp\htdocs\yii\config\db.php, вносим изменения, получаем:

    Проверка работоспособности

    Заключение

    Установка поддержки Firebird для PHP
    \r\nДля установки поддержки Firebird необходимо остановить сервер Apache в XAMMP. Для этого открываем консоль XAMMP и проверяем, что бы напротив сервиса Apache стояла кнопка «Start» т.е. сервис не запущен, иначе нажимаем «Stop».
    \r\n
    \r\n
    \r\n
    \r\nОткрываем любым редактором файл конфигурации PHP D:\\xampp\\php\\php.ini и находим в нем строчку:
    \r\n
    \r\n

    ;extension=php_pdo_firebird.dll\n
    \r\nУбираем «;» в начале т.е. раскомментируем и сохраняем. Драйвер PDO, используемый YII2 для доступа к СУБД, включен. Однако так просто ничего не заработает, теперь надо скопировать стандартную библиотеку доступа к СУБД fbclient.dll . Тут необходимо быть внимательным т.к. у нас установлен Windows x64 и сервер Firebird x64, а XAMMP это 32-х разрядное приложение. Соответственно библиотека fbclient.dll должна быть скомпилирована для той версии клиента (в данном случае XAMMP, точнее PHP в составе XAMMP), который используется для доступа к БД. 32-х разрядная версия библиотеки находится в каталоге WOW64 каталога установки Firebird т.е. берем файл C:\\Program Files\\Firebird\\Firebird_2_5\\WOW64\\fbclient.dll и копируем в следующие пути:
    \r\n
    \r\n

      \r\n
    • в рабочий каталог PHP D:\\xampp\\php\\ \r\n
    • в SYSTEM32 C:\\Windows\\System32\\ . По идее копировать сюда не обязательно, но я использую билиотеку в других проектах и что бы не плодить копии по всей системе, копируем сюда. \r\n
      \r\nВ некоторых источниках советуют скопировать в D:\\xampp\\apache\\bin\\ , но в моем случае это ни на что не повлияло. Да и, по идее, не могло повлиять т.к. сервер Apache запускает PHP и ему самому никакие дополнительные библиотеки доступа не нужны.
      \r\n
      \r\nРекомендую так же проверить наличие библиотеки PDO для доступа к Firebird, файл D:\\xampp\\php\\ext\\php_pdo_firebird.dll .
      \r\n
      \r\nЗапускаем сервер Apache (см. рис. выше), нажимаем «Start» в консоли XAMMP. На данный момент неплохо убедиться, что драйвер PDO для Firebird появился в системе, я потратил целый день, пока понял, что драйвер не подключен. Система обработки ошибок YII2 в этом деле оказалась слабым помощником т.к. сообщала о другой ошибке в другом месте. Не загружался список таблиц в Model Generator gii, а перед этим была ошибка установки расширения для доступа к Firebird, поэтому связать ошибку с неподключенным драйвером PDO было не очевидно.
      \r\n
      \r\nСоздаем файл test-fb.php в рабочем каталоге фреймворка YII2 D:\\xampp\\htdocs\\yii\\ , в нем ишем код:
      \r\n
      \r\n

    Установка расширений YII2 для доступа к Firebird
    \r\nДля для подключения к Firebird в YII2 существуют два расширения.
    \r\n
    \r\n
      \r\n
    • yii2-firebirddb от Sergey Rusakov . Судя по описанию представляет собой адаптацию расширения от YII1. Недостатком является то, что это сборка dev , а не stable , поэтому в дальнейшем придется менять «minimum-stability» в composer.json , что приведет к загрузке нестабильных версий других расширений YII2 при обновлении через Composer . \r\n
    • yii2-firebird от Edgard Lorraine Messias . Судя по исходникам данного расширения и тем же багам, это yii2-firebirddb от Sergey Rusakov , переведенная из ветки dev в ветку stable. \r\n
      \r\nЯ опишу последовательно установку обоих расширений. Начну со второго расширения yii2-firebird т.к. оно имеет статус stable .
      \r\n
      \r\n

    Установка yii2-firebird
    \r\nОткрываем файл D:\\xampp\\htdocs\\yii\\composer.json и находим в нем кусок кода:
    \r\n
    \r\n

    . \n «require»: <\n "php": ">=5.4.0″,\n «yiisoft\u002Fyii2»: «>=2.0.5»,\n «yiisoft\u002Fyii2-bootstrap»: «*»,\n «yiisoft\u002Fyii2-swiftmailer»: «*»\n. \n
    \r\nДобавляем в конец через запятую строчку «edgardmessias\u002Fyii2-firebird»: «*» , получим:
    \r\n
    \r\n

    \n’db’ => require(__DIR__ . ‘\u002Fdb.php’),\n
    \r\nиз чего становится ясно, что редактировать настройки подключения к БД необходимо в файле D:\\xampp\\htdocs\\yii\\config\\db.php . Открываем его и приводим к виду:
    \r\n
    \r\n

    \n ‘edgardmessias\\db\\firebird\\Connection’,\n ‘dsn’ => ‘firebird:dbname=localhost:D:\u002FWORK\u002Fdatabase\u002FTBOT.GDB;charset=WIN1251’,\n ‘username’ => ‘SYSDBA’,\n ‘password’ => ‘masterkey’\n];\n
    \r\nХочу обратить внимание на некоторые моменты:
    \r\n
    \r\n

      \r\n
    • в первой строке конфигурации указан класс Connection с пространством имен \r\n
    • в строке ‘dsn’ указан драйвер доступа firebird, так же кодировка БД должна быть указана в строке ‘dsn’ \r\n
    • путь к БД указан через прямой слэш, тогда как в Windows пути принято указывать через обратные слеши. На самом деле нет разницы как указывать т.к. в D:\\xampp\\htdocs\\yii\\vendor\\edgardmessias\\yii2-firebird\\src\\PdoAdapter.php в конструкторе класса (строка 37) есть код:
      \r\n
      \r\n

    . \n public function __construct($dsn, $username, $password, $driver_options = [])\n <\n \u002F\u002F Windows OS paths with backslashes should be changed\n $dsn = str_replace("\\\\", "\u002F", $dsn);\n. \n
    \r\nт.е. в строке dsn всегда делается замена обратных слешей на прямые. \r\n
    При использовании обратных слешей помните об экранировании символов в PHP, поэтому обратные слеши должны повторяться по 2 раза. т.е. строка dsn должна выглядеть так:
    \r\n
    \r\n

    Dbase — Yii или БД?

    46 просмотра

    2 ответа

    8 Репутация автора

    У меня есть 2 модели в моей функции поиска, объединенные полем, которое я хочу создать ActiveDataProvider для своего GridView . Это то, что я до сих пор:

    Мой конфиг yii db:

    Model1 и Model2 находятся в db1

    И исключение базы данных сервера:

    таблица или представление не существует

    В моих моделях (1 и 2) я специально использую db1 соединение, но как я могу это сделать $unionQuery без использования $unionQuery->all(Yii::$app->db1) ?

    Это не работает.

    Ответы (2)


    плюса

    12251 Репутация автора

    Как я могу сделать это в $ unionQuery без использования $ unionQuery-> all (Yii :: $ app-> db1) .

    Ты не можешь. Соединение с БД должно быть указано при выполнении запроса.

    В вашем случае запрос выполняется на ActiveDataProvider уровне, поэтому вы должны установить ActiveDataProvider::$db свойство с правильным подключением БД.

    Автор: rob006 Размещён: 21.04.2020 02:51

    плюса

    8 Репутация автора

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

    Yii2. Запись данных в БД. Часть 2

    Метод save() может вставить или обновить строку данных в зависимости от состояния ActiveRecord объекта. Если объект создан с помощью оператора new , вызов метода save() приведёт к вставке новой строки данных. Если же объект был получен с помощью запроса на получение данных, вызов save() обновит строку таблицы, соответствующую объекту ActiveRecord.

    Различать два состояния ActiveRecord объекта можно с помощью проверки значения его свойства isNewRecord . Это свойство также используется внутри метода save() :

    Т.к. класс yii\db\ActiveRecord наследует класс yii\base\Model , он обладает такими же возможностями валидации данных. Можно объявить правила валидации, переопределив метод rules() и осуществлять валидацию данных посредством вызовов метода validate() .

    При вызове метода save() , по умолчанию он автоматически вызывает метод validate() . Только после успешного прохождения валидации происходит сохранение данных; в ином случае метод save() просто возвращает false , и для получения сообщения об ошибках можно проверить свойство errors .

    Давайте посмотрим, как можно использовать методы insert() , update() и delete() . У нас уже есть форма обратной связи и мы умеем сохранять сообщения в базу данных. Добавим возможность просмотра списка всех сообщений и возможность их редактирования и удаления.

    Модель остается без изменений:

    Контроллер содержит action -ы:

    • actionIndex() — список всех сообщений
    • actionInsert() — добавляет новое сообщение
    • actionUpdate() — позволяет обновить сообщение
    • actionDelete() — позволяет удалить сообщение

    И два view-шаблона — для списка сообщений и для формы добавления и редактирования:

    Часто бывает необходимым обновить или удалить несколько записей по одному условию. Для этого есть методы updateAll() и deleteAll() .

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

    1. Помимо создания самой базы данных, нужно настроить подключение к ней в конфигурационном файле config/db.php

    2. Создать класс модели. Это должен быть класс-потомок от Active Record, то есть он будет наследоваться от ActiveRecord.

    Имя этого класса может совпадать (если все символы считать в нижнем регистре) с названием таблицы, чтобы Yii мог связать их. Либо же можно переопределить метод tableName() в этом классе, где явно задать название таблицы.

    AR (Active Record) — мощный способ работы с базой данных в ООП стиле.

    DAO (Data Access Objects) — более низкоуровневый способ доступа к БД. В этом способе в основном нужно будет использовать чистый SQL, и ещё подстраиваться по синтаксису к разным типам баз данных, в отличие от Active Record, в котором в Yii уже встроено взаимодействие для разных типов БД

    записать данные в БД в yii2

    У меня есть SIGNUP форма, регистрация нового пользователя. Но когда входные данные все поля кроме арматуры один (имя пользователя) сохранение в БД. Я не могу понять, почему. Помоги мне.

    Вот мой код из SignupForm

    Код из Новеньких (вида)

    код от контроллера по умолчанию

    код от пользователя (модель)

    Это потому , что у вас есть username атрибут непосредственно объявленный в User модели здесь:

    Удалите его, поэтому он может быть сопоставлен с помощью ActiveRecord.

    Цукерберг рекомендует:  Scrapy создаём краулерпарсер на Python с нуля
    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих