如何将数据插入mysql表?

时间:2016-07-06 12:37:49

标签: mysql c linux

我正在尝试将数据插入到mysql数据库中。连接和数据显示工作。

但我不知道如何在C代码中使用INSERT INTO table命令。

我尝试使用scanf / getchar读取mysql命令中的值,但它不起作用。

在我读取程序中的数据后如何将数据插入mysql表?

我在Linux工作。

这是我的源代码:

#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>

static char *host = "localhost";
static char *user = "root";
static char *pass = "PASSWORD";
static char *dbname = "tutorial";

unsigned int port = 3306;
static char *unix_socket = NULL;
unsigned int flag = 0;

int main()
{
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, "Error: %s[%d]", mysql_error(conn), mysql_errno(conn));
    exit(1);
}

mysql_query(conn, "SELECT * FROM users");
res = mysql_store_result(conn);


while(row = mysql_fetch_row(res))
{
    printf("%s\t%s\n", row[0], row[1]);
}

mysql_free_result(res);
mysql_close(conn);

return EXIT_SUCCESS;
}

我试过了:

...
int id[1] = 5;
char name[8] = "Jack";
...
mysql_query(conn, INSERT INTO users(id, name) VALUES(id, name);
...

2 个答案:

答案 0 :(得分:1)

您必须在创建查询之前为C字符串做好准备。

您可以使用snprintf执行此操作:

#define MAX_STRING 128
char query[MAX_STRING] = {0};
int id = 5;
char name[] = "jack";

snprintf(query, MAX_STRING, "INSERT INTO users (id, name) VALUES (%d, '%s')", id, name);

mysql_query(conn, query);

正如@viraptor指出上面的解决方案有sql注入问题。 您应该使用mysql api(编码为完全安全)来完成这项工作:

#define INSERT_QUERY = "INSERT INTO users (id, name) VALUES (?,?)";

int id = 5;
char name[] = "jack";
size_t str_length = strlen(name);

MYSQL_STMT *stmt = mysql_stmt_init(mysql);
if (!stmt)
{
   fprintf(stderr, " mysql_stmt_init(), out of memory\n");
     exit(0);
}
if (mysql_stmt_prepare(stmt, INSERT_QUERY, strlen(INSERT_QUERY)))
{
   fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");
   fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
   exit(0);
}

MYSQL_BIND bind[2];

/* INTEGER PARAM */
/* This is a number type, so there is no need
   to specify buffer_length */
bind[0].buffer_type= MYSQL_TYPE_LONG;
bind[0].buffer= (char *)&id;
bind[0].is_null= 0;
bind[0].length= 0;

/* STRING PARAM */
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (char *)name;
bind[1].buffer_length= str_length+1;
bind[1].is_null= 0;
bind[1].length= &str_length;

/* Bind the buffers */
if (mysql_stmt_bind_param(stmt, bind))
{
  fprintf(stderr, " mysql_stmt_bind_param() failed\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}

/* Execute the INSERT statement - 2*/
if (mysql_stmt_execute(stmt))
{
  fprintf(stderr, " mysql_stmt_execute, 2 failed\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}

/* Get the total rows affected */
my_ulonglong affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, " total affected rows(insert 2): %lu\n",
                (unsigned long) affected_rows);

if (affected_rows != 1) /* validate affected rows */
{
  fprintf(stderr, " invalid affected rows by MySQL\n");
  exit(0);
}

/* Close the statement */
if (mysql_stmt_close(stmt))
{
  fprintf(stderr, " failed while closing the statement\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}

您可以找到此代码at this link

的参考

答案 1 :(得分:1)

请查看https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html上的示例,了解如何执行此操作。

总之,您创建一个预准备语句,使用mysql_stmt_prepare对其进行初始化,然后通过mysql_stmt_bind_param传递值。

您还可以使用https://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string-quote.html引用的值构建查询的文本版本,但在这种情况下,很容易意外跳过某些元素。