Инструменты пользователя

Инструменты сайта


software:development:web:docs:learn:mariadb:вatabase_creation_pdo

Это старая версия документа!


Работа с MySQL через PDO

PDO. Создание подключения

Для создания подключения к серверу базы данных в PDO применяется конструктор new PDO(), который принимает в качестве параметров настройки подключения:

SQL
NEW PDO("mysql:host=адрес_сервера;port=номер_порта;dbname=имя_базы_данных", "имя_пользователя", "пароль")

Принимаемые параметры:

  • Сначала указывается строка подключечения, которая состоит из ряда настроек. Первая настройка - название драйвера базы данных. Так, в данном случае подключение осуществляется к MySQL, то тип баз данных будет mysql:.
    • Далее идет настройка host, которая задает хост сервера, например, host=localhost (если сервер MySQL запущен локально).
    • Затем дополнительно можно указать номер порта через параметр port. Если он не указан, то используется порт по умолчанию - для mysql это 3306.
    • И далее идет настройка dbname, которая устанавливает имя базы данных.
    • Кроме этих настроек строка подключения может включать еще ряд других, но это самые основные.
  • Второй параметр задает имя пользователя MySQL
  • Третий параметр устанавливает пароль для выше указанного пользователя

При успешном подключении вызов конструктора new PDO() возвращает созданный объект PDO, который представляет установленное подключение и через который мы сможем взавмодействовать с базой данных. Однако если установка подключения прошла неудачно (например, сервер базы данных недоступен, указаны неправильные имя пользователя и/или пароль, какая-то еще ошибка), то вызов конструктора генерирует исключение. Соответственно вызов данного конструктора лучше помещать в конструкцию try..catch
Определим простейший скрипт для подключения к серверу базы данных MySQL:

connect_db.php
<?php
try {
    // подключаемся к серверу
    $conn = NEW PDO("mysql:host=localhost", "root", "");
    echo "Соединение с базой данных установлено";
}
catch (PDOException $e) {
    echo "Соединение не удалось: " . $e->getMessage();
}
?>

http://localhost/connect_db.php

Здесь производится подключение к локальному серверу, поэтому в строке подключения параметр host имеет значение «localhost». Поскольку база данных пока не важна, то параметр dbname не указан. Подключение производится для пользователя - пользователя «root», для которого установлен пароль «mypassword».

«root» - это пользователь по умолчанию, который существует для сервера MySQL. А «mypassword» - пароль, установленный для этого пользователя. Естественно в каждом конкретном случае пароль для этого пользователя может отличаться. Однако если на сервере MySQL созданы другие пользователи, то можно указывать этих пользователей и их пароли.

При успешном подключении созданный объект PDO будет сохранен в переменную $conn, через которую мы затем сможем взаимодействовать с MySQL:

connect_db.php
$conn = NEW PDO("mysql:host=localhost", "root", "");

Если произойдет ошибка, то будет сгенерировано исключение типа PDOException. Как и у других классов исключений с помощью метода getMessage() мы можем получить сообщение об ошибке.

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

Соединение с базой данных установлено

А если произойдет ошибка, то браузер выведет сообщение об ошибке. Например, сообщение об ошибке при некорректном пароле:

Connection failed: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)

Установка режима вывода ошибок

Если при взаимодействии с MySQL произойдет ошибка, то, как правило, ожидается, что мы получим сообщение об ошибке. Однако реальное поведение зависит от редима вывода ошибок, который установлен для объекта PDO. Режим вывода ошибок задается с помощью атрибута PDO::ATTR_ERRMODE, который может принимать следующие значения:

  • PDO::ERRMODE_SILENT: PDO просто устанавливает код ошибки. Для получения которого и для получения информации об ошибке по которому необходимо было вызывать специальные методы. Поскольку при этом режиме необходимо вызывать дополнительные методы, то этот способ обычно рассматривался как не самый удобный. Он был значением по умолчанию до версии PHP 8.0.
  • PDO::ERRMODE_WARNING: PDO генерирует сообщение типа E_WARNING. Обычно применяется при отладке или тестировании
  • PDO::ERRMODE_EXCEPTION: PDO передает информацию об ошибке в объект PDOException, благодаря чему через блок catch в конструкции try..catch мы можем отловить ошибку и получить информацию об этом исключении. Этот режим применяется как режим по умолчанию начиная с версии PHP 8.0.

Если мы хотим получать информацию об ошибке через исключение PDOException и обрабатывать его в блоке catch, то нам нужно значение PDO::ERRMODE_EXCEPTION. В PHP 8.0 и выше это значение применяется по умолчанию, однако, если версия ниже 8.0, то необходимо это значение установить явным образом с помощью метода setAttribute() объекта PDO:

