Tipi di cursore (driver PDO_SQLSRV)
Il driver PDO_SQLSRV consente di creare set di risultati scorrevoli con uno dei diversi cursori disponibili.
Per informazioni su come specificare un cursore con il driver PDO_SQLSRV e per esempi di codice, vedere PDO::prepare.
PDO_SQLSRV e cursori lato server
Nelle versioni dei Driver Microsoft per PHP per SQL Server precedenti alla 3.0, il driver PDO_SQLSRV consente di creare un set di risultati con un cursore statico o forward-only lato server. A partire dalla versione 3.0 dei driver Microsoft per PHP per SQL Server, sono disponibili anche keyset e cursori dinamici.
È possibile indicare il tipo di cursore lato server usando PDO::prepare per selezionare uno dei tipi di cursore seguenti:
PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
È possibile richiedere un cursore dinamico, statico o keyset specificando PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
e quindi passando il valore appropriato a PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
. I valori che è possibile passare a PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
per i cursori lato server sono i seguenti:
PDO::SQLSRV_CURSOR_DYNAMIC
PDO::SQLSRV_CURSOR_STATIC
PDO::SQLSRV_CURSOR_KEYSET
PDO_SQLSRV e cursori lato client
I cursori lato client sono stati aggiunti nella versione 3.0 dei driver Microsoft per PHP per SQL Server e consentono di memorizzare nella cache un intero set di risultati in memoria. Un vantaggio è rappresentato dal fatto che dopo l'esecuzione di una query è disponibile il numero delle righe.
È consigliabile usare i cursori lato client per set di risultati di piccole e medie dimensioni. Per set di risultati di grandi dimensioni, usare i cursori lato server.
Quando si usa un cursore lato client, se le dimensioni del buffer non sono sufficienti a contenere un intero set di risultati, una query restituirà false. Si possono aumentare le dimensioni del buffer fino al limite di memoria di PHP.
È possibile configurare le dimensioni del buffer contenente il set di risultati con l'attributo PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE
di PDO::setAttribute o PDOStatement::setAttribute. Le dimensioni massime del buffer possono anche essere impostate nel file php.ini con pdo_sqlsrv.client_buffer_max_kb_size (ad esempio, pdo_sqlsrv.client_buffer_max_kb_size = 1024).
È possibile richiedere un cursore lato client con PDO::prepare, specificando il tipo di cursore PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
e quindi PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED
.
Esempio
L'esempio seguente illustra come specificare un cursore con buffer.
<?php
$database = "AdventureWorks";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", "", "");
$query = "select * from Person.ContactType";
$stmt = $conn->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED));
$stmt->execute();
print $stmt->rowCount();
echo "\n";
while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
print "$row[Name]\n";
}
echo "\n..\n";
$row = $stmt->fetch( PDO::FETCH_BOTH, PDO::FETCH_ORI_FIRST );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, 1 );
print "$row[Name]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT );
print "$row[1]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR );
print "$row[1]..\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_ABS, 0 );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_LAST );
print_r($row);
?>