Выборка информации из базы данных в PDO

Выборка информации из базы данных



Метод query()

Метод fetch()

Метод fetchAll()




Запрос на выборку данных:


$sql = 'SELECT id, title FROM news';




Метод query()


Для выполнения sql-запросов типа SELECT (запрос, который должен вернуть результат) средствами с расширением PDO мы должны воспользоваться методом объекта PDO - query(), в качестве первого параметра передаем sql-запрос.

При этом возвращается специальный объект результата выполненного запроса (Statement), который мы можем использовать для получения готового результата.


$result = $pdo -> query($sql);



Файл index.php


-- файл index.php --

<?php

// Подключение к базе данных
try{
$pdo = new PDO ('mysql:host=localhost;dbname=test2';charset=utf-8, 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Успешное подключение <br><br>";
}catch{
exit ('Ошибка подключения: <br>' . $e -> getMessage());
}

// Выполнение запроса
try{
-------------------------------------------------------------------
$sql = 'SELECT id, title FROM news';
$result = $pdo -> query($sql);
print_r($result); // распечатаем
--------------------------------------------------------------------

} catch{
exit ('Ошибка в запросе: <br><br>' . $e -> getMessage());
}
?>

Выведет:
PDOStatement Object ( [queryString] => SELECT id, title FROM news )

Наверх



Использование цикла foreach для выборки данных и получения готового результата

(проходимся по объекту $result, как будто это обычный массив)


foreach ($result as $row){
echo "<p>" . $row['id'] . " | " . $row['title'];
}



Файл index.php


-- файл index.php --

<?php

// Подключение к базе данных
try{
$pdo = new PDO ('mysql:host=localhost;dbname=test2';charset=utf-8, 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Успешное подключение <br><br>";
}catch{
exit ('Ошибка подключения: <br>' . $e -> getMessage());
}

// Выполнение запроса
try{
-------------------------------------------------------------------
$sql = 'SELECT id, title FROM news';
$result = $pdo -> query($sql);

// Использование цикла foreach:
foreach ($result as $row){
echo "<p>" . $row['id'] . " | " . $row['title'];
}
--------------------------------------------------------------------

} catch{
exit ('Ошибка в запросе: <br><br>' . $e -> getMessage());
}
?>

Выведет:
1 | Новость 1
2 | Новость 2
3 | Новость 3
4 | Новость 4
5 | Новость 5

Наверх





Метод fetch()


Использование цикла while


Для выборки данных и получения готового результата можно использовать метод fetch() объекта PDOStatement

Метод fetch() извлекает следующую строку из результирующего набора.

В качестве параметра мы передаем одну из констант (стиль работы данного метода):


PDO::FETCH_ASSOC - метод fetch() в качестве результата своей работы будет возвращать ассоциативный массив.

while($row = $result -> fetch(PDO :: FETCH_ASSOC)){
echo "<p>" . $row['id'] . " | " . $row['title'];
}



PDO::FETCH_NUM - возвращает данные в виде простого индексного массива. В этом случае необходимо обращаться к ячейкам по их индексам:


while($row = $result -> fetch(PDO :: PDO::FETCH_NUM)){
echo "<p>" . $row[0] . " | " . $row[1];
}



PDO::FETCH_BOTH (по умолчанию) - возвращает данные в виде и ассоциативного массив и простого индексного массива. Обращаться можно как по именам ячеек, так и по их индексам.


PDO::FETCH_OBJ - возвращает данные в виде объекта. В этом случае в переменной $row мы получим объект и обращаться будем к его свойствам:


while($row = $result -> fetch(PDO :: PDO::FETCH_NUM)){
// Здесь обращаемся к свойствам объекта $row
echo "<p>" . $row->id . " | " . $row->title;
}



Файл index.php


-- файл index.php --

<?php

// Подключение к базе данных
try{
$pdo = new PDO ('mysql:host=localhost;dbname=test2';charset=utf-8, 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Успешное подключение <br><br>";
}catch{
exit ('Ошибка подключения: <br>' . $e -> getMessage());
}

// Выполнение запроса
try{
-------------------------------------------------------------------
$sql = 'SELECT id, title FROM news';
$result = $pdo -> query($sql);

// Использование цикла while и константы FETCH_ASSOC:
while($row = $result -> fetch(PDO :: FETCH_ASSOC)){
echo "<p>" . $row['id'] . " | " . $row['title'];
}
--------------------------------------------------------------------

} catch{
exit ('Ошибка в запросе: <br><br>' . $e -> getMessage());
}
?>

Выведет:
1 | Новость 1
2 | Новость 2
3 | Новость 3
4 | Новость 4
5 | Новость 5

Наверх

- получаем такой же результат, как и при использовании цикла foreach



PDO::FETCH_CLASS - при использовании этой константы метод fetch() будет передавать данные непосредственно в специальный класс, имя которого мы должны задать в специальной настройке.

Соответственно, в переменную $row попадет уже объект этого класса. При этом в этот объект уже будут переданы данные в соответствующие свойства.

Перед вызовом метода fetch() мы должны обратиться к объекту класса PDOStatement и вызвать на исполнение метод setFetchMode.

Метод setFetchMode устанавливает режим работы метода fetch().

Первым параметром он принимает константу PDO::FETCH_CLASS, вторым - имя класса, в который будут переданы параметры и объект которого будут возвращен в качестве результата работы данного метода.


$result -> setFetchMode(PDO :: PDO::FETCH_CLASS, 'News');
while($row = $result -> fetch()){
// Здесь обращаемся к методам класса News (news.php)
echo "<p>" . $row->getId() . " | " . $row->getTitle();
}



Создадим этот класс в котором будут два свойства (их имена совпадают с именами выбранных полей) и два метода.


Файл news.php


-- файл news.php --

<?php
class News
{
protected $id;
protected $title;

// Метод будет возвращать значение свойства $id
public function getId(){
//... здесь мы можем производить какие-то манипуляции с данными свойствами ...
return $this->id;
}

// Метод будет возвращать значение свойства $title
public function getTitle(){
//.... здесь мы можем производить какие-то манипуляции с данными свойствами ...
return $this->title;
}
}
?>

Наверх


В индексном файле подключаем класс news.php


Файл index.php


-- файл index.php --

<?php

include 'news.php'; // подключаем класс news.php

// Подключение к базе данных
try{
$pdo = new PDO ('mysql:host=localhost;dbname=test2';charset=utf-8, 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Успешное подключение <br><br>";
}catch{
exit ('Ошибка подключения: <br>' . $e -> getMessage());
}

// Выполнение запроса
try{
-------------------------------------------------------------------
$sql = 'SELECT id, title FROM news';
$result = $pdo -> query($sql);

// Использование константы PDO::FETCH_CLASS и метода setFetchMode
$result -> setFetchMode(PDO :: PDO::FETCH_CLASS, 'News');
while($row = $result -> fetch()){
// Здесь обращаемся к методам класса News (news.php)
echo "<p>" . $row->getId() . " | " . $row->getTitle();
}
--------------------------------------------------------------------

} catch{
exit ('Ошибка в запросе: <br><br>' . $e -> getMessage());
}
?>

Выведет:
1 | Новость 1
2 | Новость 2
3 | Новость 3
4 | Новость 4
5 | Новость 5

Наверх


- во всех случаях получаем один и тот же же результат.



Метод fetchAll()


Метод fetchAll() - возвращает массив, содержащий все строки результирующего набора

Этот метод удобен тем, что один раз его вызвав, мы сразу получаем массив выбранных данных.


Метод fetchAll() и константа PDO::FETCH_ASSOC


$result -> setFetchMode(PDO :: FETCH_ASSOC);
print_r($result -> fetchAll());

Получаем многомерный массив:
Array
(
[0] => Array
(
[id] => 1
[title] => Новость 1
)
[1] => Array
(
[id] => 2
[title] => Новость 2
)
[2] => Array
(
[id] => 3
[title] => Новость 3
)
[3] => Array
(
[id] => 4
[title] => Новость 4
)
[4] => Array
(
[id] => 5
[title] => Новость 5
)
)



Метод fetchAll() и константа PDO::FETCH_OBJ


$result -> setFetchMode(PDO :: FETCH_OBJ);
print_r($result -> fetchAll());

Получаем массив объектов:
Array
( [0] => stdClass Object
(
[id] => 1
[title] => Новость 1
)
[1] => stdClass Object
(
[id] => 2
[title] => Новость 2
)
.............................
.............................
.............................
)







Наверх Наверх