PHP Australia Conference 2015

Класс PDOStatement

(PHP 5 >= 5.1.0, PECL pdo >= 1.0.0)

Введение

Представляет подготовленный запрос к базе данных, а после выполнения запроса соответствующий результирующий набор.

Обзор классов

PDOStatement implements Traversable {
/* Свойства */
readonly string $queryString;
/* Методы */
bool bindColumn ( mixed $column , mixed &$param [, int $type [, int $maxlen [, mixed $driverdata ]]] )
bool bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
bool bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
bool closeCursor ( void )
int columnCount ( void )
bool debugDumpParams ( void )
string errorCode ( void )
array errorInfo ( void )
bool execute ([ array $input_parameters ] )
mixed fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )
array fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )
string fetchColumn ([ int $column_number = 0 ] )
mixed fetchObject ([ string $class_name = "stdClass" [, array $ctor_args ]] )
mixed getAttribute ( int $attribute )
array getColumnMeta ( int $column )
bool nextRowset ( void )
int rowCount ( void )
bool setAttribute ( int $attribute , mixed $value )
bool setFetchMode ( int $mode )
}

Свойства

queryString

Использованная строка запроса.

Содержание

  • PDOStatement::bindColumn — Связывает столбец с PHP переменной
  • PDOStatement::bindParam — Привязывает параметр запроса к переменной
  • PDOStatement::bindValue — Связывает параметр с заданным значением
  • PDOStatement::closeCursor — Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
  • PDOStatement::columnCount — Возвращает количество столбцов в результирующем наборе
  • PDOStatement::debugDumpParams — Вывод информации о подготовленной SQL команде в целях отладки
  • PDOStatement::errorCode — Определяет SQLSTATE код соответствующий последней операции объекта PDOStatement
  • PDOStatement::errorInfo — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
  • PDOStatement::execute — Запускает подготовленный запрос на выполнение
  • PDOStatement::fetch — Извлечение следующей строки из результирующего набора
  • PDOStatement::fetchAll — Возвращает массив, содержащий все строки результирующего набора
  • PDOStatement::fetchColumn — Возвращает данные одного столбца следующей строки результирующего набора
  • PDOStatement::fetchObject — Извлекает следующую строку и возвращает ее в виде объекта
  • PDOStatement::getAttribute — Получение значения атрибута запроса PDOStatement
  • PDOStatement::getColumnMeta — Возвращает метаданные столбца в результирующей таблице
  • PDOStatement::nextRowset — Переход к следующему набору строк в результате запроса
  • PDOStatement::rowCount — Возвращает количество строк, модифицированных последним SQL запросом
  • PDOStatement::setAttribute — Присваивает атрибут объекту PDOStatement
  • PDOStatement::setFetchMode — Задает режим выборки по умолчанию для объекта запроса
add a note add a note

User Contributed Notes 2 notes

up
1
luis-m-cardoso at ext dot ptinovacao dot pt
1 year ago
Solved ;)

<?php

$host
= "yourHost";
$user = "yourUser";
$pass = "yourPass";
$db = "yourDB";

$cursor = "cr_123456";

try
{
 
$dbh = new PDO("pgsql:host=$host;port=5432;dbname=$db;user=$user;password=$pass");
  echo
"Connected<p>";
}
catch (
Exception $e)
{
  echo
"Unable to connect: " . $e->getMessage() ."<p>";
}

$dbh->beginTransaction();

$query = "SELECT yourFunction(0::smallint,'2013-08-01 00:00','2013-09-01 00:00',1::smallint,'$cursor')";

$dbh->query($query);

$query = "FETCH ALL IN \"$cursor\"";

echo
"begin data<p>";

foreach (
$dbh->query($query) as $row)
{
    echo
"$row[0] $row[1] $row[2] <br>";
}

echo
"end data";

?>
up
-7
rosko at zeta dot org dot au
4 years ago
There are many references around for returning a refcursor from a pgSQL function using pg_query. All essentially boil down to executing the following single statement (or some variation of it):

begin; select yourFunction(params...); fetch all in cursorname; commit;

In PDO, this doesn't work because PDO won't allow multiple statements submitted as a single statement (due to SQL injection detection). Instead, try this or similar:

<?php
$sql
= 'select yourFunction(params...)';
$db = new PDO('pgsql:dbname=yourDBname');
$db->beginTransaction();
$cmd = $db->prepare($sql);
if (
$cmd->execute()) {
  if (
$query = $db->query('fetch all in cursorname')) {
    ...
processing...
   
$query->closeCursor();
   
$cmd->closeCursor();
  }
}
$db->commit();
?>
To Top