使用sprintf和mysql_query

时间:2013-08-24 22:03:54

标签: mysql sql c c89

我正在使用一个连接到我的mysql数据库(本地)的mysql片段在ANSI C。一切都很完美,但我一直在尝试创建一个连接到我的数据库并插入基于的新记录的函数一些变数。我正在使用sprintf来阻止这些变量并将它们拼凑在一起以形成我的SQL查询。

问题

一旦我准备好变量和SQL,我就将它发送到mysql_query。不幸的是,这不能按预期工作,程序崩溃并报告缓冲区溢出。

以下是可能有助于解释问题的整体功能部分。

#include <mysql.h>
#include <string.h>
#include <stdio.h>

char *table = "test_table"; // table is called test_table
char *column = "value"; // column is called value
char *value = "working"; // what value we are inserting
char *query; // what we are sending to mysql_query

sprintf(query, "INSERT INTO %s (%s) VALUES ('%s')", table, column, value);

if (mysql_query(conn, query)) {
  fprintf(stderr, "%s\n", mysql_error(conn));
  return;
}

目的

整体功能的目的是让我不必在程序中继续重写SQL插入或更新语句。我想调用一个函数并传递一些参数来识别表,列和所述列的值。

任何帮助都将非常感激。这些天我在C里有点生气。

问题

为什么mysql_query无法发送字符串?

更改

这是根据评论工作的。

const char *query[MAX_STRING_LENGTH];

sprintf((char *)query, "INSERT INTO %s (%s) VALUES ('%s')", table, column, value);

if (mysql_query(conn, (const char *)query)) {

1 个答案:

答案 0 :(得分:1)

query没有后备存储空间。

它设置为NULL或某些不确定的值,具体取决于其存储持续时间,两者都不会很好地结束: - )

快速修复是将其更改为

char query[1000];

虽然任何值得他们工资的编码员也会检查以确保没有发生缓冲区溢出。