downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

PDOStatement->fetchAll> <PDOStatement->execute
Last updated: Fri, 06 Nov 2009

view this page in

PDOStatement->fetch

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

PDOStatement->fetch 結果セットから次の行を取得する

説明

mixed PDOStatement::fetch ([ int $fetch_style = PDO::FETCH_BOTH [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )

PDOStatementオブジェクトに関連付けられた結果セットから1行取得します。 fetch_style パラメータは、PDO がその行をどの様に返すかを決定します。

パラメータ

fetch_style

次のレコードを呼び出し元に返す方法を制御します。 この値は、PDO::FETCH_* 定数のどれかで、 PDO::FETCH_BOTHがデフォルトです。

  • PDO::FETCH_ASSOC: は、結果セットに 返された際のカラム名で添字を付けた配列を返します。

  • PDO::FETCH_BOTH (デフォルト): 結果セットに返された際のカラム名と 0 で始まるカラム番号で添字を付けた配列を返します。

  • PDO::FETCH_BOUND: TRUE を返し、結果セットのカラムの値を PDOStatement::bindColumn() メソッドでバインドされた PHP 変数に代入します。

  • PDO::FETCH_CLASS: 結果セットのカラムがクラス内の名前付けされたプロパティに マッピングされている、要求されたクラスの新規インスタンスを返します。 fetch_style に PDO::FETCH_CLASSTYPE が 含まれている場合 (例: PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE) は、最初のカラムの値から クラス名を決定します。

  • PDO::FETCH_INTO: 結果セットのカラムがクラス内の名前付けされたプロパティに マッピングされている要求された既存インスタンスを更新します。

  • PDO::FETCH_LAZY: PDO::FETCH_BOTHPDO::FETCH_OBJの 組合せで、オブジェクト変数名を作成します。

  • PDO::FETCH_NUM: 結果セットに返された際の 0 から始まるカラム番号を添字とする配列を返します。

  • PDO::FETCH_OBJ: 結果セットに返された際のカラム名と同名のプロパティを有する 匿名のオブジェクトを返します。

cursor_orientation

スクロール可能なカーソルを表す PDOStatement オブジェクトの場合、 この値により呼び出し側に返される行を定義します。 この値は、PDO::FETCH_ORI_* 定数のどれかと する必要があり、 PDO::FETCH_ORI_NEXT がデフォルトとなっています。 PDOStatement に対してスクロール可能なカーソルを要求するためには、 PDO::prepare() を用いて SQL ステートメントを 準備する際、 PDO::CURSOR_SCROLLPDO::ATTR_CURSOR 属性を設定する必要があります。

offset

スクロール可能なカーソルを表すPDOStatementオブジェクトの場合で、 cursor_orientationパラメータが PDO::FETCH_ORI_ABSに設定された場合、この値により 取得される結果セットの行の絶対位置が指定されます。

スクロール可能なカーソルを表すPDOStatementオブジェクトの場合で、 cursor_orientationパラメータが PDO::FETCH_ORI_RELに設定された場合、この値は、 PDOStatement::fetch() がコールされる前のカーソルの 位置を基準として取得する行の位置を指定します。

返り値

この関数が成功した場合の返り値は、取得形式によって異なります。 失敗した場合は常に FALSE を返します。

例1 異なる取得方法で行を取得する

<?php
$sth 
$dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Exercise PDOStatement::fetch styles */
print("PDO::FETCH_ASSOC: ");
print(
"Return next row as an array indexed by column name\n");
$result $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);
print(
"\n");

print(
"PDO::FETCH_BOTH: ");
print(
"Return next row as an array indexed by both column name and number\n");
$result $sth->fetch(PDO::FETCH_BOTH);
print_r($result);
print(
"\n");

print(
"PDO::FETCH_LAZY: ");
print(
"Return next row as an anonymous object with column names as properties\n");
$result $sth->fetch(PDO::FETCH_LAZY);
print_r($result);
print(
"\n");

print(
"PDO::FETCH_OBJ: ");
print(
"Return next row as an anonymous object with column names as properties\n");
$result $sth->fetch(PDO::FETCH_OBJ);
print 
$result->NAME;
print(
"\n");
?>

上の例の出力は以下となります。

PDO::FETCH_ASSOC: Return next row as an array indexed by column name
Array
(
    [NAME] => apple
    [COLOUR] => red
)

PDO::FETCH_BOTH: Return next row as an array indexed by both column name and number
Array
(
    [NAME] => banana
    [0] => banana
    [COLOUR] => yellow
    [1] => yellow
)

PDO::FETCH_LAZY: Return next row as an anonymous object with column names as properties
PDORow Object
(
    [NAME] => orange
    [COLOUR] => orange
)

PDO::FETCH_OBJ: Return next row as an anonymous object with column names as properties
kiwi

例2 スクロール可能なカーソルで行を取得する

<?php
function readDataForwards($dbh) {
  
$sql 'SELECT hand, won, bet FROM mynumbers ORDER BY BET';
  try {
    
$stmt $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    
$stmt->execute();
    while (
$row $stmt->fetch(PDO::FETCH_NUMPDO::FETCH_ORI_NEXT)) {
      
$data $row[0] . "\t" $row[1] . "\t" $row[2] . "\n";
      print 
$data;
    }
    
$stmt null;
  }
  catch (
PDOException $e) {
    print 
$e->getMessage();
  }
}
function 
readDataBackwards($dbh) {
  
$sql 'SELECT hand, won, bet FROM mynumbers ORDER BY bet';
  try {
    
$stmt $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    
$stmt->execute();
    
$row $stmt->fetch(PDO::FETCH_NUMPDO::FETCH_ORI_LAST);
    do {
      
$data $row[0] . "\t" $row[1] . "\t" $row[2] . "\n";
      print 
$data;
    } while (
$row $stmt->fetch(PDO::FETCH_NUMPDO::FETCH_ORI_PRIOR));
    
$stmt null;
  }
  catch (
PDOException $e) {
    print 
$e->getMessage();
  }
}

print 
"Reading forwards:\n";
readDataForwards($conn);

print 
"Reading backwards:\n";
readDataBackwards($conn);
?>

上の例の出力は以下となります。

Reading forwards:
21    10    5
16    0     5
19    20    10

Reading backwards:
19    20    10
16    0     5
21    10    5

参考



PDOStatement->fetchAll> <PDOStatement->execute
Last updated: Fri, 06 Nov 2009
 
add a note add a note User Contributed Notes
PDOStatement->fetch
lod
17-Jul-2008 01:33
A quick one liner to get the first entry returned.  This is nice for very basic queries.

<?php
$count
= current($db->query("select count(*) from table")->fetch());
?>php
lozitskiys at gmail dot com
09-Jul-2008 09:21
I spent some hours trying to find out how to manipulate with BLOB fields using PDO.

Remember that you can't retreive BLOB data using something like this :

<?php
$sql
= 'SELECT * FROM sometable LIMIT 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$stmt->setAttribute(PDO::FETCH_ASSOC);
$row = $stmt->fetch();

$myFile = $row['file'];
?>

Instead of this you should try following approach:

<?php
$sql
= "SELECT mime, file FROM sometable LIMIT 1";
$stmt = $dbh->prepare($sql);
$stmt->execute();

$stmt->bindColumn(1, $mime,);
$stmt->bindColumn(2, $file, PDO::PARAM_LOB);

$stmt->fetch();

header('Content-type: '.$mime);
print
$file;

?>
josh
29-Apr-2008 04:02
Note that PDO::ATTR_STRINGIFY_FETCHES will NOT work for the MySQL driver. MySQL will always return strings because that is the behaviour of the core mysql PHP extension. See http://bugs.php.net/bug.php?id=44341
daltenho at yahoo dot com
29-Jan-2008 02:17
As an alternative to marcini's suggestion:

You can use:

        $dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

...on your PDO connection object to allow query buffering in MySQL. This will eliminate the problem of re-preparing an unclosed statement object.
Gerard van Beek
28-Oct-2007 06:42
If you to use a new instance of a class for a record you can use:

<?php
include_once("user.class");
$sth = $db->prepare("SELECT * FROM user WHERE id = 1");

/* create instance automatically */
$sth->setFetchMode( PDO::FETCH_CLASS, 'user');
$sth->execute();
$user = $sth->fetch( PDO::FETCH_CLASS );
$sth->closeCursor();
print (
$user->id);

/* or create an instance yourself and use it */
$user= new user();
$sth->setFetchMode( PDO::FETCH_INTO, $user);
$sth->execute();
$user= $sth->fetch( PDO::FETCH_INTO );
$sth->closeCursor();
print (
$user->id);
?>
BaBna
17-Aug-2007 04:52
When you do a SELECT query for one row, and want to check if it's there, you don't need to count the fetchAll() result, you can just check if $result->fetch() is true:
<?php
$bbnq
= sprintf("SELECT login
FROM users
WHERE id = %u"
,27);
try
    {
$req = $db_bbn->query($bbnq); }
catch (
Exception $e)
    {
bbnf_pdo_error($e,__FILE__,__LINE__); }
if (
$r = $req->fetch() )
    { echo
"This query has a row result"; }
else
    { echo
"This query has an empty result"; }
?>
jdriddle_producer at yahoo dot com
09-Aug-2007 09:33
Oops...

The constants are no longer PDO_FETCH_*

They are now class contants PDO::FETCH_*

The documentation above need to be changed appropriately.
jdriddle_producer at yahoo dot com
09-Aug-2007 09:28
>> note that fetch constants are not included in the PDO class for PHP versions prior to 5.1

They appear to not exist in 5.2.3 either, as I am getting the following error:

Notice: Use of undefined constant PDO_FETCH_ASSOC - assumed 'PDO_FETCH_ASSOC' in C:\Documents and Settings\driddle.AUTISMSPEAKS.000\My Documents\ascentral\sqlite_test.php on line 36

Warning: PDOStatement::fetchAll() expects parameter 1 to be long, string given in C:\Documents and Settings\driddle.AUTISMSPEAKS.000\My Documents\ascentral\sqlite_test.php on line 36'

Code to reproduce:

// retrieve and output info from db
$sqlGetEvent = 'SELECT * from calendarItem';
$result = $dbHandle->query($sqlGetEvent);
$data = $result->fetchAll(PDO_FETCH_ASSOC);
dennis at inmarket dot lviv dot ua
07-Apr-2007 10:18
Regarding the two previous notes - I downloaded the "latest CVS" a week ago for Windows and was surprised to notice that this issue is gone there, ie you don't have to close cursor before doing next query.
redcube
05-Apr-2007 06:53
as an alternative for marcini's note:

just clear the statement variable before you issue another query:

<?php

$stmt
= $db->prepare('SELECT * FROM test');

// fetch only the first row
$row = $stmt->fetch(PDO::FETCH_ASSOC);

// clear the variable so its contents are destroyed (including the other rows in the result)
$stmt = null;

// now you can issue another query
$stmt = $db->prepare('SELECT * FROM test2');
?>
marcini
02-Apr-2007 08:41
Be careful with fetch() when you use prepared statements and MySQL (I don`t know how it is with other databases). Fetch won`t close cursor and won`t let you send any other query, even if your result set has only one row, .
If you use $statement->fetch(), you will also have to use $statement->closeCursor() afterwards, to be albe to execute another query.
Alternatively you can use $statement->fetchAll() without $statement->closeCursor().
terry at bitsoup dot com
03-Mar-2006 05:46
WARNING:
fetch() does NOT adhere to SQL-92 SQLSTATE standard when dealing with empty datasets.

Instead of setting the errorcode class to 20 to indicate "no data found", it returns a class of 00 indicating success, and returns NULL to the caller.

This also prevents the exception mechainsm from firing.

Programmers will need to explicitly code tests for empty resultsets after any fetch*() instead of relying on the default behavior of the RDBMS.

I tried logging this as a bug, but it was dismissed as "working as intended". Just a head's up.
avinoamr at gmail dot com
20-Jan-2006 07:48
Note that using the FETCH_CLASS mechanism does NOT trigger the class's constructor! You must explicity instantiate the class to use it's constructor behavior.
fh at ez dot no
25-Nov-2005 05:13
I can also add that the constructor is run _after_ the data is set on the object if yo use PDO::FETCH_CLASS.
fh at ez dot no
25-Nov-2005 04:58
If you want to use PDO::FETCH_CLASS you need to set it up with setFetchMode first like so:
        $stmt->setFetchMode( PDO::FETCH_CLASS, 'classType', array( 'parameters to constructor' );
        $object = $stmt->fetch( PDO::FETCH_CLASS );
If you ommit this PHP will segfault.
aledmb at gmail dot com
22-Oct-2005 02:22
note that fetch constants are not included in the PDO class for PHP versions prior to 5.1

PDOStatement->fetchAll> <PDOStatement->execute
Last updated: Fri, 06 Nov 2009
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites