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

Работаю через 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
14.03.2018, 14:05
    #39614755
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
> В ответах на запросы для полей типа boolean всегда возвращается NULL.

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

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

именно

Код: 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
14.03.2018, 14:18
    #39614763
EDIsaev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
Симонов Дениспохоже драйвер firebird PDO до сих пор не знает о существовании нативного типа boolean
драйвер ibase тоже спотыкается на этих полях...
обходные пути то существуют?
...
Рейтинг: 0 / 0
14.03.2018, 14:19
    #39614765
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
багу без месяца год
https://bugs.php.net/bug.php?id=74462
...
Рейтинг: 0 / 0
14.03.2018, 14:20
    #39614766
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
EDIsaevСимонов Дениспохоже драйвер firebird PDO до сих пор не знает о существовании нативного типа boolean
драйвер ibase тоже спотыкается на этих полях...
обходные пути то существуют?

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

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

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

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

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

Код: sql
1.
CASE WHEN BoolField THEN 1 WHEN NOT BoolField THEN 0 ELSE NULL END
...
Рейтинг: 0 / 0
14.03.2018, 15:29
    #39614823
EDIsaev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
Симонов Денисможно сделать что-то такое
Всё, благодарю, с этим жить можно)
...
Рейтинг: 0 / 0
14.03.2018, 15:36
    #39614826
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
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
15.03.2018, 22:22
    #39615683
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить значения BOOLEAN полей при подключении к Firebird из PHP
Дегтярев Евгенийкак я понял патч выборку фиксит и не фиксит биндинг параметров. резонно не принят
Я вот так не считаю :) в большенсте случае используется выборка, не то что прямо редкость бул парамы. Если будет время может доделаю.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как получить значения BOOLEAN полей при подключении к Firebird из PHP / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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