powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как получить значения BOOLEAN полей при подключении к Firebird из PHP
15 сообщений из 15, страница 1 из 1
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614742
EDIsaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Работаю через pdo_firebird. В ответах на запросы для полей типа boolean всегда возвращается NULL.
Каким образом это обойти?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$dsn = 'firebird:dbname=localhost:C:\...path...\dbname.FDB;charset=utf8;';
    $username = 'SYSDBA';
    $password = 'masterkey';
    $db = new \PDO($dsn, $username, $password, [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION]);
    $sql = 'SELECT * FROM tablename';
    // Выполняем запрос
    $query = $db->query($sql);
    while ($row = $query->fetch(\PDO::FETCH_OBJ)) {
	var_dump($row);	
    }
    $query->closeCursor(); // Закрываем курсор
  } catch (\PDOException $e) {
    echo $e->getMessage();
  }



FB: 3.0
PHP: v7.2.2
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614755
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> В ответах на запросы для полей типа boolean всегда возвращается NULL.

значения то там есть?
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614757
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDIsaev,

похоже драйвер firebird PDO до сих пор не знает о существовании нативного типа boolean
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614759
EDIsaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дегтярев Евгений,
ну естественно есть, иначе бы вопрос не возникал)
В IBExpert, например, тот же запрос корректно показывает значения этих полей
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614762
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

именно

Код: plaintext
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
			switch (var->sqltype & ~1) {
				struct tm t;
				char *fmt;

				case SQL_VARYING:
					*ptr = &var->sqldata[2];
					*len = *(short*)var->sqldata;
					break;
				case SQL_TEXT:
					*ptr = var->sqldata;
					*len = var->sqllen;
					break;
				case SQL_SHORT:
					*len = sizeof(zend_long);
					*ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
					*(zend_long *)*ptr = *(short*)var->sqldata;
					break;
				case SQL_LONG:
					*len = sizeof(zend_long);
					*ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
					*(zend_long *)*ptr = *(ISC_LONG*)var->sqldata;
					break;
				case SQL_INT64:
#if SIZEOF_ZEND_LONG >= 8 
					*len = sizeof(zend_long);
					*ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
					*(zend_long *)*ptr = *(ISC_INT64*)var->sqldata;
#else
					*ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
					*len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d", *(ISC_INT64*)var->sqldata);
#endif
					break;
				case SQL_FLOAT:
					*ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
					*len = slprintf(*ptr, CHAR_BUF_LEN, "%F", *(float*)var->sqldata);
					break;
				case SQL_DOUBLE:
					*ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
					*len = slprintf(*ptr, CHAR_BUF_LEN, "%F" , *(double*)var->sqldata);
					break;
				case SQL_TYPE_DATE:
					isc_decode_sql_date((ISC_DATE*)var->sqldata, &t);
					fmt = S->H->date_format ? S->H->date_format : PDO_FB_DEF_DATE_FMT;
					if (0) {
				case SQL_TYPE_TIME:
						isc_decode_sql_time((ISC_TIME*)var->sqldata, &t);
						fmt = S->H->time_format ? S->H->time_format : PDO_FB_DEF_TIME_FMT;
					} else if (0) {
				case SQL_TIMESTAMP:
						isc_decode_timestamp((ISC_TIMESTAMP*)var->sqldata, &t);
						fmt = S->H->timestamp_format ? S->H->timestamp_format : PDO_FB_DEF_TIMESTAMP_FMT;
					}
					/* convert the timestamp into a string */
					*len = 80;
					*ptr = FETCH_BUF(S->fetch_buf[colno], char, *len, NULL);
					*len = strftime(*ptr, *len, fmt, &t);
					break;
				case SQL_BLOB:
					return firebird_fetch_blob(stmt,colno,ptr,len,
						(ISC_QUAD*)var->sqldata);
			}
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614763
EDIsaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Дениспохоже драйвер firebird PDO до сих пор не знает о существовании нативного типа boolean
драйвер ibase тоже спотыкается на этих полях...
обходные пути то существуют?
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614765
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
багу без месяца год
https://bugs.php.net/bug.php?id=74462
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614766
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDIsaevСимонов Дениспохоже драйвер firebird PDO до сих пор не знает о существовании нативного типа boolean
драйвер ibase тоже спотыкается на этих полях...
обходные пути то существуют?

попробуй в запросе кастовать к числу
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614773
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

патч есть https://github.com/php/php-src/pull/2522 но как я понял он не доделан
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614776
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

как я понял патч выборку фиксит и не фиксит биндинг параметров
резонно не принят
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614780
EDIsaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дегтярев Евгенийпопробуй в запросе кастовать к числу
что-то у меня в запросе не получается кастовать
можно сделать вьюху и кастовать там конечно, если другого варианта нет
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614790
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDIsaev,

потому что каст boolean позволяется только к VAR[CHAR]

можно сделать что-то такое

Код: sql
1.
CASE WHEN BoolField THEN 1 WHEN NOT BoolField THEN 0 ELSE NULL END
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614823
EDIsaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисможно сделать что-то такое
Всё, благодарю, с этим жить можно)
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39614826
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDIsaev,

для сокращения писанины

Код: sql
1.
2.
3.
4.
5.
CREATE FUNCTION BOOL_TO_INT(ABool BOOLEAN) RETURNS SMALLINT
AS
BEGIN
  RETURN CASE WHEN ABool THEN 1 WHEN NOT ABool THEN 0 ELSE NULL END
END



применение

Код: sql
1.
2.
3.
4.
SELECT
  BOOL_TO_INT(BoolField1) AS BoolField1,
  BOOL_TO_INT(BoolField2) AS BoolField2
FROM T
...
Рейтинг: 0 / 0
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
    #39615683
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийкак я понял патч выборку фиксит и не фиксит биндинг параметров. резонно не принят
Я вот так не считаю :) в большенсте случае используется выборка, не то что прямо редкость бул парамы. Если будет время может доделаю.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как получить значения BOOLEAN полей при подключении к Firebird из PHP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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