Взаимодействие PHP и MySQL
Ну что, разобрались с работой MySQL, теперь пора научиться работать с ней из PHP!
В целом любая работа с MySQL из PHP сводится к следующей последовательности:
- Установить соединение с базой
- Сформировать и отправить запрос
- Получить и обработать результат
Подключение к базе данных 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
Давайте теперь прочитаем данные, которые мы записали. Схема та же, только подготавливаем 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>
Ну вот, совершенно другое дело!
Если в SELECT-запросе нужно добавить какие-то параметры, то делается это аналогично:
<?php
...
$stm = $dbh->prepare('SELECT * FROM `users` WHERE name=:name');
$stm->bindValue('name', 'Иван');
$stm->execute();
$allUsers = $stm->fetchAll();
...
Теперь вернутся только записи, подошедшие под условия запроса.
Вот и всё. Главное - всегда используйте биндинг параметров. Не пихайте данные напрямую в запрос - это небезопасно. Если интересно, можете почитать про SQL-инъекции.
Комментарии