Немного о PDO и MySQL + пример заполнения связанных таблиц

MYSQL 02.10.21 02.10.21 61
Бесплатные курсына главную сниппетов

Соединение с базой данных. Файл connect_db.php

<?php ## Соединение с базой данных try { $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); } catch (PDOException $e) { echo "Невозможно установить соединение с базой данных"; } ?>
<?php ## Извлечение текущей версии сервера require_once('connect_db.php'); // Выполняем запрос $query = "SELECT VERSION() AS version"; $ver = $pdo->query($query); // Извлекаем результат $version = $ver->fetch(); echo $version['version']; // 5.5.46-0ubuntu0.14.04.2 ?>

Обработка ошибки соединения с базой данных. Файл connect.php

<?php ## Обработка ошибки соединения с базой данных try { $pdo = new PDO( 'mysql:host=localhost;dbname=test', 'root', '', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); } catch (PDOException $e) { echo "Невозможно установить соединение с базой данных"; } ?>

Вывод содержимого таблицы catalogs. Файл fetch.php

<?php ## Вывод содержимого таблицы catalogs require_once("connect.php"); $query = "SELECT * FROM catalogs"; $cat = $pdo->query($query); try { while($catalog = $cat->fetch()) echo $catalog['name']."<br />"; } catch (PDOException $e) { echo "Ошибка выполнения запроса: " . $e->getMessage(); } ?>

Использование метода fetchAll(). Файл fetch_all.php

<?php ## Использование метода fetchAll() require_once("connect.php"); try { $query = "SELECT * FROM catalogs"; $cat = $pdo->query($query); $catalogs = $cat->fetchAll(); foreach($catalogs as $catalog) echo $catalog['name']."<br />"; } catch (PDOException $e) { echo "Ошибка выполнения запроса: " . $e->getMessage(); } ?>

Параметризованный запрос. Файл prepare.php

<?php ## Параметризованный запрос require_once("connect.php"); try { $query = "SELECT * FROM catalogs WHERE catalog_id = :catalog_id"; $cat = $pdo->prepare($query); $cat->execute(['catalog_id' => 1]); echo $cat->fetch()['name']; // Процессоры } catch (PDOException $e) { echo "Ошибка выполнения запроса: " . $e->getMessage(); } ?>

Запросы, в которых используются параметры, передаются специальному методу prepare(). Сам запрос, как видно, содержит параметр :catalog_id, который заполняется на этапе выполнения методом execute(). Для заполнения параметра методу execute() передается ассоциативный массив, ключи которого содержат названия параметров. Параметры могут быть безымянными, в запросе они обозначаются символом вопроса ?.
Методу же execute() передается индексный массив, элементы которого заменят симво- лы ? в параметризованном запросе. Первый знак вопроса заменяется первым элемен- том, второй — вторым и т. д.

<?php require_once("connect.php"); try { $query = "SELECT * FROM catalogs WHERE catalog_id = ?"; $cat = $pdo->prepare($query); $cat->execute([1]); echo $cat->fetch()['name']; // Процессоры } catch (PDOException $e) { echo "Ошибка выполнения запроса: " . $e->getMessage(); } ?>

Заполнение связанных таблиц

Еще один интересный случай представляет собой заполнение связанных таблиц. Пусть имеется таблица news, предназначенная для хранения новостных сообщений и состоя- щая из трех полей:
id_news — первичный ключ, снабженный атрибутом AUTO_INCREMENT;
name — название новостной позиции;
putdate — дата размещения новости.
С таблицей news связана таблица news_contents, предназначенная для хранения текста новости и также состоящая из трех полей: id_content — первичный ключ, снабженный атрибутом AUTO_INCREMENT;
content — содержимое новостного сообщения;
id_news — внешний ключ, содержащий значения полей id_news из таблицы news для связывания новостного блока и текста новости.

В листинге представлены операторы CREATE TABLE, которые создают таблицы news и news_contents.
Таблицы news и news_contents. Файл news.sql

CREATE TABLE news ( news_id INT(11) NOT NULL AUTO_INCREMENT, name TINYTEXT NOT NULL, putdate DATETIME NOT NULL, PRIMARY KEY (news_id) ); CREATE TABLE news_contents ( content_id INT(11) NOT NULL AUTO_INCREMENT, content TEXT NOT NULL, news_id INT(11) NOT NULL, PRIMARY KEY (content_id) );

Форма добавления новости. Файл news.html

<!DOCTYPE html> 
<html lang="ru"> 
<head> 
  <title>Добавление новости</title> 
  <meta charset='utf-8'> 
</head> 
<body> 
  <table> 
  <form action='addnews.php' method='POST'> 
    <tr> 
      <td>Название:</td> 
      <td><input type='text' name='name'></td> 
    </tr>
    <tr> 
      <td>Содержимое:</td> 
      <td><textarea name='content' rows='10' cols='40'></textarea></td> 
    </tr> 
    <tr> 
      <td></td> 
      <td><input type='submit' value='Добавить'></td> 
    </tr> 
  </form> 
  </table> 
</body> 
</html> 

Как видно из листинга, обработчиком HTML-формы назначен файл addnews.php. В листинге также представлен обработчик HTML-формы, который осуществляет встав- ку новостного сообщения в таблицы news и news_contents.

Добавление новостного сообщения. Файл addnews.php

<?php ## Добавление новостного сообщения в базу данных require_once("connect.php"); try { // Проверяем, заполнены ли поля HTML-формы if (empty($_POST['name'])) exit('Не заполнено поле "Название"'); if (empty($_POST['content'])) exit('Не заполнено поле "Содержимое"'); // Добавляем новостное сообщение в таблицу news $query = "INSERT INTO news VALUES (NULL, :name, NOW())"; $news = $pdo->prepare($query); $news->execute(['name' => $_POST['name']]); // Получаем только что сгенерированный идентификатор news_id $news_id = $pdo->lastInsertId(); // Вставляем содержимое новостного сообщения в таблицу news_contents. // Формируем запросы $query = "INSERT INTO news_contents VALUES (NULL, :content, :news_id)"; $news = $pdo->prepare($query); $news->execute(['content' => $_POST['content'], 'news_id' => $news_id]); // Осуществляем переадресацию на главную страницу header("Location: news.html"); } catch (PDOException $e) { echo "Ошибка выполнения запроса: " . $e->getMessage(); } ?>

Так как данные передаются методом POST, то содержимое полей name и content попадает в элементы суперглобального массива $_POST['name'] и $_POST['name'] соответственно.
В начале обработчика производится проверка правильности заполнения полей формы — если хоть одно из полей остается незаполненным, процесс добавления информации приостанавливается с выдачей соответствующего предупреждения. Наличие символов в строке можно проверить при помощи функции empty(), которая возвращает TRUE, если строка пустая, и FALSE, если строка содержит хотя бы один символ.
Основная особенность добавления данных в связанные таблицы заключается в том, что для добавления записи во вторую таблицу news_content необходимо знать первичный ключ news_id, который был сгенерирован по механизму AUTO_INCREMENT для только что созданной записи в таблице news. Получить его можно, обратившись к методу lastInsertId() класса PDO.
После того как записи добавлены, следует вернуться на главную страницу HTML- формы или страницу, где выводятся новостные позиции. Для этого браузеру отправляется HTTP-заголовок Location с адресом страницы, на которую следует осуществить переход.

 

на главную сниппетов
Курсы