Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 PHP и OCI/Oracle - не могу понять, где ошибка  [new]
Alibek B.
Member

Откуда:
Сообщений: 3232
Для работы с БД у меня есть библиотека, в ней используется такой код:
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 почему-то проблема.
Вызываю код так:
$bm->exec($sql, [':ivi'=>$ivi::IVI_BM_ID, ':client'=>$row['ID'], ':account'=>$row['ACCOUNT_ID'], ':service'=>$row['SERVICE_ID'], ':token'=>$key]);

Из отладочного вывода я вижу, что все задается правильно:

*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-запрос выполнять вручную, то он успешно выполняется.
Биндинг переменных тоже работает корректно:

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, т.к. это входящие параметры, для возвращаемых параметров задается буфер фиксированного размера, но в этом запросе возвращаемых параметров нет.
Однако при выполнении кода я получаю ошибку:

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 — это как раз строка, где биндятся параметры запроса.
Что тут неправильно?
18 янв 19, 09:58    [21788478]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить