#include <libpq-fe.h>
#define UPDATE_COMMAND \
"UPDATE employee SET password='%s' WHERE username='%s';"
int db_update(char *username, char *password)
{
PGconn *conn;
PGresult *res;
ExecStatusType status;
char query[1024];
// connect to server
/*
* Set parameter
*/
snprintf(query, sizeof(query), UPDATE_COMMAND, password, username);
/*
* Execute the query.
*/
res = PQexec(conn, query);
if (res) {
status = PQresultStatus(res);
if (status == PGRES_COMMAND_OK)) {
printf("Update successfully\n");
} else {
printf("error message=[%s]\n", PQresultErrorMessage(res));
}
}
}
初學者容易犯的錯誤就是把 user input 直接跟 SQL query 串接在一起,如果 username, password 存在不安全的字眼,很有可能會造成 SQL injection,切記永遠不要相信 user 的資料,該做的檢查、防呆都不能少。改成參數形式就可以避免 :)
Database client library 都會有提供類似的用法
#include <libpq-fe.h>
#define UPDATE_COMMAND \
"UPDATE employee SET password=$1 WHERE username=$2;"
#define PREPARED_STMT "my_update"
#define NPARAMS 2
int db_update(char *username, char *password)
{
PGconn *conn;
PGresult *res;
ExecStatusType status;
char *params[NPARAMS];
// connect to server
/*
* Set parameter
*/
params[0] = password;
params[1] = username;
res = PQprepare(conn, PREPARED_STMT, UPDATE_COMMAND, NPARAMS, NULL);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
printf("PQprepare() failed [%s]", PQresultErrorMessage(res));
return -1;
}
/*
* Execute the query.
*/
res = PQexecPrepared(conn, PREPARED_STMT, NPARAMS,
(const char **)params, NULL, NULL, 0);
if (res) {
status = PQresultStatus(res);
if (status == PGRES_COMMAND_OK)) {
printf("Update successfully\n");
} else {
printf("error message=[%s]\n", PQresultErrorMessage(res));
}
}
}
關於 PQprepare()、PQexecPrepared() 的使用方式可以參考官方文件
4E73C534
回覆刪除agoda güvenilir mi
agoda güvenilir mi
agoda güvenilir mi
465E2B74
回覆刪除Güzelbahçe
Etlik
Pamukova
İçmeler
Tire
Demetevler
Cide
Mudanya
Erbaa
9DEB1321
回覆刪除Erciş
Merzifon
Silifke
Bandırma
Aktepe
Akyurt
Balgat
Çivril
Akçakoca
1E736713
回覆刪除Erdemli
Yüksekova
Turgutreis
Aliağa
Batum
Bergama
Cide
Osmangazi
Kızıltepe
577697C6
回覆刪除Polatlı
Karaburun
Avşa
İzmit
Batum
Meram
Aksu
Akyaka
Gebze