PHP 7.4.8 Released!


(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)

PDO::query Выполняет SQL-запрос и возвращает результирующий набор в виде объекта PDOStatement


public PDO::query ( string $statement ) : PDOStatement
public PDO::query ( string $statement , int $fetch_style = PDO::FETCH_COLUMN , int $colno ) : PDOStatement
public PDO::query ( string $statement , int $fetch_style = PDO::FETCH_CLASS , string $classname , array $ctorargs ) : PDOStatement
public PDO::query ( string $statement , int $fetch_style = PDO::FETCH_INTO , object $object ) : PDOStatement

PDO::query() выполняет SQL-запрос без подготовки и возвращает результирующий набор (если есть) в виде объекта PDOStatement.

Если запрос будет запускаться многократно, для улучшения производительности приложения имеет смысл этот запрос один раз подготовить методом PDO::prepare(), а затем запускать на выполнение методом PDOStatement::execute() столько раз, сколько потребуется.

Если после выполнения предыдущего запроса вы не выбрали все данные из результирующего набора, следующий вызов PDO::query() может потерпеть неудачу. В таких случаях следует вызывать метод PDOStatement::closeCursor(), который освободит ресурсы базы данных, занятые предыдущим объектом PDOStatement. После этого можно безопасно вызывать PDO::query().


Если передано более двух аргументов, то они будут обработаны, как если бы вы вызвали PDOStatement::setFetchMode() применительно к возвращаемому объекту.

Список параметров


SQL-запрос для подготовки и выполнения.

Данные в запросе должны быть правильно экранированы.

Возвращаемые значения

PDO::query() возвращает объект PDOStatement или FALSE, если запрос выполнить не удалось.


Пример #1 Демонстрация работы PDO::query

Приятной особенностью PDO::query() является то, что после выполнения запроса SELECT можно сразу работать с результирующим набором посредством курсора.

'SELECT name, color, calories FROM fruit ORDER BY name';
foreach (
$conn->query($sql) as $row) {
$row['name'] . "\t";
$row['color'] . "\t";
$row['calories'] . "\n";

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

apple   red     150
banana  yellow  250
kiwi    brown   75
lemon   yellow  25
orange  orange  300
pear    green   150
watermelon      pink    90

Смотрите также

  • PDO::exec() - Выполняет SQL-запрос и возвращает количество затронутых строк
  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение

add a note add a note

User Contributed Notes 6 notes

fredrik at NOSPAM dot rambris dot com
13 years ago
The handling of errors by this function is controlled by the attribute PDO::ATTR_ERRMODE.

Use the following to make it throw an exception:
dozoyousan at gmail dot com
14 years ago
> When query() fails, the boolean false is returned.

I think that is "Silent Mode".
If that set attribute ErrorMode "Exception Mode"
then that throw PDOException.
$pdoObj = new PDO( $dsn, $user, $pass );
marcos at marcosregis dot com
11 years ago
After a lot of hours working with DataLink on Oracle->MySQL and PDO we (me and Adriano Rodrigues, that solve it) discover that PDO (and oci too) need the attribute AUTOCOMMIT set to FALSE to work correctly with.
There's  3 ways to set autocommit to false: On constructor, setting the atribute after construct and before query data or initiating a Transaction (that turns off autocommit mode)

The examples:
// First way - On PDO Constructor
$options = array(PDO::ATTR_AUTOCOMMIT=>FALSE);

$pdo = new PDO($dsn,$user,$pass,$options);

// now we are ready to query DataLinks


// Second Way - Before create statements
$pdo = new PDO($dsn,$user,$pass);

// or

// now we are ready to query DataLinks

To use DataLinks on oci just use OCI_DEFAULT on oci_execute() function;
stefano[dot]bertoli [at] gmail[dot]com
5 years ago
Trying to pass like second argument PDO::FETCH_ASSOC it still work.

So passing FETCH TYPE like argument seems work.

This save you from something like:

= $stmt->setFetchMode(PDO::FETCH_NUM);

= $db->query('SELECT * FROM `mytable` WHERE true', PDO::FETCH_ASSOC);

andrea at bhweb dot it
11 years ago
If someone is suffering of the "MySQL server has gone away" problem after executing multiple queries, this is a solution that solved it for me. It's similar to the one needed for the exact same problem in mysqli.

do {
$stmt->fetch(); $stmt->closeCursor(); ++$line; } while($stmt-

I found this only works using prepare and execute this way, not if you
directly execute the query with query().
11 months ago
The Documentation doesn’t mention this, but you can use a fetch style as a second parameter. For example:

$data as $row) {
//    etc
To Top