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

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
walik55
рядовой
Сообщения: 21
Зарегистрирован: 2014-10-26 10:22:41
Откуда: Город над вольной Невой

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

Непрочитанное сообщение walik55 » 2019-02-01 12:17:06

Народ, подскажите!
С 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
Это бага или фича? И вообще, ЧЯДН?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/