Как связь таблиц в mysql через php
БлогNot. PHP: связь «многие ко многим» между двумя таблицами
PHP: связь «многие ко многим» между двумя таблицами
Задача будет не слишком отличаться от аналогичной для «оффлайновой» СУБД вроде ACCESS, по крайней мере, мы по-прежнему реализуем связь «многие ко многим» как пару связей «один ко многим».
При использовании связки PHP+MySQL нам достаточно продемонстрировать, как извлекать категории для заданного объекта и объекты, относящиеся к заданной категории, а исключение дублирующихся связей можно сделать просто с помощью дополнительного запроса. Структура БД может быть в простейшем случае такой (выполните этот запрос в PHPMyAdmin после создания пустой базы с именем my ):
Заодно добавлено несколько записей и связей, чтоб было что выводить.
Напишем скрипт, показывающий получение всех объектов категории, всех категорий, имеющихся у объекта, а также добавление/удаление связей.
Примечания к листингу (*)
1. Не забудьте скорректировать данные доступа к БД, заданные константами define
2. Во избежание дублирования кода здесь лучше сделать функцию-обработчик допустимых значений параметров $cat и $obj
3. В нагруженных скриптах с потенциально большими объёмами данных не стоит делать запросов к двум, а тем более, к трём таблицам. Старайтесь всегда обойтись запросами типа «выбрать все объекты данной категории» или «выбрать все категории для данного объекта»
P.S. Ниже показана более современная версия скрипта, рассчитанная на работу с PHP7 и MySQLi вместо MySQL, проверял в XAMPP. Структура самой БД не изменилась, только теперь предполагается, что она создавалась в кодировке Юникода utf-8 (тип сопоставления utf8_general_ci):
- до версии PHP 5.3 включительно СУБД по умолчанию был MySQL;
- с версии 5.4 и в PHP 7.X СУБД называется MySQLi, формат БД не менялся, имена функций для работы с БД – да (везде передаётся идентификатор соединения).
utf-8 с игнорированием регистра символов при сравнении
Скриншот приложения в работе
Как связать таблицы в базе данных (PHP, MySQLi)
Делаю БД для менеджера, на сайте нужно (создавать и удалять категории/товары). Никак не могу придумать как связать на MySQLi эти таблицы. Вот пример:


