Обсуждение: libpq: bind message supplies 2 parameters, but prepared statement requires 1
libpq: bind message supplies 2 parameters, but prepared statement requires 1
От
"Alexander Farber"
Дата:
Hello, these 2 statements work fine for me on the psql-prompt: punbb=> select id, username, md5('deadbeef' || password) from users where id = 7; id | username | md5 ----+----------+---------------------------------- 7 | Alex | b962415469222eeb31e739c3afbc8a4a (1 row) punbb=> select username from users where id = 7 and md5('deadbeef' || password) = 'b962415469222eeb31e739c3afbc8a4a'; username ---------- Alex (1 row) However when I try to execute the latter query by my C-program, then it fails, saying that my bind command supplies 2 arguments (yes, that's true), but the prepared statement requires 1 argument (why 1? I don't understand). I have prepared a separate simple test case, could someone please explain what am I doing wrong? #include <err.h> #include <stdio.h> #include <libpq-fe.h> #define DB_CONN_STR "host=/var/www/tmp user=punbb dbname=punbb" #define SQL_FETCH_USERNAME "select username from users " \ "where id = $1 and md5('deadbeef' || password) = '$2'" int main(int argc, char *argv[]) { PGconn* conn; PGresult* res; const char *args[2]; char username[201]; if ((conn = PQconnectdb(DB_CONN_STR)) == NULL) err(1, "Connect to '%s' failed: out of memory", DB_CONN_STR); if (PQstatus(conn) != CONNECTION_OK) err(1, "Connect to '%s' failed: %s", DB_CONN_STR, PQerrorMessage(conn)); if ((res = PQprepare(conn, "sql_fetch_username", SQL_FETCH_USERNAME, 2, NULL)) == NULL) err(1, "Preparing statement '%s' failed: out of memory", SQL_FETCH_USERNAME); if (PQresultStatus(res) != PGRES_COMMAND_OK) err(1, "Preparing statement '%s' failed: %s", SQL_FETCH_USERNAME, PQerrorMessage(conn)); PQclear(res); args[0] = "7"; args[1] = "b962415469222eeb31e739c3afbc8a4a"; if ((res = PQexecPrepared(conn, "sql_fetch_username", 2, args, NULL, NULL, 0)) == NULL) err(1, "Executing statement '%s' failed: out of memory", SQL_FETCH_USERNAME); if (PQresultStatus(res) != PGRES_TUPLES_OK) err(1, "Executing statement '%s' failed: %s", SQL_FETCH_USERNAME, PQerrorMessage(conn)); PQclear(res); PQfinish(conn); return 0; } And here is the error message I get: laptop72:src {541} ./fetch-user fetch-user: Executing statement 'select username from users where id = $1 and md5('deadbeef' || password) = '$2'' failed: ERROR: bind message supplies 2 parameters, but prepared statement "sql_fetch_username" requires 1 : No such file or directory Thank you Alex PS: Using Postgresql 8.1.0 (from packages) on OpenBSD/386 -current -- http://preferans.de
Re: libpq: bind message supplies 2 parameters, but prepared statement requires 1
От
Martijn van Oosterhout
Дата:
On Sun, Jul 02, 2006 at 11:17:12PM +0200, Alexander Farber wrote: <snip> > However when I try to execute the latter query by my C-program, > then it fails, saying that my bind command supplies 2 arguments > (yes, that's true), but the prepared statement requires 1 argument > (why 1? I don't understand). I have prepared a separate simple > test case, could someone please explain what am I doing wrong? > > #include <err.h> > #include <stdio.h> > #include <libpq-fe.h> > > #define DB_CONN_STR "host=/var/www/tmp user=punbb dbname=punbb" > #define SQL_FETCH_USERNAME "select username from users " \ > "where id = $1 and md5('deadbeef' || password) = '$2'" You've got quotes around the $2, so it's seeing a string, not a parameter. Have a nice day, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > From each according to his ability. To each according to his ability to litigate.