Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP и OCI/Oracle - не могу понять, где ошибка / 1 сообщений из 1, страница 1 из 1
18.01.2019, 09:58
    #39761269
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP и OCI/Oracle - не могу понять, где ошибка
Для работы с БД у меня есть библиотека, в ней используется такой код:
Код: 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.
public static function query($sql, &$ref_params=null, $batch=false) {
	...
	foreach ($params as $param=>&$value) {
		switch (gettype($value)) {
			case 'string':
				$t = SQLT_CHR;
				$s = 200;
				break;
			case 'integer':
				$t = SQLT_INT;
				$s = 16;
				break;
			default:
				$t = SQLT_CHR;
				$s = 200;
				break;
		}
		if (in_array($param, $paramlist)) {
			if (static::debug()) print_r(['oci_bind_by_name',$st, $param, $value, (array_key_exists($param,$return) ? $s : -1), $t]);
			oci_bind_by_name($st, $param, $value, (array_key_exists($param,$return) ? $s : -1), $t);
		}
	}
	...
	if (static::debug()) {
		print "\n*DEBUG*\n";
		print "SQL: *$sql*\n";
		print "ARG: " . print_r($params, true) . "\n";
		print "\n";
	}
	oci_set_prefetch($st, 100);
	$res = oci_execute($st, ($batch ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS));
	...
}


Для простых select-запросов код работает нормально.
С insert почему-то проблема.
Вызываю код так:
Код: php
1.
$bm->exec($sql, [':ivi'=>$ivi::IVI_BM_ID, ':client'=>$row['ID'], ':account'=>$row['ACCOUNT_ID'], ':service'=>$row['SERVICE_ID'], ':token'=>$key]);


Из отладочного вывода я вижу, что все задается правильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
*DEBUG*
SQL: *insert into TRANS_BATCH_LINK (TRANS_PROVIDER_ID, LOCAL_CLIENT_ID, LOCAL_ACCOUNT_ID, LOCAL_SERVICE_ID, FIELD, VALUE)
values (:ivi, :client, :account, :service, 'access_token', :token)
*
ARG: Array
(
    [:ivi] => 2
    [:client] => 2829
    [:account] => 7081
    [:service] => 328937
    [:token] => xxxxx_xxxxx_xxxxx_xxxxx_xxxxx
)
Если SQL-запрос выполнять вручную, то он успешно выполняется.
Биндинг переменных тоже работает корректно:
Код: 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.
Array
(
    [0] => oci_bind_by_name
    [1] => Resource id #31
    [2] => :ivi
    [3] => 2
    [4] => -1
    [5] => 3
)
Array
(
    [0] => oci_bind_by_name
    [1] => Resource id #31
    [2] => :client
    [3] => 2829
    [4] => -1
    [5] => 1
)
Array
(
    [0] => oci_bind_by_name
    [1] => Resource id #31
    [2] => :account
    [3] => 7081
    [4] => -1
    [5] => 1
)
Array
(
    [0] => oci_bind_by_name
    [1] => Resource id #31
    [2] => :service
    [3] => 328937
    [4] => -1
    [5] => 1
)
Array
(
    [0] => oci_bind_by_name
    [1] => Resource id #31
    [2] => :token
    [3] => xxxxx_xxxxx_xxxxx_xxxxx_xxxxx
    [4] => -1
    [5] => 1
)
Длина переменной задана -1, т.к. это входящие параметры, для возвращаемых параметров задается буфер фиксированного размера, но в этом запросе возвращаемых параметров нет.
Однако при выполнении кода я получаю ошибку:
Код: plaintext
1.
2.
PHP Warning:  oci_bind_by_name(): ORA-01036: illegal variable name/number in .../lib/classes/Billing.class.php on line 299
Warning: oci_bind_by_name(): ORA-01036: illegal variable name/number in .../lib/classes/Billing.class.php on line 299
Строка 299 — это как раз строка, где биндятся параметры запроса.
Что тут неправильно?
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP и OCI/Oracle - не могу понять, где ошибка / 1 сообщений из 1, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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