PDO интерфейс для доступа к базам данных

PHP Data Object (PDO) — способ доступа к базам данных в PHP, в котором база выступает как объект. PDO позволяет работать со множеством типов баз данных, однако требует наличия драйверов для разных типов данных. Таким образом, PDO выступает высокоуровневой прослойкой между базой и языком программирования.

PDO предоставляет однотипный доступ к различным типам баз данных, что значительно упрощает процесс создания приложений. Даже если некоторый функционал не поддерживается конкретной базой данных, то PDO берет на себя работу по эмуляции данного функционала.

Подключение баз в PDO

При подключении к базе данных необходимо указать тип базы, и остальные параметры известные нам по изучению sql.

Рассмотрим пример:

1
2
3
4
5
6
7
8
9
10
11
12
  try
{
	$db = new PDO('mysql:host=localhost;dbname=test','root','');
	$rows = $db->exec("CREATE TABLE `testing`(
	id INT PRIMARY KEY AUTO_INCREMENT,
	fname VARCHAR(20) NOT NULL DEFAULT '',
	email VARCHAR(50) NOT NULL DEFAULT '')");
}
catch(PDOException $e)
{
	die("Error: ".$e->getMessage());
}

Здесь мы встречаемся с двумя новыми операторами: try … catch. Даже не зная синтаксиса, можно предположить что данные операторы являются аналогами if..else. С одной стороны это правильно, с другой — не раскрывает всю мощь функционала данных команд. Данные операторы появлись как средство работы с исключениями.

Коротко об исключениях

Исключение — сигнал о возникновении ситуации не предусмотренной разработчиками, либо о ситуации которую разработчики не могут предусмотреть на момент выполнения кода программы. В ходе возникновения исключения, генерируется объект, куда передается сообщение исключения и его код.

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

Где применяется обработка исключений? Давайте рассмотрим код программы:

1
2
3
4
5
6
  try {
      mysql_connect($hostname, $username, $password);
      mysql_select_db($dbname);
  } catch (Exception $e) {
      echo $e->getMessage(); //выведет либо сообщение об ошибке подключения, либо об ошибке выбора
  }

В результате выполнения программы возможны варианты:

  • удачное соединение с базой данных, блок catch не задействован
  • соединение с базой данных не удалось, вывод ошибки и прекращение выполнения сеанса
  • при ошибке выбора db пользователя оповестили бы о проблемах

Возникает вопрос почему мы не используем if..else. Даже без изучения возможностей try catch на основе написанного кода видно, что try..catch проще и структурирование.

Когда использовать исключения?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
// константы для конфигурации
define('DB_DRIVER','mysql');
define('DB_HOST','localhost');
define('DB_NAME','test');
define('DB_USER','root');
define('DB_PASS','');
 
try
{
	// соединяемся с базой данных
 
	$connect_str = DB_DRIVER . ':host='. DB_HOST . ';dbname=' . DB_NAME;
	$db = new PDO($connect_str,DB_USER,DB_PASS);
 
	// вставляем строки в таблицу из прошлого примера
	$rows = $db->exec("INSERT INTO `testing` VALUES
		(null, 'Ivan', 'ivan@test.com'),
		(null, 'Petr', 'petr@test.com'),
		(null, 'Vasiliy', 'vasiliy@test.com')
	");
 
	// в случае ошибки SQL выражения выведем сообщене об ошибке
	// данный отлов ошибок нужен поскольку исключения не выведу ошибку в sql Запросе
 
	$error_array = $db->errorInfo();
 
	if($db->errorCode() != 0000)
 
	echo "SQL ошибка: " . $error_array[2] . '<br />';
 
	// если запрос был выполнен успешно,
	// то выведем количество затронутых строк
 
	if($rows) echo "Количество затронутых строк: " . $rows. "<br />";
 
	// теперь выберем несколько строчек из базы
 
	$result = $db->query("SELECT * FROM `testing` ");
 
	// в случае ошибки SQL выражения выведем сообщене об ошибке
 
	$error_array = $db->errorInfo();
 
	if($db->errorCode() != 0000)
 
	echo "SQL ошибка: " . $error_array[2] . '<br /><br />';
 
	// теперь получаем данные из класса PDOStatement
 
	while($row = $result->fetch())
	{
		// в результате получаем ассоциативный массив
		print_r($row);
	}
}
catch(PDOException $e)
{
	die("Error: ".$e->getMessage());
}
?>

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

Рассмотрим данный код более подробно.

Insert и Update в базе данных

Операции добавления информации в базу данных — наиболее часто встречаемые операции, которые выполняются. Рассмотрим два примера:

1
2
3
4
5
6
7
8
9
 $rows = $db->exec("INSERT INTO `testing` VALUES
		(null, 'Ivan', 'ivan@test.com'),
		(null, 'Petr', 'petr@test.com'),
		(null, 'Vasiliy', 'vasiliy@test.com')
	");
 
	// в случае ошибки SQL выражения выведем сообщене об ошибке
 
	$error_array = $db->errorInfo();

Команда exec выполняет запрос sql. В самом запросе нет ничего нового для вас — это просто запрос sql. Функция exec — позволяет выполнить внешнюю программу. Знак » -> » показывает связь между экземпляром класса PDO и функцией exec.

Для повышения уровня безопасности, операцию добавления в базу данных новой информации разбивают на две части. Синтаксис немного изменится:

1
2
3
 # STH означает "Statement Handle" - подготовленное выражение  
$STH = $DBH->prepare("INSERT INTO folks ( first_name ) values ( 'Cathy' )");  
$STH->execute();

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

Выполнить

Задание 1. Создайте базу данных «buratino». Импортируйте в нее файл с таблицей.

Задание 2. Используя интерфейс PDO напишите код, который будет добавлять в базу данных следующий код:

1
2
3
4
"INSERT INTO `b1` VALUES
		(null, 'panda', 'https://cdn0.iconfinder.com/data/icons/toys/128/teddy_bear_toy_1.png', 40),
		(null, 'monkey', 'https://cdn0.iconfinder.com/data/icons/toys/128/teddy_bear_toy_3.png', 35),
		(null, 'hippo', 'https://cdn0.iconfinder.com/data/icons/toys/128/teddy_bear_toy_2.png',65)"
Проверьте ошибки на этапе работы sql запроса и в исключениях.

Задание 3. Создайте файл inp.php в котором будет размещена форма содержащая три поля: name, img, cost. Данные из формы методом GET передаются в файл addToDB.php, который добавляет информацию из формы в таблицу b1.

Задание 4. Модифицируйте файлы интернет-магазина из рассмотренных ранее заданий таким образом, чтобы добавление товаров через админ-панель в базу данных было выполнено по интерфейсу PDO.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *