这正是我的问题,但在使用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在评论中所说,这是不安全的。