2016-07-06 113 views
0

我想插入数据到MySQL数据库。连接和数据显示工作。如何在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); 
... 
+0

当你尝试时会发生什么?有错误吗? – Taegost

+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

+0

Downvoted,因为这有问题与SQL注入。 mysql有api传递值 - 这是准备语句:https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html – viraptor

+0

@viraptor嗯,当然所有类型的代码执行文字字符串很容易被黑客入侵。顺便说一句,我不认为这是一个简单/基本代码的OP的情况。 – LPs

+0

字符串此刻可能是字面的,但可能不会在将来。有什么更好的选择“现在好了”,或者“即使您更改参数,这也可以”?这是2016年,人们仍然经常不能解决这样的问题。让我们至少保留SO的不安全示例。如果Onur遇到这样的基本问题,我宁愿尽快学习注射。 – viraptor

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引用的值构造查询的文本版本,但在这种情况下,很容易意外跳过某些元素。

+0

不是DV,但是这个答案似乎落入_link只有answer_ – LPs

+0

@LPs这个例子是30+行。我试图总结所涉及的功能,因此很容易查找。如果你可以做一个简短的例子,这里有意义,随时提出一个编辑,或自己回答:) – viraptor

+0

我编辑了我的答案。看看是否有问题。 TY。 – LPs