Kết nối đến csdl Mysql sử dụng Ansi C
Bài viết của mình được thực hiện trên Ubuntu nhé ( và Centos ) các bác sài win đi chỗ khác xem nhé .
1. Cài đặt thư viện
sudo apt-get install libmysql++-dev
2. Code :
Dùng một Editor để soạn file C .
include header :
#include
Kết nối :
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;char *server =”localhost”;
char *user = “root”;
char *password = “1″;
char *database = “mysql”;MYSQL_STMT *stmt;
MYSQL_BIND bind[2];conn = mysql_init(NULL);
if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
{
fprintf(stderr, “%s\n”, mysql_error(conn));
exit(1);
}
Truy vấn :
if (mysql_query(conn, sql)) {
fprintf(stderr, “%s\n”, mysql_error(conn));
exit(0);
}res = mysql_use_result(conn);
while ((row = mysql_fetch_row(res)) != NULL)
{printf(“data %d \n”, row[0]));
}
Nhìn chung C API khá giống php API nên cũng không khó nắm bắt lắm .
Vấn đề chủ yêu nằm ở các kiểu dữ liệu giữa C và Mysql :
Để giải quyết vấn đề này nên sử dụng triệt để prepare statement :
ví dụ :
#define UPDATE_SQL “UPDATE articles category_id=? where article_id =? ”
if (mysql_stmt_prepare(stmt, UPDATE_SQL, strlen(UPDATE_SQL)))
{
fprintf(stderr, ” mysql_stmt_prepare(), UPDATE failed\n”);
fprintf(stderr, ” %s\n”, mysql_stmt_error(stmt));
exit(0);
}
fprintf(stdout, ” prepare, INSERT successful\n”);printf(“a”);
memset(bind, 0, sizeof(bind));
/* INTEGER PARAM */
/* This is a number type, so there is no need
to specify buffer_length */
bind[0].buffer_type= MYSQL_TYPE_LONGLONG;
bind[0].buffer= (char *)&hash1;
bind[0].is_null= 0;
bind[0].length= 0;
bind[0].is_unsigned=1;bind[1].buffer_type= MYSQL_TYPE_LONG;
bind[1].buffer= (char *)&article_id;
bind[1].is_null= 0;
bind[1].length= 0;
bind[1].is_unsigned=1;/* 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 – 1*/
if (mysql_stmt_execute(stmt))
{
fprintf(stderr, ” mysql_stmt_execute(), 1 failed\n”);
fprintf(stderr, ” %s\n”, mysql_stmt_error(stmt));
exit(0);
}
Nhìn chung code vất vả hơn php gấp 10 lần .
Nhưng tốc độ thì khỏi nói .
Dự án của mình sau này chắc có đển vài trăm ngàn bảng ghi , mà nó chạy như hack ấy ) .
3.Complile :
gcc -o my.out -std=c99 $(mysql_config –cflags) mycode.c $(mysql_config –libs)
Có 2 tham số hơi lạ mysql_config –cflags <– để chỉ ra đường dẫn tới mysql header
mysql_config –libs <– Để chỉ ra file lib của mysql ( sử dụng khi linking )
Các bạn có thể chạy lệnh này độc lập xem nó sinh ra cái gì .
Happy coding .
Bài viết tiếp theo sẽ là : Tự viến hàm mở rộng cho mysql ( tất nhiên là dùng C )
(i-php.net)