-1
私はこのコードを実行しようとしましたが、新しいブローカを追加しようとしているときに、IPアドレスをコンソールに入力するとすぐに、プログラム終了し、セグメンテーション違反を示すエラーをスローします。私は文字配列を使ってIPアドレスを格納しています。 SQL挿入クエリにパラメータとしてユーザー入力を与える方法についてはわかりません。SQL文のパラメータとしてユーザ入力を与える方法
#include<stdio.h>
#include<stdlib.h>
#include<sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s = %s\t", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(char c, char* argv[])
{
sqlite3 *db;
int rc;
char *zErrMsg = 0;
char *sql;
int choice;
char option;
int port,priority;
char *nameID,*ip;
rc = sqlite3_open("topology.cnf", &db);
if(rc){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
// Creation of table
sql = "CREATE TABLE BROKERLIST(" \
"IP CHAR(16) PRIMARY KEY NOT NULL," \
"PORT INT NOT NULL," \
"NAMEID TEXT NOT NULL," \
"PRIORITY INT NOT NULL);";
// Executing SQL statement
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Table created successfully\n");
}
do{
printf("Enter choice \n1.Add broker\t2.Remove broker\t3.Change broker priority\t4.Show map");
scanf("%d", &choice);
switch(choice){
case 1: printf("\nEnter IP, Port, NameID, Priority");
scanf("%s%d%s%d",ip,&port,nameID,&priority);
sql = "INSERT INTO BROKERLIST(IP,PORT,NAMEID,PRIORITY) " \
"VALUES('"+ip+"','"+port+"','"+nameID+"','"+priority+"'); " ;
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Added broker successfully\n");
}
break;
case 2: printf("\nEnter NameID of the broker to be removed");
scanf("%s",nameID);
sql = "DELETE from BROKERLIST where NAMEID = '"+nameID+"'; " ;
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Removed broker successfully\n");
}
break;
case 3: printf("\nEnter NameID of broker whose priority has to be changed and the new priority");
scanf("%s%d",nameID,&priority);
sql = " UPDATE BROKERLIST set PRIORITY = '"+priority+"' where NAMEID = '"+nameID+"'; ";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Updated Priority of broker\n");
}
break;
case 4: sql = "SELECT * from BROKERLIST" ;
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
break;
}
printf("\n Do you want to continue?(Y/N)");
fflush(stdin);
scanf("%c",&option);
}while(option == 'Y' || option == 'y');
return 0;
}
私はそれを試みましたが、今は私が得ているエラーはSQL文です。私は、フォームのパラメータ ""でクエリにパラメータを渡していますが、それはエラーを投げています。 – Nikhila