我试图根据我在网上找到的这个例子建立一个准备好的声明。 我只是想防止在grade =和username =中进行sql注入,但是语句没有执行。如何在C中为mysql查询设置预准备语句?
MYSQL_STMT *stmt;
MYSQL_BIND bind[2];
char* usrname = &uname[0]; //uname supplied by user
char* choi = choice; //choice supplied by user
stmt = mysql_stmt_init(connect);
char* statement = "UPDATE grades SET grade='?' WHERE username='?'";
mysql_stmt_prepare(stmt, statement, strlen(statement));
memset(bind,0,sizeof(bind));
bind[0].buffer_type=MYSQL_TYPE_STRING;
bind[0].buffer=usrname;
bind[0].buffer_length=50;
bind[0].is_null=0;
bind[0].length= strlen(usrname);
bind[1].buffer_type=MYSQL_TYPE_STRING;
bind[1].buffer=choi;
bind[1].buffer_length=50;
bind[1].is_null=0;
bind[1].length= 2;
mysql_stmt_bind_param(stmt, bind);
mysql_stmt_execute(stmt);
我不能肯定,关于MySQL,但在一些的DBMS,在''应该是* *加引号,就像'用户名='? –
我尝试过并收到了seg故障。 – Takkun
您可能需要仔细检查'bind'设置,例如顺序似乎倒退,缓冲区大小可能需要双重检查。 –