powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PDO Firebird bugs
22 сообщений из 222, страница 9 из 9
PDO Firebird bugs
    #40072924
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

а нельзя всё-таки начать читать
http://www.ibase.ru/files/articles/firebird_examples/how_to_create_application_firebird_php.pdf
с самого начала, и внимательно особенно с 12й страницы?
Раз автокоммит убран, значит транзакции надо самому стартовать и завершать.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072943
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_
При попытке явного управления из статьи выдаёт странную ошибку:
Код: php
1.
2.
3.
$db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  PDO::ATTR_PERSISTENT => true]);
$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED NO WAIT");


Код: plaintext
1.
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: -104 Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 61 WAIT


а какую версию PHP и firebird вы используете? У меня всё работает

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
try {
  $sql = <<<'SQL'
SELECT
    T.MON$TRANSACTION_ID AS TRANSACTION_ID,
    T.MON$TIMESTAMP AS START_DATE,
    TRIM(CASE
      WHEN T.MON$ISOLATION_MODE = 0 THEN 'CONSISTENCY'
      WHEN T.MON$ISOLATION_MODE = 1 THEN 'CONCURRENCY'
      WHEN T.MON$ISOLATION_MODE = 2 THEN 'READ COMMITTED RECORD VERSION'
      WHEN T.MON$ISOLATION_MODE = 3 THEN 'READ COMMITTED NO RECORD VERSION'
      WHEN T.MON$ISOLATION_MODE = 4 THEN 'READ COMMITTED READ CONSISTENCY'
    END) AS ISOLATION_MODE,
    TRIM(CASE
      WHEN T.MON$LOCK_TIMEOUT = -1 THEN 'Infinite wait'
      WHEN T.MON$LOCK_TIMEOUT = 0 THEN 'No wait'
      WHEN T.MON$LOCK_TIMEOUT > 0 THEN 'Timeout ' || MON$LOCK_TIMEOUT
    END) AS LOCK_TIMEOUT,
    TRIM(CASE
      WHEN T.MON$READ_ONLY = 1 THEN 'READ'
      ELSE 'READ WRITE'
    END) AS READ_ONLY,
    (T.MON$AUTO_COMMIT = 1) AS AUTO_COMMIT,
    (T.MON$AUTO_UNDO = 1) AS AUTO_UNDO
FROM MON$TRANSACTIONS T  
WHERE T.MON$TRANSACTION_ID = CURRENT_TRANSACTION
SQL;  
	
  $db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
  $db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
  $db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED RECORD_VERSION NO WAIT");
  $query = $db->prepare($sql);
  $query->execute();
  $row = $query->fetchObject();
  $query->closeCursor();
  $db->exec("COMMIT");
  echo '<pre>';
  var_dump($row);
  echo '</pre>';
}
catch(Throwable $e) {
	echo $e->getMessage();
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
object(stdClass)#3 (7) {
  ["TRANSACTION_ID"]=>
  int(34418)
  ["START_DATE"]=>
  string(19) "2021-05-25 23:06:51"
  ["ISOLATION_MODE"]=>
  string(29) "READ COMMITTED RECORD VERSION"
  ["LOCK_TIMEOUT"]=>
  string(7) "No wait"
  ["READ_ONLY"]=>
  string(4) "READ"
  ["AUTO_COMMIT"]=>
  bool(false)
  ["AUTO_UNDO"]=>
  bool(true)
}

Нормально PDO с Firebird можно использовать начиная с PHP 7.4, в предыдущих версиях было полно багов. Я сам штуки 4 пофиксил.
А в 8.0 ещё одну.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40073225
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис

а какую версию PHP и firebird вы используете? У меня всё работает

самый свежи php 8.0.6
FB2.0.7 диалект 1
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40073226
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
avp_,
а нельзя всё-таки начать читать
http://www.ibase.ru/files/articles/firebird_examples/how_to_create_application_firebird_php.pdf
с самого начала, и внимательно особенно с 12й страницы?
Раз автокоммит убран, значит транзакции надо самому стартовать и завершать.

Всё это прочитано, но толком не понято. Просто по своему названию "AUTOCOMMIT" следует думать что он влияет только на алгоритм коммита.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40077360
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
я тут писал как задавать уровень изолированности транзакции

https://habr.com/ru/post/317458/



Как - писал, а зачем - нет.

Всё это было не раз и к сожаленью
Всё повторится, всё повторится,
Я только время поменяю и лица...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40078621
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появились ещё вопросы:
1. Почему тип дата-время возвращается строкой, а не объектом DateTime ?

2. Верно ли я понимаю что блобы попавшие в выборку автоматически целиком загружаются при каждом фетче?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40078632
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

