Взаимодействие PHP и MySQL

05.06.2018 в 19:55
17997
+1857

Ну что, разобрались с работой MySQL, теперь пора научиться работать с ней из PHP!

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

  1. Установить соединение с базой
  2. Сформировать и отправить запрос
  3. Получить и обработать результат

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

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

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

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

В ходе курса нами была создана база my_db с несколькими табличками. В данном уроке давайте поработаем с табличкой users. Если вдруг у вас что-то пошло не так и эта табличка потерялась, то вот запрос для ее создания:

CREATE TABLE `users` (
 `id` INT NOT NULL AUTO_INCREMENT ,
 `email` VARCHAR(255) NOT NULL ,
 `name` VARCHAR(255) NOT NULL ,
 PRIMARY KEY (`id`),
 UNIQUE (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Хочу сразу предупредить: код в этом и двух следующих уроках будет вам несколько непонятен, поскольку мы еще не проходили ООП в PHP. В частности, это касается использования конструкций для создания объектов с помощью слова new, а также обращений к свойствам и методам с помощью символа ->. Просьба отнестись пока к этим моментам как к некоторой магии. В дальнейшем мы разберемся как это работает на самом деле. А пока просто скопируйте этот код и не задумывайтесь о том как это работает. Сконцентрируйтесь пока на логике в целом и на SQL-запросах в частности - именно об этом наш текущий курс.

$dbh = new \PDO(
    'mysql:host=localhost;dbname=my_db;',
    'root',
    ''
);

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

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

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

$stm = $dbh->prepare('INSERT INTO users (`email`, `name`) VALUES (:email, :name)');
$stm->bindValue('email', '[email protected]');
$stm->bindValue('name', 'Вячеслав');
$stm->execute();

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

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

Как видим - данные в базе успешно добавились.

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

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

$dbh = new \PDO('mysql:host=localhost;dbname=my_db;', 'root', '');
$dbh->exec('SET NAMES UTF8');
$stm = $dbh->prepare('SELECT * FROM `users`');
$stm->execute();

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

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

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

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

<?php
$dbh = new \PDO('mysql:host=localhost;dbname=my_db;', 'root', '');
$dbh->exec('SET NAMES UTF8');
$stm = $dbh->prepare('SELECT * FROM `users`');
$stm->execute();
$allUsers = $stm->fetchAll();
?>
<table border="1">
    <tr><td>id</td><td>Имя</td><td>Email</td></tr>
    <?php foreach ($allUsers as $user): ?>
        <tr>
            <td><?= $user['id'] ?></td>
            <td><?= $user['name'] ?></td>
            <td><?= $user['email'] ?></td>
        </tr>
    <?php endforeach; ?>
</table>

Ну вот, совершенно другое дело!
Данные из MySQL в тегах HTML

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

<?php
...
$stm = $dbh->prepare('SELECT * FROM `users` WHERE name=:name');
$stm->bindValue('name', 'Иван');
$stm->execute();
$allUsers = $stm->fetchAll();
...

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

Вот и всё. Главное - всегда используйте биндинг параметров. Не пихайте данные напрямую в запрос - это небезопасно. Если интересно, можете почитать про SQL-инъекции.

loader
05.06.2018 в 19:55
17997
+1857
Логические задачи с собеседований