Tipi sorunu - PHP PostgreSQL işlevi çağırmadan?

2 Cevap php

Ben aşağıdaki imza ile PostgreSQL / plpgsql bir işlevi var:

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

_get_session Bir görünümü olduğu. : PhpPgAdmin'e onu ararken fonksiyonu çalışıyor, ancak ben şu hatayı alıyorum PHP onu aramak whan

Uyarı: pg_dbname () [function.pg-sorgu]: Sorgu başarısız oldu: HATA: tipi "session_ids" bağlam yok: yakınındaki hattı 2 "user_login" PL / pgSQL fonksiyonu derlemek / home / siteler / blah.com / endeksinde hat 69 üzerinde. php

Fonksiyonunun DECLARE bölümünde aşağıdaki değişkenleri içerir:

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

Etki alanı session_ids var, ve aynı komut çağrıldığında aynı alan çalışma kullanabilirsiniz diğer fonksiyonlar ETMEZ. Aşağıdaki gibi PHP:

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

Ben de ancak ben aynı hatayı ararken, işlevi çağrılırken ne zaman :: METİN yerine :: session_ids kullanarak denedim.

Yardım: o (

2 Cevap

Sadece kod kolaylaştırır:

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

Şimdi SQL enjeksiyon güvendeyiz.

Ancak, sizin hiçbir işlevi veri türü "session_ids" var, hala yanlış. Ben DECLARE bölümünde METİN kullanmak istiyorum düşünüyorum.

Sorgu birden fazla satır kapsıyorsa, o zaman PHP büyük olasılıkla aynı işlemin bir parçası olarak onları göndermiyor. Bu durumda iki seçeneğiniz var.

İlk seçenek aynı aramada tüm sorguları göndermek için

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

İkinci seçenek (ve bence en iyi) işlemleri kullanmaktır. Bu başlamak deyimi büyük olasılıkla ilk sorgu ile gönderilmesi gerekecektir olsa birkaç hatları üzerinden arama yapmak için izin verecektir.

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

Oluşan bir hata varsa, o zaman bir geri alma ile taahhüt değiştirin ve herhangi bir değişiklik db yapılmış olacaktır.

Postgres ile çalışırken, bu aslında zaten takip başparmak iyi bir kuraldır.