PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przekazywanie zmiennych C do polecenia SQL

Można sobie z tym poradzić na dwa sposoby. Pierwszym z nich jest przygotowanie ciągu z wprowadzonymi do niego wartościami. Drugim jest użycie parametrów zapytania, dla których można oddzielnie podstawiać wartości.

W przypadku pierwszej metody możesz użyć funkcji, takiej jak snprintf przygotować polecenie, które wyślesz na serwer. Na przykład:

char buffer[512];

int num=snprintf(buffer, sizeof(buffer), 
    "SELECT name FROM MYTABLE WHERE id=%d", id);

if (num>sizeof(buffer)) {
    /* error: buffer was too small */
}

Po tym buforze będzie zawierało zapytanie SQL zawierające rzeczywistą wartość zmiennej id.

Zwróć uwagę na potrzebę sprawdzenia wartości zwracanej przez snprintf, aby zobaczyć, czy bufor się przepełnił.

Zwróć również uwagę, że gdy w poleceniu umieszczany jest ciąg, musisz upewnić się, że ciąg nie zawiera żadnych cudzysłowów ani innych znaków specjalnych. Jeśli ciąg pochodzi spoza twojego programu, np. Z danych wprowadzonych przez użytkownika, a następnie nieprawidłowe zacytowanie go, pozostawia dużą dziurę, przez którą ktoś może wstrzyknąć złośliwy kod SQL. libpq zapewnia PQescapeLiteral funkcja do tego.

Inną metodą, preferowaną w większości przypadków, jest oddzielne przekazanie polecenia SQL i parametrów do serwera. Na przykład możesz to zrobić za pomocą PQexecParams Funkcja libpq. Twój ciąg SQL będzie wyglądał tak:

PGresult r = PQexecParams(conn, /* Connection to database */
    "SELECT name FROM mytable WHERE id=$1",
    1,             /* Number of parameters */
    NULL,          /* NULL means server should figure out the parameter types */
    params,        /* Pointer to array of strings containing parameters */
    NULL,          /* Not needed unless binary format used */
    NULL,          /* Not needed unless binary format used */
    0              /* Result to come back in text format */
);

Ta funkcja umożliwia podanie parametrów i/lub uzyskanie wyników w formacie tekstowym lub binarnym. Dla uproszczenia mój przykład powyżej zakłada format tekstowy dla obu.

Odmianą tego jest użycie przygotowanych oświadczeń. W takim przypadku wykonujesz dwa oddzielne wywołania do libpq:

  1. Wywołaj PQprepare, do którego przekazujesz swoją instrukcję SQL z wartościami parametrów $1, $2, itd., jak w moim przykładzie powyżej. To zwróci uchwyt instrukcji.

  2. Wywołaj PQexecPrepared, do którego przekazujesz uchwyt instrukcji, a także same parametry, określone w podobny sposób jak PQexecParams.

Zaletą zastosowania dwóch takich kroków jest to, że można przygotować zestawienie raz i wykonać je wiele razy, co zmniejsza obciążenie serwera związane z analizowaniem go i planowaniem zapytania.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizacja Postgres z lewego przyłączenia

  2. Tabela średniej historii akcji

  3. Tłumaczenia relacji nie istnieją po migracji do Rails 3.2.1

  4. Postgresql, pobierz wartość określonego klucza z tablicy json

  5. Konwertuj hstore postgresql na tablicę php