php-sqlsrv/test/pdo_sqlsrv/pdostatement_fetchmode_emulate_prepare.phpt
2017-05-04 08:14:10 -07:00

264 lines
5.7 KiB
PHP

--TEST--
PDO Fetch Mode Test with emulate prepare
--DESCRIPTION--
Basic verification for "PDOStatement::setFetchMode()”.
--ENV--
PHPT_EXEC=true
--SKIPIF--
<?php require('skipif.inc'); ?>
--FILE--
<?php
include 'MsCommon.inc';
function FetchMode()
{
include 'MsSetup.inc';
$testName = "PDO Statement - Set Fetch Mode";
StartTest($testName);
$dsn = "sqlsrv:Server=$server ; Database = $databaseName";
$conn1 = new PDO($dsn, $uid, $pwd);
$conn1->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// Prepare test table
CreateTableEx($conn1, $tableName, "ID int NOT NULL PRIMARY KEY, Policy VARCHAR(2), Label VARCHAR(10), Budget MONEY", null);
try {
$res = $conn1->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
if ($res)
{
echo "setAttribute should have failed.\n\n";
}
}
catch (Exception $e)
{
echo $e->getMessage();
}
echo "\n";
try {
$query = "SELECT * FROM [$tableName]";
$stmt = $conn1->query($query);
$stmt->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
}
catch (Exception $e)
{
echo $e->getMessage();
}
echo "\nStart inserting data...\n";
$dataCols = "ID, Policy, Label";
$query = "INSERT INTO [$tableName](ID, Policy, Label, Budget) VALUES (?, ?, ?, ?)";
$stmt = $conn1->prepare($query, array(PDO::ATTR_EMULATE_PREPARES => true));
$stmt = $conn1->prepare($query, array(PDO::ATTR_EMULATE_PREPARES => false));
for ($i = 1; $i <= 2; $i++)
{
$pol = chr(64+$i);
$grp = "Group " . $i;
$budget = $i * 1000 + $i * 15;
$stmt->execute( array( $i, $pol, $grp, $budget ) );
}
$query1 = "INSERT INTO [$tableName](ID, Policy, Label, Budget) VALUES (:col1, :col2, :col3, :col4)";
$stmt = $conn1->prepare($query1, array(PDO::ATTR_EMULATE_PREPARES => true));
for ($i = 3; $i <= 5; $i++)
{
$pol = chr(64+$i);
$grp = "Group " . $i;
$budget = $i * 1000 + $i * 15;
$stmt->execute( array( ':col1' => $i, ':col2' => $pol, ':col3' => $grp, ':col4' => $budget ) );
}
echo "....Done....\n";
echo "Now selecting....\n";
$tsql = "SELECT * FROM [$tableName]";
$stmt1 = $conn1->prepare($tsql, array(PDO::ATTR_EMULATE_PREPARES => false));
$stmt1 = $conn1->prepare($tsql, array(PDO::ATTR_EMULATE_PREPARES => true, PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt1->execute();
var_dump($stmt1->fetch( PDO::FETCH_ASSOC ));
$row = $stmt1->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT );
print "$row[1]\n";
$row = $stmt1->fetch( PDO::FETCH_LAZY, PDO::FETCH_ORI_LAST );
print "$row[3]\n";
$row = $stmt1->fetch( PDO::FETCH_BOTH, PDO::FETCH_ORI_PRIOR );
print_r($row);
echo "\nFirst two groups or Budget > 4000....\n";
$tsql = "SELECT * FROM [$tableName] WHERE ID <= :id OR Budget > :budget";
$stmt2 = $conn1->prepare($tsql, array(PDO::ATTR_EMULATE_PREPARES => true));
$budget = 4000;
$id = 2;
$stmt2->bindParam(':id', $id);
$stmt2->bindParam(':budget', $budget);
$stmt2->execute();
while ( $result = $stmt2->fetchObject() ){
print_r($result);
echo "\n";
}
echo "\nSelect Policy = 'A'....\n";
$tsql = "SELECT * FROM [$tableName] WHERE Policy = ?";
$stmt3 = $conn1->prepare($tsql, array(PDO::ATTR_EMULATE_PREPARES => true));
$pol = 'A';
$stmt3->bindValue(1, $pol);
$id = 'C';
$stmt3->execute();
while ( $row = $stmt3->fetch( PDO::FETCH_ASSOC ) ){
print_r($row);
echo "\n";
}
echo "\nSelect id > 2....\n";
$tsql = "SELECT Policy, Label, Budget FROM [$tableName] WHERE ID > 2";
$stmt4 = $conn1->prepare($tsql, array(PDO::ATTR_EMULATE_PREPARES => true));
$stmt4->execute();
$stmt4->bindColumn('Policy', $policy);
$stmt4->bindColumn('Budget', $budget);
while ( $row = $stmt4->fetch( PDO::FETCH_BOUND ) ){
echo "Policy: $policy\tBudget: $budget\n";
}
echo "\nBudget Metadata....\n";
$metadata = $stmt4->getColumnMeta(2);
var_dump($metadata);
// Cleanup
DropTable($conn1, $tableName);
$stmt1 = null;
$stmt2 = null;
$stmt3 = null;
$stmt4 = null;
$conn1 = null;
EndTest($testName);
}
class Test
{
function __construct($name = 'N/A')
{
echo __METHOD__ . "($name)\n";
}
}
//--------------------------------------------------------------------
// Repro
//
//--------------------------------------------------------------------
function Repro()
{
try
{
FetchMode();
}
catch (Exception $e)
{
echo $e->getMessage();
}
}
Repro();
?>
--EXPECT--
SQLSTATE[IMSSP]: The given attribute is only supported on the PDOStatement object.
SQLSTATE[IMSSP]: An invalid attribute was designated on the PDOStatement object.
Start inserting data...
....Done....
Now selecting....
array(4) {
["ID"]=>
string(1) "1"
["Policy"]=>
string(1) "A"
["Label"]=>
string(7) "Group 1"
["Budget"]=>
string(9) "1015.0000"
}
B
5075.0000
Array
(
[ID] => 4
[0] => 4
[Policy] => D
[1] => D
[Label] => Group 4
[2] => Group 4
[Budget] => 4060.0000
[3] => 4060.0000
)
First two groups or Budget > 4000....
stdClass Object
(
[ID] => 1
[Policy] => A
[Label] => Group 1
[Budget] => 1015.0000
)
stdClass Object
(
[ID] => 2
[Policy] => B
[Label] => Group 2
[Budget] => 2030.0000
)
stdClass Object
(
[ID] => 4
[Policy] => D
[Label] => Group 4
[Budget] => 4060.0000
)
stdClass Object
(
[ID] => 5
[Policy] => E
[Label] => Group 5
[Budget] => 5075.0000
)
Select Policy = 'A'....
Array
(
[ID] => 1
[Policy] => A
[Label] => Group 1
[Budget] => 1015.0000
)
Select id > 2....
Policy: C Budget: 3045.0000
Policy: D Budget: 4060.0000
Policy: E Budget: 5075.0000
Budget Metadata....
array(8) {
["flags"]=>
int(0)
["sqlsrv:decl_type"]=>
string(5) "money"
["native_type"]=>
string(6) "string"
["table"]=>
string(0) ""
["pdo_type"]=>
int(2)
["name"]=>
string(6) "Budget"
["len"]=>
int(19)
["precision"]=>
int(4)
}
Test "PDO Statement - Set Fetch Mode" completed successfully.