使用C API在MySQL查询中输入参数的语法

时间:2017-07-22 21:59:33

标签: mysql c

这正是我的问题,但在使用MySQL的C API时: Syntax for input parameters in a MySQL query

如何参数化C查询?

我尝试做的事情虽然失败了:

int status = mysql_query(&conn, "set @id:=1; SELECT * FROM players WHERE player_id = @id;"); 

我假设C还有其他方式吗?

错误消息基本上说请查阅您的手册以获取正确的版本和语法。我正在使用客户端版本6.1.10。当我不使用参数化时,它执行正常。

1 个答案:

答案 0 :(得分:2)

您应该使用Prepared语句。 https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html 这是C ++中的一个示例(它更短更容易理解): https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-prepared-statements.html 这是一个未经测试的短版本的160行长的C语言示例: https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html / *没有跟踪SEMICOLON的单个声明或' \ g' * / #define SELECT_QUERY" SELECT * FROM玩家WHERE palyer_id =?" #define SELECT_QSLEN strlen(SELECT_QUERY) 枚举select_params {     par_player_id,     par_count }; / *将保留声明结构的指示* / MYSQL_STMT * stmt / *描述查询参数的描述。    会员缓冲区是实际数据的指示符* / MYSQL_BIND绑定[par_count] = {0}; / *为player_id提供值。    可能保持未经授权而直至执行* / int data_player_id; stmt = mysql_stmt_init(mysql); if(NULL == stmt)     退出(EXIT_FAILURE); /* 内存不足 */ {     bool prepare_fail = mysql_stmt_prepare(stmt,SELECT_QUERY,SELECT_QSLEN);     if(prepare_fail)         exit(EXIT_FAILURE)/ * SEE mysql_stmt_error(stmt)* / } bind [par_player_id] .buffer_type = MYSQL_TYPE_LONG; bind [par_player_id] .buffer =(char *)& data_player_id; {     bool bind_failed = mysql_stmt_bind_param(stmt,bind);     if(bind_failed)         退出(EXIT_FAILURE); / * SEE mysql_stmt_error(stmt)* / } / *应该在mysql_stmt_execute之前初始化* / data_player_id = 42; {     bool execute_fail = mysql_stmt_execute(stmt);     if(execute_fail)         exit(EXIT_FAILURE)/ * SEE mysql_stmt_error(stmt)* / } {     bool close_fail = mysql_stmt_close(stmt);     if(close_fail)         / *在这一点上stmt是无效的。            使用mysql_error(mysql)比mysql_stmt_error(stmt)* /更好         退出(EXIT_FAILURE); } 更新 之前的答案已删除。正如Cheatah在评论中所说,这是不安全的。