我是C和mysql编程的初学者。有些日子我正在尝试编写浮点数和整数值,我从传感器到mySQL中的数据库。到目前为止我只是得到一个错误“太多了函数'mysql_query'“和”expected'conc char *'“的参数。下面是我的简单代码。
int main()
{
int var1 = 1;
float var2 = 5.1;
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
conn = mysql_init(NULL);
if (!mysql_real_connect(conn, host, user, pass, dbname,port, unix_socket, flag))
{
fprintf(stderr, "\nError: %s [%d]\n",mysql_error(conn),mysql_errno(conn));
exit(1);
}
printf("Connection successful!\n");
mysql_query(conn,"INSERT INTO variables (var1) VALUE ('%d');",var1);
mysql_query(conn, mysql_query );
}
答案 0 :(得分:2)
这是一个不错的主意,但mysql_query
不适用于变量参数。
您需要将查询存储在缓冲区中:
char buff[1024];
snprintf(buff, sizeof buff, "INSERT INTO variables (var1) VALUES ('%d');",var1);
然后你可以用这个缓冲区调用mysql_query
:
mysql_query(conn, buff);
修改强>
正如@PaulOgilvie所指出的那样:在查询中注意VALUES
而不是VALUE
。
答案 1 :(得分:2)
你应该使用一个准备好的语句,它也会处理类型和所有这些(假设conn
是一个有效的连接对象)
MYSQL_STMT *stmt;
MYSQL_BIND params[1];
const char *query;
// This is necessary or the program will crash
memset(params, 0, sizeof(params));
query = "INSERT INTO variables (var1) VALUES (?)";
stmt = mysql_stmt_init(conn);
params[0].buffer = &var1;
params[0].buffer_type = MYSQL_TYPE_LONG;
if (stmt == NULL)
exit(1); // Ideally handle the error and solve the problem
// but for simplicity ...
if (mysql_stmt_prepare(stmt, query, strlen(query)) != 0)
exit(1);
if (mysql_stmt_bind_param(stmt, params) != 0)
exit(1);
if (mysql_stmt_execute(stmt) != 0) {
// Ideally print mysql's error
fprintf(stderr, "an error occurred\n");
}
mysql_stmt_close(stmt);
这是一种很好的安全方法,并且您可以根据需要多次重复使用预准备语句,并且他们承诺它会更快,更高效,因为查询准备所以执行计划是已知的,您不需要使用snprintf()
顺便检查错误,并且您应该检查查询是否适合目标数组,阅读文档这一点。
此外,您不必担心转义字符串或其他任何内容。它将全部透明地为您处理。只要您使用正确的类型,当然,请指定字符串的长度。
请注意,您也可以在 SELECT 查询中绑定参数和结果。
答案 2 :(得分:0)
您确定此处不需要“VALUES”而不是“VALUE”:
mysql_query(conn,"INSERT INTO variables (var1) VALUE ('%d');",var1);