Страница 1 из 1

PDO в php72 затирание результата предыдущего запроса при открытии базы в режиме FETCH_LAZY бага или фича?

Добавлено: 2019-02-01 12:17:06
walik55
Народ, подскажите!
С PDO для php столкнулся недавно, поэтому, если неправ, сильно тапками не кидайтесь. Итак...
Имеется FreeBSD 11.2-RELEASE-p8, на ней
apache24-2.4.37
freetds-1.00.109,1
php72-7.2.14
php72-pdo-7.2.14
php72-pdo_dblib-7.2.14
Полный список установленных модулей php не привожу для экономии места.
Собственно, в процессе ознакомления с PDO натолкнулся на непонятное.

Код: Выделить всё

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
 </head>
 <body>
  <?php 
$host='mssql'
$dbname='testbase';
$user='guest1';
$psw='guest1';
$opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_LAZY, 
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
$dsn= "dblib:host=$host;dbname=$dbname";

try {
 $db_link = new PDO($dsn, $user, $psw, $opt);
}
catch (PDOException $e) {
 echo "Failed to get DB handle: " . $e->getMessage() . "\n";
 exit;
}

print "<b>Успешное подключение к БД!</b><br>"; 

$clientId=879;
$query="SELECT [name], [pst], [officeid]  FROM [dbo].[Clients] WHERE [clientid]=?";

$stmt1 = $db_link->prepare($query);
$stmt1->execute(array($clientId));
$line1 = $stmt1->fetch();
print_r ($line1); print ('<br>');
print ('111  '.$line1['name'].';'.$line1['pst'].';'.$line1['officeid'].'<br><br>');

$id=$line1['officeid'];
$query3="SELECT [pid], [name] FROM [dbo].[offices] WHERE [id]=?";

$stmt3 = $db_link->prepare($query3);
$stmt3->execute(array($id));
$line = $stmt3->fetch();
print_r ($line); print ('<br>');
print ('line='.$line['pid'].';'.$line['name'].'<br>');

print ('<br>');
print_r ($line1); print ('<br>');
print ('222  '.$line1['name'].';'.$line1['pst'].';'.$line1['officeid'].'<br>');
Содержимое таблиц базы, в общем, не важно. Отмечу только, что каждый из запросов возвращает только одну строку.
При выполнении, получаю:

Код: Выделить всё

Успешное подключение к БД!
PDORow Object ( [queryString] => SELECT [name], [pst], [officeid] FROM [dbo].[Clients] WHERE clientid=? [name] => Иванов Иван Иванович [pst] => Электроник [officeid] => 56 )
111 Иванов Иван Иванович;Электроник;56

PDORow Object ( [queryString] => SELECT pid, name FROM dbo.offices WHERE [id]=? [pid] => 154 [name] => Цех связи )
line=154;Цех связи

PDORow Object ( [queryString] => SELECT [name], [pst], [officeid] FROM [dbo].[Clients] WHERE clientid=? [name] => 154 [pst] => Цех связи [officeid] => )
222 154;Цех связи;
Никак не могу понять, почему значения $line1 изменились после выполнения второго запроса (результат выполнения операторов print 111 и 222)?
Если изменить опцию открытия базы, например на PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, эффект пропадает.

Код: Выделить всё

Успешное подключение к БД!
Array ( [name] => Иванов Иван Иванович [pst] => Электроник [officeid] => 56 )
111 Иванов Иван Иванович;Электроник;56

Array ( [pid] => 154 [name] => Цех связи )
line=154;Цех связи

Array ( [name] => Иванов Иван Иванович [pst] => Электроник [officeid] => 56 )
222 Иванов Иван Иванович;Электроник;56
Это бага или фича? И вообще, ЧЯДН?