connect_db.php
try {
    // подключаемся к серверу
    $conn = NEW PDO("mysql:host=localhost", "root", "mypassword");
    // установка режима вывода ошибок
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Соединение с базой данных установлено";
}
catch (PDOException $e) {
    echo "Соединение не удалось: " . $e->getMessage();
}

Закрытие подключения

После завершения работы скрипта PHP автоматически закрывает открытые подключения к базе данных. Но может потребоваться закрыть подключение еще в процессе работы скрипта. В этом случае объекту PDO можно присвоить значение null:

SQL
$conn = NULL;  // отключаемся от сервера базы данных

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

Создание базы данных и таблиц

Для выполнения запросов к серверу базы данных у объекта PDO вызывается метод exec(), в который передается выполняемое выражение SQL.

SQL
$conn = NEW PDO("mysql:host=localhost", "root", "mypassword");
$conn->EXEC(команда_sql);

Создание базы данных

Для создания базы данных применяется SQL-команда CREATE DATABASE, после которой указывается имя создаваемой базы данных.

Создадим базу данных через PHP:

create_db.php
<?php
 try {
    // подключаемся к серверу
    $conn = NEW PDO("mysql:host=localhost", "root", "");
 
    // SQL-выражение для создания базы данных
    $sql = "CREATE DATABASE blog";
    // выполняем SQL-выражение
    $conn->EXEC($sql);
    echo "Соединение с базой данных установлено";
}
catch (PDOException $e) {
    echo "Соединение не удалось: " . $e->getMessage();
}
?>

http://localhost/create_db.php

http://localhost/phpmyadmin/index.php?route=/server/databases

В данном случае после подключения к серверу определяется переменная $sql, которая хранит команду на создание бд с именем «blog»:

SQL
$sql = "CREATE DATABASE blog";

Далее для выполнения этой команды передаем ее в метод exec():

SQL
$conn->EXEC($sql);

В итоге при успешном создании базы данных мы увидим в браузере сообщение об создании БД:

База данных создана

Создание таблицы

Подобным образом можно выполнять запросы на создание таблиц в базе данных. Для создания таблиц применяется SQL-команда CREATE TABLE, после которой указывается имя создаваемой таблицы и в скобках определения столбцов.

Так, возьмем выше созданную базу данных «blog». И создадим в ней таблицу, которая описывается следующим кодом

SQL
<?php
CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), pass VARCHAR(30), STATUS VARCHAR(30));
?>

Здесь создается таблица под названием «users». Она будет хранить условных пользователей. В ней будет три столбца: id, name, pass и status. Столбец id представляет числовой уникальный идентификатор строки - или идентификатор пользователя. Столбец name представляет строку - имя пользователя. Столбец pass - соответственно пароль. А столбец status определяет, что это администратор, пользователь или гость.

Для создания таблицы определим следующий скрипт php:

create_table_db.php
<?php
try {
    // подключаемся к серверу
    $conn = NEW PDO("mysql:host=localhost;dbname=blog", "root", "");
 
    // SQL-выражение для создания таблицы
    $sql = "create table users (id integer auto_increment primary key, name varchar(30), pass varchar(30),status varchar(30));";
    // выполняем SQL-выражение
    $conn->EXEC($sql);
    echo "Создана таблица «Пользователи».";
}
catch (PDOException $e) {
    echo "Соединение не удалось: " . $e->getMessage();
}
?>

http://localhost/create_table_db.php

http://localhost/phpmyadmin/index.php?route=/sql&pos=0&db=blog&table=users

Обратите внимание, что по сравнению с предыдущим примером здесь в строке подключения указана база данных, в которой создается таблица: «mysql:host=localhost;dbname=blog»

И после успешного выполнения запрос мы увидим в браузере сообщение об создании таблицы:

Создана таблица «Пользователи».

Добавление данных в PDO и параметризация запросов

Для добавления данных в БД MySQL применяется sql-команда INSERT, которая имеет следующий синтаксис:

SQL
INSERT INTO название_таблицы (столбец1, столбец2, столбецN) VALUES ( значение1, значение2, значениеN)

Данная команда также выполняется методом exec() объекта PDO. Стоит отметить, что для sql-команд INSERT, UPDATE и DELETE метод exec() возвращает количество затронутных командой строк (добавленных, измененных или удаленных). Таким образом, мы можем узнать сколько строк было добавлено.

Сначала рассмотрим простейшее добавление одного объекта в БД. Для примера возьмем созданную в прошлой теме базу данных «blog» и созданную в ней таблицу Users со следующим определением:

SQL
CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), pass VARCHAR(30), STATUS VARCHAR(30));

И для добавления определим следующий скрипт PHP:

