Я распустил этот проект, потому что это слишком большая работа, хотя поначалу идея казалась глупой, она действительно работала, пока я не обнаружил множество проблем с нумерацией страниц, и с точки зрения производительности я думаю, что лучше всего подойдет кластеризация. Используйте это на свой страх и риск, было весело создавать этот проект.
Это бесплатная , простая в использовании , легкая и мощная библиотека PHP, которая позволяет подключаться к нескольким базам данных MySQL с помощью PDO. Я создал это специально для MySQL, но считаю, что это будет работать с PostgreSQL, MariaDB, CouchDB и т. д. Помните, это для баз данных SQL, поэтому оно не будет работать с системами управления базами данных, такими как MongoDB и Apache Cassandra.
✔ Подключайтесь к нескольким базам данных MySQL с помощью PDO.
✔ Извлекать строки из нескольких баз данных.
✔ Эффективно выполняйте запросы на вставку, выполняя только один запрос вместо добавления новых строк во все таблицы в каждой базе данных.
✔ Легко сортируйте, ограничивайте и управляйте результатами/строками.
✔ Легко масштабируйтесь, просто добавляя больше баз данных (нет необходимости использовать подчиненные, главные или кластеры).
✔ Генерируйте действительно уникальные идентификаторы (называемые MDGUID).
➔ PHP 7+ и Apache/Nginx (использует функции PHP 7 и выше).
➔ MySQL 5.7+ (для пояснения: MySQL 5.7 работает нормально, поэтому подойдет любая версия выше MySQL 5.7).
➔ Драйвер базы данных, совместимый с PDO (подробнее об этом читайте здесь).
Вы можете использовать MultiDatabasePDO для личного, образовательного и коммерческого использования на следующих условиях:
➔ Вы не продаете, не передаете и не размещаете (оригинальные или отредактированные копии) этой библиотеки другим пользователям, вы должны связать их с этим репозиторием.
➔ Вы не меняете комментарий в файле и не удаляете его, это заставит меня думать, что вы хотите объявить его своим.
1. ПОДКЛЮЧЕНИЕ К ВАШИМ БАЗАМ!
Прежде чем начать, убедитесь, что вы понимаете основы PDO. Просто загрузите последнюю версию и включите файл с именем MultiDatabasePDO .php
, который автоматически включит все дополнительные классы. Ваш установочный код должен выглядеть так:
require " ./ MultiDatabasePDO / MultiDatabasePDO .php " ;
$ multiPDO = new WulfGamesYT MultiDatabasePDO MultiDatabasePDO ([
[ " mysql " , " 1.1.1.1 " , " database_1 " , " username " , " password " ],
[ " mysql " , " 2.2.2.2 " , " database_2 " , " username " , " password " ]
]);
Теперь нам нужно проверить наличие ошибок с помощью простой функции hasAnyErrors()
. Вы можете перечислить неудачные соединения с помощью функции getFailedConnections()
.
if ( $ multiPDO -> hasAnyErrors ()) {
error_log ( " Error connecting to database(s): " . $ multiPDO -> getFailedConnections ());
exit ( " Error connecting to our main databases! Please try again later. " );
}
2. ЧИТАЙТЕ ВИКИ И ИСПОЛЬЗУЙТЕ ЭТУ БИБЛИОТЕКУ ПРАВИЛЬНО!
Далее я бы рекомендовал прочитать документацию на вики, чтобы понять, что делает каждая функция. Кроме того, важно знать, что между этой библиотекой и стандартной библиотекой PDO есть некоторые различия, а именно:
execute()
, используйте bindValue()
bindValues()
.ORDER BY
, LIMIT
или OFFSET
в своих запросах SQL, вместо этого обратитесь к этому руководству.AUTO INCREMENT
для столбцов. Вместо этого, если у вас есть столбец с идентификатором, используйте эту функцию. 3. НАСТРОЙКА БАЗ И ТАБЛИЦ!
Если вы планируете использовать MultiDatabasePDO , вы должны убедиться, что все ваши таблицы из каждой базы данных, к которой вы подключаетесь, имеют одинаковую структуру:
Например, представьте, что у нас есть следующие две таблицы из двух разных баз данных, обе имеют одинаковую структуру и имена. Каждый пример в этом README ниже использует эти таблицы. На самом деле ваши таблицы будут иметь тысячи, если не миллионы строк, прежде чем вам понадобится рассмотреть возможность использования MultiDatabasePDO (или если вы когда-нибудь захотите подготовиться к масштабированию своего веб-приложения).
Таблица «Пользователи» из базы данных 1.
Идентификатор (целое) | Имя пользователя (текст) | PassHash (текст) | Электронная почта (текст) | Имя (текст) | Фамилия (текст) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | Лиам | Аллен |
2 | ИндианаДжонс55 | npxCn975RSaP | [email protected] | Индиана | Джонс |
3 | ЯБойСтолFlipper69 | BT7V2U6VJv2d | [email protected] | Стив | Джонс |
Таблица «Пользователи» из базы данных 2.
Идентификатор (целое) | Имя пользователя (текст) | PassHash (текст) | Электронная почта (текст) | Имя (текст) | Фамилия (текст) |
---|---|---|---|---|---|
4 | правда чувак | 6XBmD4bzGP87 | действительно чувак@yahoo.com | Лиам | Мейсон |
5 | АдДаБой | LeyTpTwvvMUM | [email protected] | Джули | Кросби |
Чтобы выбрать строки из ВСЕХ баз данных и ВСЕХ таблиц, вы можете просто сделать, как обычный PDO в PHP:
$ selectQuery = $ multiPDO -> prepare ( " SELECT ID, Username, Email FROM Users WHERE Username = :username " );
$ selectQuery -> bindValue ( " :username " , " WulfGamesYT " );
$ selectQuery -> execute ();
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Скажем, если у нас есть форма, и вы можете отправить информацию в свой PHP-файл, и вы хотите вставить 1 новую запись в таблицу из базы данных под названием «Пользователи», все, что вам нужно сделать, это следующее. Обратите внимание, что оно будет вставлено во вторую таблицу в приведенных выше примерах таблиц, поскольку в ней наименьшее количество строк. Вместо того, чтобы вручную вводить идентификатор и использовать тип данных int в своих таблицах, используйте generateMDGUID()
приведенную ниже.
$ longSQL = " INSERT INTO Users VALUES (6, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
Обратите внимание, что в методеexecute execute()
который мы вставили в два параметра, это необходимо для вставки новых строк, поскольку оно сообщает классу, что мы вставляем (путем передачи: true) новую строку в таблицу с именем «Пользователи». Не указывайте ненадежный пользовательский ввод в качестве второго параметра, поскольку может произойти SQL-инъекция.
По сути, это то же самое, что и выполнение запроса SELECT: при этом будут обновлены ВСЕ таблицы во ВСЕХ базах данных, которые соответствуют предложению WHERE, если оно указано, например:
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
Теперь, если мы запустим запрос SELECT для ВСЕХ таблиц с именем «Пользователи», мы увидим обновленную строку.
Опять же, все, что нам нужно сделать, это:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
Теперь, если мы запустим запрос SELECT для ВСЕХ таблиц с именем «Пользователи», мы увидим обновленную строку.
Важно отметить, что вы не можете использовать ORDER BY
, LIMIT
или OFFSET
в своих SQL-запросах, чтобы упорядочить все строки из каждой базы данных, а только строки в этой текущей таблице в одной базе данных. Вместо этого вам придется использовать следующие функции, доступные в MultiDatabasePDO , которые упрощают организацию окончательных результатов/строк.
Упорядочение результатов (вместо «ORDER BY»): вы можете упорядочить результаты так же, как в запросах SQL с «ASC» или «DESC», переданными во второй параметр метода sortBy()
.
Вот как вы упорядочиваете числовые столбцы:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "ID" column in descending order.
$ selectQuery -> sortBy ( " ID " , " DESC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Вот как вы упорядочиваете столбцы строк/объектов:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "Username" column in ascending order.
$ selectQuery -> sortBy ( " Username " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Вы можете заказать несколько столбцов или несколько раз, если хотите. В приведенном ниже примере мы упорядочим столбец с именем «Имя» в порядке убывания, затем столбец с именем «Фамилия». При этом пользователи будут перечислены в таблице в алфавитном порядке; если у них одинаковые имена, они также будут упорядочены по фамилии. Сначала поместите наименее важный столбец порядка, а затем самый важный в конце, как вы можете видеть в коде:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort both the columns.
$ selectQuery -> sortBy ( " LastName " , " ASC " );
$ selectQuery -> sortBy ( " FirstName " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
Вместо AUTO INCREMENT
или если вам нужен способ создания действительно уникальных идентификаторов GUID для нескольких баз данных, вы можете использовать нашу функцию под generateMDGUID()
. Ниже приведено руководство о том, как они работают и как они гарантируют 100% уникальность, а также пример использования этой функции при вставке новых строк в ваши таблицы.
Как MDGUID работает и гарантирует уникальность:
Пример:
//Here we generate the MDGUID.
$ mdguid = $ multiPDO -> generateMDGUID ();
$ longSQL = " INSERT INTO Users VALUES (:mdguid, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :mdguid " => $ mdguid ,
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
Если вам нужно задать вопрос, свяжитесь со мной в Твиттере.
Твиттер: https://www.twitter.com/WulfGamesYT
Если вам нравится эта библиотека, подумайте о том, чтобы отметить ее звездочкой и поделиться ею с другими разработчиками, которым нравится PHP и MySQL! Следите за обновлениями и обязательно сообщайте мне о любых обнаруженных ошибках. Спасибо за чтение!