alexgroup-studio.ru – Программы, безопасность, обзоры, новости

Программы, безопасность, обзоры, новости

Работа с базой данных в php. Создание соединения с БД MySQL разными способами Соединение с mysql в php

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

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

  • Подключение к установленной базе данных MySQL.
  • Использование команды USE в отношении нужной базы данных MySQL.
  • Отправка SQL базе данных.
  • Получение результатов.
  • Обработка результатов.
  • Действия 3, 4 и 5 будут изменяться в зависимости от характера выполняемой работы. Сценарий, создающий таблицы, немного отличается от сценария, который ведет поиск в существующих таблицах. Но первые два действия - подключение к MySQL и использование нужной базы данных - всегда одни и те же, независимо от предназначения сценария.

    Подключение к базе данных MySQL

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

    Для подключения к базе данных мы будем использовать PDO - PHP Data Objects. При его использовании можно не бояться , это возможно благодаря подготовленным параметрам, но об этом чуть позже.

    Это важно! Если в интернете вы найдёте урок, где будет использоваться mysqli_connect или mysql_connect - смело закрывайте его, так писали 10 лет назад.

    Для создания подключения нужно создать новый объект класса PDO. В качестве аргументов в конструктор нужно передать DSN - это строка с указанием драйвера (в нашем случае - mysql), хоста и именем базы данных. Второй аргумент - имя пользователя (в нашем случае - root). Третий - пароль (в наше случае пустой).

    Перед уроком я создал базу users, а в ней табличку data со следующей структурой:

    CREATE TABLE `data` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `year` char(4) DEFAULT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8; $dbh = new \PDO("mysql:host=localhost;dbname=users;", "root", "");

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

    $dbh->exec("SET NAMES UTF8");

    После этого мы можем выполнять запросы. Выглядит это так:

    $stm = $dbh->prepare("INSERT INTO data (`name`, `year`) VALUES (:name, :year)"); $stm->bindValue("name", "Имя"); $stm->bindValue("year", "1703"); $stm->execute();

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

    Давайте выполним этот скрипт и посмотрим на то, что появилось в базе.

    Давайте обновим скрипт ещё несколько раз и посмотрим в базу снова.

    Выборка из базы с помощью PHP

    Давайте теперь прочитаем данные, которые мы записали. Схема та же, только подготавливаем SELECT-запрос.

    $stm = $dbh->prepare("SELECT * FROM `data`"); $stm->execute();

    Запрос выполнился, но это ещё не всё. Теперь нужно получить результат. Это делается так:

    $allUsers = $stm->fetchAll(); var_dump($allUsers);

    В результате мы получим массив этих записей:

    Давайте выведем их более красиво, добавим немножко HTML.

    $stm = $dbh->prepare("SELECT * FROM `data`"); $stm->execute(); $allUsers = $stm->fetchAll(); ?>

    idИмяГод

    Ну вот, совершенно другое дело!

    Если в SELECT-запросе нужно добавить какие-то параметры, то делается это аналогично:

    $stm = $dbh->prepare("SELECT * FROM `data` WHERE id = :id"); $stm->bindValue("id", 1); $stm->execute(); $users = $stm->fetchAll(); var_dump($users);

    Теперь вернётся только один пользователь, подошедший под условия запроса.

    СУБД MySQL - одна из множества баз данных, поддерживаемых в PHP. Система MySQL распространяется бесплатно и обладает достаточной мощностью для решения реальных задач.

    Краткое введение в MySQL

    SQL - это аббревиатура от слов Structured Query Language , что означает структурированный язык запросов. Этот язык является стандартным средством для доступа к различным базам данных.

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

    Для работы с базами данных удобно пользоваться средством, входящее в комплект Web-разработчика: Denwer phpMyAdmin . Здесь можно создать новую базу данных, создать новую таблицу в выбранной базе данных, заполнить таблицу данными, а также добавлять, удалять и редактировать данные.

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


    Каждый столбец после своего типа данных содержит и другие спецификаторы:

    Тип Описание
    NOT NULL Все строки таблицы должны иметь значение в этом атрибуте. Если не указано, поле может быть пустым (NULL)
    AUTO_INCREMENT Специальная возможность MySQL, которую можно задействовать в числовых столбцах. Если при вставке строк в таблицу оставлять такое поле пустым, MySQL автоматически генерирует уникальное значение идентификатора. Это значение будет на единицу больше максимального значения, уже существующего в столбце. В каждой таблице может быть не больше одного такого поля. Столбцы с AUTO_INCREMENT должны быть проиндексированными
    PRIMARY KEY Столбец является первичным ключом для таблицы. Данные в этом столбце должны быть уникальными. MySQL автоматически индексирует этот столбец
    UNSIGNED После целочисленного типа означает, что его значение может быть либо положительным, либо нулевым
    COMMENT Название столбца таблицы

    Создание новой базы данных MySQL CREATE DATABASE .

    CREATE DATABASE IF NOT EXISTS `base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin

    Создание новой таблицы осуществляется при помощи SQL-команды CREATE TABLE . Например, таблица books для книжного магазина будет содержать пять полей: ISBN, автор, название, цена и количество экземпляров:

    CREATE TABLE books (ISBN CHAR(13) NOT NULL, PRIMARY KEY (ISBN), author VARCHAR(30), title VARCHAR(60), price FLOAT(4,2), quantity TINYINT UNSIGNED); Чтобы избежать сообщения об ошибке, если таблица уже есть необходимо изменить первую строчку, добавив фразу "IF NOT EXISTS": CREATE TABLE IF NOT EXISTS books ...

    Для создания автообновляемого поля с текущей датой типа TIMESTAMP или DATETIME используйте следующую конструкцию:

    CREATE TABLE t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

    Добавление данных в эту таблицу осуществляется при помощи SQL-команды INSERT . Например:

    INSERT INTO books (ISBN, author, title, price, quantity) VALUES ("5-8459-0184-7", "Зандстра Мэт", "Освой самостоятельно PHP4 за 24 часа", "129", "5");

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

    Символ * означает, что необходимы все поля. Например:

    SELECT * FROM books;

    Для получения доступа только к некоторому полю следует указать его имя в инструкции SELECT . Например:

    SELECT author, title, price FROM books;

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

    SELECT * FROM books WHERE price % Соответствует любому количеству символов, даже нулевых
    _ Соответствует ровно одному символу

    Для того, чтобы строки, извлеченные по запросу, перечислялись в определенном порядке, используется конструкция ORDER BY . Например:

    SELECT * FROM books ORDER BY price;

    По умолчанию порядок сортировки идет по возрастанию. Изменить порядок сортировки на обратный можно с помощью ключевого слова DESC :

    SELECT * FROM books ORDER BY price DESC;

    Сортировать можно и по нескольким столбцам. Вместо названий столбцов можно использовать их порядковые номера:

    SELECT * FROM books ORDER BY 4, 2, 3;

    Для изменения ранее записанных в таблицу значений нужно воспользоваться командой UPDATE . Например, цену всех книг повысили на 10%:

    UPDATE books SET price = price * 1.1;

    Конструкция WHERE ограничит работу UPDATE определенным строками. Например:

    UPDATE books SET price = price * 1.05 WHERE price

    Для удаления строк из базы данных используется оператор DELETE . Ненужные строки указываются при помощи конструкции WHERE . Например, какие-то книги проданы:

    DELETE FROM books WHERE quantity = 0;

    Если нужно удалить все записи

    TRUNCATE TABLE table_name

    Для полного удаления таблицы используется:

    DROP TABLE table_name

    Связь PHP с базой данных MySQL

    Поработав с phpMyAdmin над созданием базы данных, можно приступить к подключению этой базы данных к внешнему Web-интерфейсу.

    Чтобы получить доступ к базе данных из Web, используя PHP, надо сделать следующие основные шаги:

    • Подключение к серверу MySQL.
    • Выбор базы данных.
    • Выполнение запроса к базе данных:
      • добавление ;
      • удаление ;
      • изменение ;
      • поиск ;
      • сортировка .
    • Получение результата запроса.
    • Отсоединение от базы данных.

    Для подключения к серверу базы данных в PHP есть функция mysql_connect() . Ее аргументы: имя компьютера, имя пользователя и пароль. Эти аргументы можно опустить. По умолчанию имя компьютера = localhost , тогда имя пользователя и пароль не требуется. Если PHP используется в сочетании с сервером Apache, то можно воспользоваться функцией mysql_pconnect() . В этом случае соединение с сервером не исчезает после завершения работы программы или вызова функции mysql_close() . Функции mysql_connect() и mysql_pconnect() возвращают идентификатор подключения, если все прошло успешно. Например:

    $link = mysql_pconnect (); if (!$link) die ("Невозможно подключение к MySQL");

    После того, как соединение с сервером MySQL установлено, нужно выбрать базу данных. Для этого используется функция mysql_select_db() . Ее аргумент: имя базы данных. Функция возвращает true , если указанная база данных существует и доступ к ней возможен. Например:

    $db = "sample"; mysql_select_db ($db) or die ("Невозможно открыть $db");

    Для добавления, удаления, изменения и выбора данных нужно сконструировать и выполнить запрос SQL. Для этого в языке PHP существует функция mysql_query() . Ее аргумент: строка с запросом. Функция возвращает идентификатор запроса.

    Пример 1 Добавление записи в таблицу

    При каждом выполнении примера 1 в таблицу будет добавляться новая запись, содержащая одни и те же данные. Разумеется имеет смысл добавлять в базу данные, введенные пользователем.

    В примере 2.1 приведена HTML-форма для добавления новых книг в базу данных.

    Пример 2.1 HTML-форма добавления новых книг
    ISBN
    Автор
    Название
    Цена
    Количество

    Результаты заполнения этой формы передаются в insert_book.php.

    Пример 2.2 Программа добавления новых книг (файл insert_book.php)

    В примере 2.2 введенные строковые данные обработаны функцией addslashes() . Эта функция добавляет обратные слеши перед одинарными кавычками ("), двойными кавычками ("), обратным слешем (\) и null-байтом. Дело в том, что по требованиям систаксиса запросов баз данных такие символы дожны заключаться в кавычки.

    Для определения количества записей в результате запроса используется функция mysql_num_rows() .

    Все записи результата запроса можно просмотреть в цикле. Перед этим с помощью функции mysql_fetch_ для каждой записи получают ассоциативный массив.

    В примере 3.1 приведена HTML-форма для поиска определенных книг в базе данных.

    Пример 3.1 HTML-форма поиска книг Ищем по:
    Автору Названию ISBN
    Что ищем:

    Результаты заполнения этой формы передаются в search_book.php.

    Пример 3.2 Альтернативный вариант Программа поиска книг (файл search_book.php)

    Итак, как работает архитектура Web-баз данных:

  • Web-браузер пользователя выдает HTTP-запрос определенной Web-страницы. Например, пользователь, используя HTML-форму, ищет все книги о PHP. Страница обработки формы называется search_book.php.
  • Web-сервер принимает запрос на search_book.php, извлекает этот файл и передает на обработку механизму PHP.
  • PHP выполняет соединение с MySQL-сервером и отправляет запрос.
  • Сервер принимает запрос к базе данных, обрабатывает его и отправляет результат (список книг) обратно механизму PHP.
  • Механизм PHP завершает выполнение сценария, форматирует результат запроса в HTML. После этого результат в виде HTML возвращается Web-серверу.
  • Web-сервер пересылает HTML в браузер, и пользователь имеет возможность просмотреть запрошенный список книг.
  • Использование механизма транзакций

    Использование механизма транзакция на примере как передать деньги от одного человека другому

    If(mysql_query ("BEGIN") && mysql_query ("UPDATE money SET amt = amt - 6 WHERE name = "Eve"") && mysql_query ("UPDATE money SET amt = amt + 6 WHERE name = "Ida"") && mysql_query ("COMMIT")){ echo "Успешно"; }else{ mysql_query ("ROLLBACK"); echo "Не успешно"; }

    SELECT … FOR UPDATE

    Если Вы запускаете несколько процессов, которые делают select запрос к одной и той же таблице, то они могут выбрать одну и ту же запись одновременно.

    Чтобы избежать вышеупомянутой ситуации необходимо выполнить не просто SELECT запрос, а его расширенную версию, о которой многие и не подозревают: SELECT … FOR UPDATE.

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

    Однако не всё так просто. Вам нужно выполнить ещё несколько условий. Во-первых, ваша таблица должна быть создана на основе архитектуры InnoDB. В противном случае блокировка просто не будет срабатывать. Во-вторых, перед выполнением выборки необходимо отключить авто-коммит запроса. Т.е. другими словами автоматическое выполнение запроса. После того как вы укажите UPDATE запрос, необходимо будет ещё раз обратиться к базе и закоммитить изменения с помощью команды COMMIT:

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

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

    Ещё один момент: что такое реляционная база данных? Реляционная - значит основанная на таблицах. Знаменитый редактор электронных таблиц Excel от Microsoft фактически является редактором реляционных баз данных.

    Подключение к серверу MySQL

    Для подключения к серверу MySQL в PHP используется функция mysqli_connect() . Данная функция получает три аргумента: имя сервера, имя пользователя и пароль.

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

    Код подключения к серверу MySQL:

    $link = mysqli_connect("localhost", "root", "");

    В данном случае я работаю на локальном компьютере на Denwere, поэтому имя хоста localhost, имя пользователя root, а пароля нет.

    Соединение также нужно закрыть, после завершения работы с MySQL. Для закрытия соединения используется функция mysqli_close() . Расширяем пример:

    $link = mysqli_connect("localhost", "root", ""); if (!$link) die("Error"); mysqli_close($link);

    Тут мы проверели идентификатор подключения на истинность, если с нашим подключением что-то не так, то и программа выполняться не будет, функция die() остановит её выполнение и выведет в браузер сообщение об ошибке.

    Ошибки подключения

    Для проверки подключения используются следующие функции:

    • mysqli_connect_errno() - возвращает код ошибки последней попытки соединения. При отсутствие ошибок возвращает ноль.
    • mysqli_connect_error() - возвращает описание последней ошибки подключения к серверу MySQL.
    define ("HOST", "localhost"); define ("DB_USER", "root"); define ("DB_PASSWORD", ""); define ("DB", "tester"); $link = mysqli_connect(HOST, DB_USER, DB_PASSWORD, DB); /* проверка соединения */ if (mysqli_connect_errno()) { printf("Не удалось подключиться: %s\n", mysqli_connect_error()); exit(); } else { printf("Удалось подключиться: %s\n", mysqli_get_host_info($link)); }

    Функция mysqli_get_host_info() возвращает строку, содержащую тип используемого соединения.

    Также обратите внимание, при помощи команды define я все параметры подключения сохранил в константах. Когда вы будете писать большие проекты, и подключатся к серверу MySQL будут много файлов, то удобно хранить параметры соединения в отдельном файле и вставлять его при помощи функции include или require .

    Выбор базы данных

    На сервере MySQL может быть несколько баз данных. Первым делом нам нужно выбрать для работы нужную нам базу. В PHP для этого в функции mysqli_connect() есть ещё один параметр - имя базы данных.

    Я создал у себя на компьютере через phpMyAdmin с именем tester. Подключаемся к ней:

    $link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); mysql_close($link);

    Итак, мы выбрали для работы базу данных. Но как нам известно, реляционная база данных состоит из таблиц, а в нашей базе данных таблиц пока что нет. База данных создаётся пустая, без таблиц. Таблицы в неё нужно добавить отдельно. Вот давайте добавим в неё таблицу средствами PHP.

    Создаём таблицу

    В названии баз данных MySQL часть SQL обозначает Structured Query Language, что переводится как структурированный язык запросов. На языке SQL мы будем писать запросы и из программы PHP посылать их серверу MySQL.

    Чтобы создать таблицу нам просто нужно указать команду CREATE TABLE . Давайте создадим таблицу с именем users в столбцах которой будут храниться логины (столбец login) и пароли (столбец password) пользователей.

    $query = "CREATE TABLE users(login VARCHAR(20), password VARCHAR(20))";

    В этом коде мы присвоили переменной $query строку текста, которая представляет собой запрос SQL. Мы создаём таблицу с именем users, которая содержит два столбца login и password, у обоих тип данных VARCHAR(20). О типах данных мы поговорим позже, сейчас только отмечу, что VARCHAR(20) - это строка максимальной длины 20 символов.

    Чтобы отправить наш запрос на сервер MySQL мы используем PHP функцию mysqli_query() . Эта функция возвращает положительное число, если операция прошла успешно и false, если произошла ошибка (синтаксис запроса ошибочный или у программы нет прав на выполнение запроса).

    $link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "CREATE TABLE users(login VARCHAR(20), password VARCHAR(20))"; mysqli_query($query); mysqli_close($link);

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

    У этого скрипта есть один недостаток - он ничего не выводит в браузер. Давайте добавим сообщение:

    $link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "CREATE TABLE users(login VARCHAR(20), password VARCHAR(20))"; if (mysqli_query($query)) echo "Таблица создана."; else echo "Таблица не создана."; mysqli_close($link);

    Если мы повторно запустим этот скрипт на выполнение, то увидим в браузере сообщение: "Таблица не создана". Дело в том, что таблица была создана при первом запуске, а повторно невозможно создать таблицу с таким же именем. Мы столкнулись с ситуацией возникновения ошибки, значит настало время поговорить об обработке ошибок при работе с MySQL.

    Обработка ошибок

    При отладке программы нам может понадобиться точная информация о ошибке. Когда в MySQL происходит ошибка, то сервер базы данных устанавливает номер ошибки и строку с её описанием. Для доступа к этим данным в PHP есть специальные функции.

    • mysqli_errno() - возвращает номер ошибки.
    • mysqli_error() - возвращает строку с описанием ошибки.

    Теперь давайте добавим функцию mysql_error() в наш скрипт:

    $link = mysql_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "CREATE TABLE users(login VARCHAR(20), password VARCHAR(20))"; if (mysqli_query($query)) echo "Таблица создана."; else echo "Таблица не создана: ".mysqli_error(); mysqli_close($link);

    Теперь наш скрипт вернёт в браузер строку: "Таблица не создана: Table "users" already exists".

    Удаление таблицы

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

    Для удаления таблицы используется команда DROP TABLE , за которой следует имя таблицы.

    $link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "DROP TABLE users"; if (!mysqli_query($query)) echo "Ошибка при удалении таблицы: ".mysqli_error(); else echo "Таблица удалена."; mysqli_close($link);

    Итоги

    Итак, мы освоили основы MySQL. Что мы научились делать:

    • Подключаться к базе данных MySQL при помощи функции mysqli_connect() .
    • Закрывать соединение с сервером MySQL при помощи функции mysqli_close() .
    • Отправлять SQL запросы серверу MySQL при помощи функции mysqli_query() .
    • Мы узнали SQL запрос создания таблицы: create table.
    • Мы узнали SQL запрос удаления таблицы: drop table.
    • Мы узнали как обрабатывать ошибки при помощи функций mysqli_errno() и mysqli_error() .

    Потом мы подробно рассмотрим типы данных MySQL.

    Читаем следующий урок:

    Сделал на PHP для себя простенькую базу событий с напоминалкой о них на e-mail. Вполне сойдет как пример для работы в PHP с базой данных.

    В качестве базы данных конечно MySQL.

    Таблички можно создать вручную через phpMyAdmin, как описано в примере создания опроса на PHP здесь , но здесь таблички я буду создавать с помощью запросов.

    Файл для создания таблиц create.php (его запускаем 1 раз, потом удаляем после создания таблиц).

    Форма регистрации пользователя add.php

    E-mail:

    Пароль:

    Заносим в базу логин и пароль add1.php

    Войти

    Зарегистрировались.

    Теперь форма ввода логина и пароля login.php

    Напоминалка по событиям на PHP

    E-mail:

    Пароль:

    Регистрация

    Напомнить пароль

    После правильного ввода логина и пароля отображаем список событий see.php

    Напоминалка по событиям на PHP

    Под табличкой событий форма для ввода нового события и кнопка Добавить, при нажатии на нее открывается seeadd.php, событие добавляется и снова отображается табличка с новым событием и форма ввода. Чтобы все корректно заносилось, надо обратить внимание на формат даты и кодировку.

    Напоминалка по событиям на PHP

    В табличке у нас кнопка Изменить открывает change.php с формой изменения введенной ранее записи.

    Напоминалка по событиям на PHP


    Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности и правилами сайта, изложенными в пользовательском соглашении