insert_user_db.php
<?php
try {
    $conn = NEW PDO("mysql:host=localhost;dbname=blog", "root", "");
 
    // SQL-выражение для добавления данных
    $sql = "INSERT INTO Users (name, pass, status) VALUES ('eva', 123, 'admin')";
 
    $affectedRowsNumber = $conn->EXEC($sql);
    echo "В таблицу Users добавлено строк: $affectedRowsNumber";
}
catch (PDOException $e) {
    echo "Соединение не удалось: " . $e->getMessage();
}
?>

http://localhost/insert_user_db.php

http://localhost/phpmyadmin/index.php?route=/sql&pos=0&db=blog&table=users

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

SQL
$sql = "INSERT INTO Users (name, pass, status) VALUES ('eva', 123, 'admin')";

То есть в столбец name добавляется строка «eva», в pass - 123 а в столбец status - значение admin. Для столбца id не добавляется никакого значения, потому что при создании таблицы для него указан параметр AUTO_INCREMENT - то есть значение этого столбца у каждой добавляемой строки будет автоматически увеличиваеться по сравнению с предыдущей на единицу.

При добавлении мы получаем количество добавленных строк в переменую $affectedRowsNumber и затем выводим ее значение в браузере. Поэтому при успешном добавлении мы увидим

В таблицу Users добавлено строк: 1

Множественное добавление

Также мы можем добавить сразу несколько объектов:

insert_user_db.php
<?php
try {
    $conn = NEW PDO("mysql:host=localhost;dbname=blog", "root", "");
 
    // SQL-выражение для добавления данных
    $sql = "INSERT INTO Users (name, age) VALUES ('Tom', 37)";
    $sql = "INSERT INTO Users (name, pass, status) VALUES ('eva', 123, 'admin')";
    $sql = "INSERT INTO Users (name, pass, status) VALUES
            ('tom', 456, 'admin'), 
            ('bob', 789, 'admin'), 
            ('alisa', 012, 'admin')";
 
    $affectedRowsNumber = $conn->EXEC($sql);
    echo "В таблицу Users добавлено строк: $affectedRowsNumber";
}
catch (PDOException $e) {
    echo "Соединение не удалось: " . $e->getMessage();
}
?>

http://localhost/phpmyadmin/index.php?route=/sql&pos=0&db=blog&table=users

Здесь в таблицу добавляется три строки. Соответственно в браузере мы увидим:

В таблицу Users добавлено строк: 3

Добавление данных из формы HTML

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

create_user_form.php
<!DOCTYPE html>
<html>
<head>
<title>create_user_form.php</title>
<meta charset="utf-8" />
</head>
<body>
<?php
if (isset($_POST["username"]) && isset($_POST["userpass"])) {
 
    $username = $_POST["username"];
    $userpass = $_POST["userpass"];
    try {
        $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
        $sql = "INSERT INTO Users (name, pass, status) VALUES ('$username', $userpass, 'user')";
        $affectedRowsNumber = $conn->exec($sql);
        // если добавлена как минимум одна строка
        if($affectedRowsNumber > 0 ){
            echo "Данные успешно добавлены: name=$username  pass= $userpass status= user";  
        }
    }
    catch (PDOException $e) {
        echo "Ошибка базы данных: " . $e->getMessage();
    }
}
?>
<h3>Создать нового пользователя</h3>
<form method="post">
    <p>Имя пользователя:
    <input type="text" name="username" /></p>
    <p>Пароль пользователя:
    <input type="number" name="userpass" /></p>
    <input type="submit" value="Создать">
</form>
</body>
</html>

http://localhost/create_user_form.php

http://localhost/phpmyadmin/index.php?route=/sql&pos=0&db=blog&table=users

Здесь мы проверяем, пришли ли с сервера данные в POST-запросе, которые имеют ключи «username» и «userpass»:

SQL
IF (isset($_POST["username"]) && isset($_POST["userpass"])) {

Если эти данные имеются, то есть был отправлен post-запрос с данными на добавление, то мы получаем эти данные, добавляем пользователю статус «user» в переменные и добавляем их в бд.

SQL
$sql = "INSERT INTO Users (name, pass, status) VALUES ('$username', $userpass, 'user')";

Если была добавлена строка, то есть метод exec() возвратил число больше нуля, то выводим пользователю соответствующее сообщение.

После кода php собственно определена форма на добавление данных с помощью post-запроса. Здесь в таблицу добавляется новая строка строки. Соответственно в браузере мы увидим:

Данные успешно добавлены: name=ivan pass= 654 status= user
Только авторизованные участники могут оставлять комментарии.
software/development/web/docs/learn/mariadb/вatabase_creation_pdo.1771786401.txt.gz · Последнее изменение: VladPolskiy

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki