2016-07-06 121 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