Выборка информации из базы данных
Для выполнения sql-запросов типа SELECT (запрос, который должен вернуть результат) средствами с расширением PDO мы должны воспользоваться методом объекта PDO — query() , в качестве первого параметра передаем sql-запрос.
При этом возвращается специальный объект результата выполненного запроса (Statement), который мы можем использовать для получения готового результата.
// Подключение к базе данных
try <
$pdo = new PDO ( ‘mysql:host=localhost;dbname=test2’;charset=utf-8 , ‘root’ , » );
$pdo -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );
echo «Успешное подключение
» ;
> catch exit ( ‘Ошибка подключения:
‘ . $e -> getMessage ());
>
> catch exit ( ‘Ошибка в запросе:
‘ . $e -> getMessage ());
>
?>
Выведет:
PDOStatement Object ( [queryString] => SELECT id, title FROM news )
Использование цикла foreach для выборки данных и получения готового результата
(проходимся по объекту $result , как будто это обычный массив)
foreach ( $result as $row ) echo «
» . $row [ ‘id’ ] . » | » . $row [ ‘title’ ];
>
// Подключение к базе данных
try <
$pdo = new PDO ( ‘mysql:host=localhost;dbname=test2’;charset=utf-8 , ‘root’ , » );
$pdo -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );
echo «Успешное подключение
» ;
> catch exit ( ‘Ошибка подключения:
‘ . $e -> getMessage ());
>
> catch exit ( ‘Ошибка в запросе:
‘ . $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 «
» . $row [ ‘id’ ] . » | » . $row [ ‘title’ ];
>
PDO::FETCH_NUM — возвращает данные в виде простого индексного массива. В этом случае необходимо обращаться к ячейкам по их индексам:
while ( $row = $result -> fetch ( PDO :: PDO::FETCH_NUM )) echo «
» . $row [ 0 ] . » | » . $row [ 1 ];
>
PDO::FETCH_BOTH (по умолчанию) — возвращает данные в виде и ассоциативного массив и простого индексного массива. Обращаться можно как по именам ячеек, так и по их индексам.
PDO::FETCH_OBJ — возвращает данные в виде объекта. В этом случае в переменной $row мы получим объект и обращаться будем к его свойствам :
while ( $row = $result -> fetch ( PDO :: PDO::FETCH_NUM )) // Здесь обращаемся к свойствам объекта $row
echo «
» . $row -> id . » | » . $row -> title ;
>
// Подключение к базе данных
try <
$pdo = new PDO ( ‘mysql:host=localhost;dbname=test2’;charset=utf-8 , ‘root’ , » );
$pdo -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );
echo «Успешное подключение
» ;
> catch exit ( ‘Ошибка подключения:
‘ . $e -> getMessage ());
>
// Использование цикла while и константы FETCH_ASSOC:
while ( $row = $result -> fetch ( PDO :: FETCH_ASSOC )) echo «
» . $row [ ‘id’ ] . » | » . $row [ ‘title’ ];
>
———————————————————————
> catch exit ( ‘Ошибка в запросе:
‘ . $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 «
» . $row -> getId () . » | » . $row -> getTitle ();
>
Создадим этот класс в котором будут два свойства (их имена совпадают с именами выбранных полей) и два метода.
class News
<
protected $id ;
protected $title ;
// Метод будет возвращать значение свойства $id
public function getId () //. здесь мы можем производить какие-то манипуляции с данными свойствами .
return $this -> id ;
>
// Метод будет возвращать значение свойства $title
public function getTitle () //. здесь мы можем производить какие-то манипуляции с данными свойствами .
return $this -> title ;
>
>
?>
В индексном файле подключаем класс news.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 «Успешное подключение
» ;
> catch exit ( ‘Ошибка подключения:
‘ . $e -> getMessage ());
>
// Использование константы PDO::FETCH_CLASS и метода setFetchMode
$result -> setFetchMode ( PDO :: PDO::FETCH_CLASS , ‘News’);
while ( $row = $result -> fetch ()) // Здесь обращаемся к методам класса News (news.php)
echo «
» . $row -> getId () . » | » . $row -> getTitle ();
>
———————————————————————
> catch exit ( ‘Ошибка в запросе:
‘ . $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
)
.
.
.
)
PDO::query
PDO::query() prepares and executes an SQL statement in a single function call, returning the statement as a PDOStatement object.
For a query that you need to issue multiple times, you will realize better performance if you prepare a PDOStatement object using PDO::prepare() and issue the statement with multiple calls to PDOStatement::execute() .
If you do not fetch all of the data in a result set before issuing your next call to PDO::query() , your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query() .
Note:
If the query contains placeholders, the statement must be prepared and executed separately using PDO::prepare() and PDOStatement::execute() methods.
Parameters
The SQL statement to prepare and execute.
If the SQL contains placeholders, PDO::prepare() and PDOStatement::execute() must be used instead. Alternatively, the SQL can be prepared manually before calling PDO::query() , with the data properly formatted using PDO::quote() if the driver supports it.
The default fetch mode for the returned PDOStatement . It must be one of the PDO::FETCH_* constants.
If this argument is passed to the function, the remaining arguments will be treated as though PDOStatement::setFetchMode() was called on the resultant statement object. The subsequent arguments vary depending on the selected fetch mode.
Return Values
Returns a PDOStatement object or false on failure.
Errors/Exceptions
Emits an error with level E_WARNING if the attribute PDO::ATTR_ERRMODE is set to PDO::ERRMODE_WARNING .
Throws a PDOException if the attribute PDO::ATTR_ERRMODE is set to PDO::ERRMODE_EXCEPTION .
Examples
Example #1 SQL with no placeholders can be executed using PDO::query()
$sql = ‘SELECT name, color, calories FROM fruit ORDER BY name’ ;
foreach ( $conn -> query ( $sql ) as $row ) print $row [ ‘name’ ] . «\t» ;
print $row [ ‘color’ ] . «\t» ;
print $row [ ‘calories’ ] . «\n» ;
>
?>?php
The above example will output:
apple red 150 banana yellow 250 kiwi brown 75 lemon yellow 25 orange orange 300 pear green 150 watermelon pink 90
See Also
- PDO::exec() — Execute an SQL statement and return the number of affected rows
- PDO::prepare() — Prepares a statement for execution and returns a statement object
- PDOStatement::execute() — Executes a prepared statement