В каждой ветке. глубина не ограничена. Например, в ветке быт товары будет 2 под таблиц а в ветке моб телефоны — 4 под таблицы.
Так вот, сам вопрос: При выводе в PHP создается меню из главного списка, и дальше переход к след таблицам., то есть нужно как-то связать записи одной таблицы с другой. я думаю может в таблицах с Категориями, создавать отдельный столбец, и туда записывать ссылки на его дочерную таблицу? а таблицам генерировать какое-то уникальное имя
@Юра Сучко, то, как вы поставили себе задачу, говорит, что у вас только все начинается. Тогда вам стоит начать с того, чтобы составить список действий, которые будут выполняться приложениями (браузером или мобильным приложением, не важно). По данному списку вы увидите какие данные и в каком виде вам понадобятся. Например (с примерами запросов):
Поиск по каталогу. Вам понадобится весь список товаров и при этом желательно чтоб список не надо было собирать из разных мест.
Отображение категорий и товаров в определенной категории, желательно универсально относительно родительской категории.
Отображение корзины, в которой могут быть товары из любой категории
Добавление товаров в определенную категорию, или категории в категорию, желательно без изменения структуры бд.
Данная структура будет удобной и для админки, где редактировать каталог, так и для пользователей (десктопных или мобильных), ибо данные, которые нужны будут пользователю, будут возвращаться в том объеме, который вы уменьшить не сможете при всем своем желании.
Мобильное приложение, не знаю какое у вас предполагается, может быть таким:
Взаимодействие PHP и MySQL
После установки и настройки базы данных MySQL можно приступать к написанию сценариев PHP для взаимодействия с базой данных. В настоящей статье приведено описание всех основных функций, позволяющих передавать данные в прямом и обратном направлениях от веб-сайта к базе данных. Информация, касающаяся создания базы данных MySQL, приведена в предыдущей статье «Проектирование базы данных», в примерах ниже мы будем использовать созданные таблицы тестовой базы users (если не хотите прорабатывать примеры из предыдущей статьи можете воспользоваться дампом базы данных users).
Неважно, насколько простые или сложные у вас сценарии, если они общаются с базой данных, они начинаются с одних и тех же нескольких действий:
Подключение к установленной базе данных MySQL.
Использование команды USE в отношении нужной базы данных MySQL.
Отправка SQL базе данных.
Действия 3, 4 и 5 будут изменяться в зависимости от характера выполняемой работы. Сценарий, создающий таблицы, немного отличается от сценария, который ведет поиск в существующих таблицах. Но первые два действия — подключение к MySQL и использование нужной базы данных — всегда одни и те же, независимо от предназначения сценария.
Расширения mysql и mysqli
PHP предлагает на выбор разработчику два расширения для работы с базами данных MySQL. Расширение mysql предоставляет процедурный интерфейс и предназначено для использования с MySQL версии 4.1.3 или более ранними версиями. Его также можно использовать и с более свежими версиями СУБД, но в этом случае многие возможности сервера, появившиеся после версии 4.1.3, будут недоступны программисту.
Расширение mysqli, или как его еще называют улучшенное (improved) MySQL расширение, было разработано, чтобы дать возможность программистам в полной мере воспользоваться функционалом MySQL сервера версий 4.1.3 и выше. Расширение mysqli включается в поставку PHP версий 5 и выше. mysqli имеет ряд преимуществ и усовершенствований по сравнению с mysql, которые заключаются в следующем:
Поддержка подготавливаемых запросов;
Улучшенные возможности отладки;
Поддержка встроенного сервера.
Наравне с объектно-ориентированным расширение предоставляет и процедурный интерфейс. В последующих примерах я буду использовать расширение mysqli, т.к. mysql является устаревшим.
Подключение к базе данных MySQL
Сначала нужно сообщить вашему PHP-сценарию, как нужно подключиться к базе данных. Этот процесс, по сути, сообщает PHP, что нужно делать то же самое, что вы выполняли, начиная работу со своим клиентом командной строки MySQL. Чтобы подключиться к базе данных, PHP нужно будет передать следующую информацию: имя хоста вашей базы данных, имя пользователя, пароль и имя базы данных.
Запустите свой текстовый редактор и создайте новый сценарий, назвав его connect.php. Сценарий должен быть как можно проще, потому что вам нужно всего лишь подключиться к своей базе данных, воспользоваться с помощью команды USE необходимой базой данных и запустить пробный SQL-запрос, чтобы убедиться, что все работает. Введите в сценарий следующие строки:
Если база данных запускается на той же машине, на которой находятся PHP и файлы обслуживания сети, хост-именем базы данных будет, как правило, localhost, которое означает «локальная машина». После создания этого файла его удобно будет подключать на страницах сайта:
Вот так все просто! И хотя здесь есть несколько новых для вас команд, вы, наверное, уже знаете почти все, что происходит в этом сценарии. Сначала в нем используется новая команда: mysqli_connect. Она просто получает имя хоста базы данных, имя пользователя, пароль, имя базы данных и осуществляет подключение. Происходит все то же самое, как и при запуске окна командной строки mysql и подключении к удаленной базе данных. В случае успешного выполнения этой команды она возвращает ресурс, содержащий ссылку на подключение к базе данных; если установить подключение не удалось функция mysqli_connect() возвращает значение false — мы проверяем это в условном операторе и, если соединения нет, прекращаем дальнейшее выполнение сценариев и выводим сообщение об ошибке.
Функция mysqli_connect_errno() возвращает код ошибки, а mysqli_connect_error() — текст ошибки. Если инструкция mysqli_connect сумела создать подключение без всяких проблем, она возвращает это подключение, PHP пропустит строку с инструкцией die, а затем выведет строку «Вы подключились к MySQL!».
Выбор кодировки
Довольно часто встречается ситуация, когда сайт создается в одной кодировке, а база данных использует другую, например в базе данных установлена кодировка utf8_general_ci, а на сайте — utf8. Получается, что содержимое (в том числе и навигация сайта выводится в кодировке utf8, а информация из базы данных — в utf8_general_ci). В результате одновременно прочитать вывод из базы данных и страницу сайта не удастся, кодировки-то разные. В качестве примера добавьте к исходной странице следующий сценарий (все дополнительные функции которые здесь используются будут описаны ниже):
В моем случае вывод окажется следующем:
«Кракозябры» при выводе данных из базы с другой кодировкой
В этом случае нужно установить требуемую кодировку для базы данных. Это можно сделать с помощью следующего запроса, который должен быть первым запросом после подключения к базе данных (измените файл connect.php):
В результате будет получен корректный вывод данных:
Правильное переключение кодировки
Вывод SQL-результатов
После подключения к нужной базе данных вы должны увидеть, с чем именно можно работать. В качестве примера создадим простой сценарий для для просмотра таблиц, доступных в вашей базе данных:
Здесь используется еще одна новая для вас функция перехода от PHP к MySQL: mysqli_query(). При выполнении команды mysqli_query() фактически происходит выборка данных из базы данных и передача интерпретатору PHP своего рода квитанции, содержащей информацию о состоянии выполнения операции. К этому моменту данные передаются во временное хранилище, которое не является непосредственно доступным ни из среды MySQL, ни из среды PHP; это хранилище можно рассматривать как своего рода промежуточную область. Необходимые данные уже на месте, но ожидают того момента, когда поступит команда на их передачу пользователю. Чтобы данные стали полностью доступными в среде PHP, требуется одна из функций выборки с префиксом mysqli_fetch:
| Функция | Описание |
|---|---|
| mysqli_fetch_row() | Возвращает строку в виде массива с числовым индексом. |
| mysqli_fetch_object() | Возвращает строку в виде объекта. |
| mysqli_fetch_array() | Возвращает строку в виде ассоциативного массива. |
В нашем примере мы использовали функцию mysqli_fetch_row() позволяющую осуществить выборку из базы данных информации, содержащейся в указанных строках, таким образом, чтобы каждая строка вывода содержала данные из одной строки или информацию, связанную с уникальным идентификатором (если таковой имеется). Для доступа к элементам массива с числовым индексом применяются обозначения в виде целых чисел в квадратных скобках, называемых смещениями полей. Следует помнить, что такие смещения всегда начинаются с целочисленного нуля. А если в ходе доступа отсчет начат с единицы, то будет пропущено значение из первого столбца.
Объектно-ориентированный интерфейс mysqli
В представленном выше примере мы использовали процедурный стиль программирования с использованием расширения mysqli. Однако, одним из главных его преимуществ является то, что он поддерживает объекты, которые позволяют легко сгруппировать функции по цели их применения. В следующей таблице представлены все объекты расширения mysqli:
| Класс | Описание |
|---|---|
| mysqli | Представляет связь между PHP и базой данных MySQL |
| mysqli_driver | Позволяет выполнять остановку-запуск встроенного сервера |
| mysqli_result | Представляет результирующий набор, полученный из запроса в базу данных |
| mysqli_sql_exception | Специальный класс исключений mysqli |
Эти классы содержат огромное количество свойств и методов которые вы можете изучить по приведенной ссылке — MySQLi Summary. Я же перепишу предыдущий пример с выводом таблиц в объектно-ориентированном стиле (немного усложним этот пример и выведем данные таблиц):
Файл connect.php Исходный файл
В результате получим полную структуру базы данных users:
Пример использования классов mysqli — вывод структуры базы данных Проектирование базы данных Базы данных и веб-формы