2016-07-06 5 views
0

私はmysqlデータベースにデータを挿入しようとしています。データの接続と表示が機能します。mysqlテーブルにデータを挿入するにはどうすればいいですか?

しかし、私はINSERT INTO tableコマンドをCコードでどのように使用するのか分かりません。

私は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

これは、SQLインジェクションに問題があるため、Downvotedです。 mysqlには値を渡すためのAPIがあります。準備されたステートメントです:https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html – viraptor

+0

@viraptorまあまあ、すべての種類のコードは必ずリテラル文字列を簡単にハックすることができます。 BTW私はそう簡単/基本的なコードでOPのためだとは思わない。 – LPs

+0

文字列は現時点ではリテラルである可能性がありますが、将来はそうでない可能性があります。 "これは今すぐOKです"、または "パラメータを変更してもOKです"というより良いオプションは何ですか?それは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

@LPこの例は30行以上です。私は関与する機能を要約しようとしましたので、彼らは見やすくなりました。ここで意味をなさない短い例を作ることができれば、自由に編集を提案したり、自分自身に答えてください。 – viraptor

+0

私は自分の答えを編集しました。何かが間違っているかどうか見てください。 Ty。 – LPs

関連する問題