1. потому что в PHP DateTime кастрированный. Посмотри его диапазон значений и сравни с диапазоном в Firebird.
2. верно, хотя кое что можно было бы докрутить
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40108999
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, но такой запрос вызвает падение процесса php:
Код: php
1.
$db->exec("select RDB\$SET_CONTEXT('USER_SESSION', 'TEST', 1) from rdb\$database");


В то время как через prepare - выполняется.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111094
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно биндить параметры имеющие тип дата-время?
При попытке передать строкой выдаёт ошибку "General error: -804 Dynamic SQL Error SQL error code = -804 Incorrect values within SQLDA structure"
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111103
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

пример кода дашь, что ты делаешь, тогда может и подскажу
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111121
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, косяк бы в другом - при пропущенном параметре странное сообщение об ошибке.
Но небольшой вопрос остаётся - почему нельзя в параметр записать тип php DateTime а надо преобразовывать в строку понимаемую сервером.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111167
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

Отвечал уже. Посмотри какой диапазон дат поддерживает пыховский тип и какой фб
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111169
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще странно что все пытаются напрямую голый пдо юзать. Ну напишите вы обертку вокруг него которая будет нужные вам преобразования делать
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111520
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Вообще странно что все пытаются напрямую голый пдо юзать. Ну напишите вы обертку вокруг него которая будет нужные вам преобразования делать

А что такого в голом pdo? Всё вроде пока устраивает кроме работы с датами. Обёртку писать только ради них как то лениво.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133563
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выявил некоторые странности при работе с транзациями через PDO.

1. Если установлен PDO::ATTR_AUTOCOMMIT=> true, то автокоммит делается не после каждого запроса, а только после каждого МОДИФИЦИРУЮЩЕГО запроса. Как он определяет что запроса модифицируюций - х.з. Наступил на грабли когда в цикле опрашивал таблицу селектами, а транзация по дефлоту снапшот и не коммитилась.

2. Если установлен PDO::ATTR_AUTOCOMMIT=> true, то в блоке между PDO::beginTransaction и PDO::commit автокоммит всё равно работает для модифицирующих операторов. Вот это весьма странно. Т.е. в этом случае beginTransaction нельзя использовать.

3. Если установлен PDO::ATTR_AUTOCOMMIT=> false, то без без beginTransaction ни один оператор не сработает, даже селект. Также если не было нигде commit, то при окончании скрипта транзакция откатывается. Вроде бы логично. Но непонятно тогда что в случае если в скрипте были только чтения - тоже роллбэк будет?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133564
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автокоммит - ЗЛО
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133599
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
автокоммит - ЗЛО


Это да. Но как то неохота в конце каждого скрипта вставлять $db->commit(); Хотя может оно будет и правильно...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133631
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
автокоммит - ЗЛО

ой, люто плюсую...

зы
лет пять назад понадобилось из golang в fb ходить, решение которое было на тот момент (по моему до сих пор другого не появилось) использовало параметры транзакции как в fb/ib по умолчанию повелось, стартует транзакция по умолчанию (не php, висеть долго будет), отдельно можно стартануть транзакцию, но параметры ей задать нельзя (на тот момент)...
пришлось выкручиваться - прикрутили параметры транзации в параметры соединения, так и жевет это по сей день с двумя пулами коннетов - на чтение и на запись ))
костыль? еще какой!
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133778
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема то в том что по умолчанию автокоммит включен.
Итого пока остановился на такой схеме работы:
1. PDO::ATTR_AUTOCOMMIT=> false
2. создаём базу $db = new PDO(....)
3. сразу затем вызываем $db->beginTransaction();
4. С помощью register_shutdown_function регистрируем функцию которая делает $db->commit();
Итого все скрипты работают в одной транзакции которая автокоммитится при завершении. Для особых случае планируется сделать доп. флаг: aвтокоммит/автороллбэк.
5. Ещё желательно сделать какой то флаг чтобы скрипт явно декларировал потребность в rw транзакции и чтобы по дефлоту транзакция была read_only.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40135203
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то никак у меня не запускаются транзакции вручную:
Код: php
1.
2.
$db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  PDO::ATTR_PERSISTENT => true, PDO::ATTR_AUTOCOMMIT=> false]);
$db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED RECORD_VERSION NO WAIT");  



Выдаёт ошибку:
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: PDO->exec('SET TRANSACTION...')

Пробовал FB2.0-2.5, диалекты 1,3 - нигде не получается.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40135222
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

версия php какая?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40135298
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8.0.6
...
Рейтинг: 0 / 0
22 сообщений из 222, страница 9 из 9
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PDO Firebird bugs
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]