PHP вызывает функцию PostgreSQL - проблема типа? - PullRequest
4 голосов
/ 19 апреля 2010

У меня есть функция в PostgreSQL / plpgsql со следующей подписью:

CREATE OR REPLACE FUNCTION user_login(TEXT, TEXT) RETURNS SETOF _get_session AS $$ ... $$

Где _get_session - это вид. Функция работает нормально при вызове из phpPgAdmin, однако, когда я вызываю ее из PHP, я получаю следующую ошибку:

Предупреждение: pg_query () [function.pg-query]: Ошибка запроса: ОШИБКА: тип "session_ids" не существует CONTEXT: компиляция функции PL / pgSQL «user_login» возле строки 2 в /home/sites/blah.com/index.php в строке 69

Раздел DECLARE функции содержит следующие переменные:

oldSessionId session_ids := $1;
newSessionId session_ids := $2;

Домен session_ids СУЩЕСТВУЕТ, а другие функции, использующие тот же домен, работают при вызове из того же сценария. PHP выглядит следующим образом:

$query = "SELECT * FROM $dbschema.user_login('$session_old'::TEXT, '$session'::TEXT)";
$result = pg_query($login, $query);

Я также пытался сделать это, используя ::session_ids вместо ::TEXT при вызове функции, однако я получаю ту же ошибку.

Справка: o (

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Если ваш запрос охватывает несколько строк, то, скорее всего, PHP не отправляет их как часть одной и той же транзакции. Если это так, у вас есть два варианта.

Первый вариант - отправить все запросы в одном вызове

pg_query("query1; query2; query3;");

Второй вариант (и лучший на мой взгляд) заключается в использовании транзакций. Это позволит вам совершать вызовы по нескольким линиям, хотя, скорее всего, оператор begin нужно будет отправить с начальным запросом.

pg_query("begin; query1;");
pg_query("query2;");
pg_query("commit;");

Если возникает ошибка, замените фиксацию откатом, и в базу данных не будет внесено никаких изменений.

При работе с Postgres, в любом случае, это хорошее правило, которому нужно следовать.

1 голос
/ 19 апреля 2010

Просто сделайте ваш код простым:

$query = "SELECT * FROM $dbschema.user_login($1, $2)";
$result = pg_query_params($login, $query, array($session_old, $session));

Теперь вы в безопасности от внедрения SQL.

Но ваша функция все еще не работает, нет типа данных "session_ids". Я думаю, что вы хотите использовать TEXT в части DECLARE.

...