同じ様なプログラムを作成してみました。こちらのサイトのexampleを参考としました。
c
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <mysql.h>
5#define STRING_SIZE 50
6
7int main(char **args) {
8 MYSQL_RES *result;
9 MYSQL_ROW row;
10 MYSQL_STMT *stmt;
11 MYSQL mysql;
12 MYSQL_BIND par[1];
13 MYSQL_BIND res[2];
14 int state;
15 unsigned long str_leng;
16
17 mysql_init(&mysql);
18 mysql_real_connect(&mysql,"localhost", "root", "passwd","", 0, 0, 0);
19 if (&mysql == NULL) {
20 printf(mysql_error(&mysql));
21 return 1;
22 }
23 puts("==== Regular Execution ====");
24 fflush( stdout );
25
26 char sql1[]= "SELECT user, host FROM mysql.user WHERE host LIKE '%localhost%'";
27 state = mysql_query(&mysql, sql1);
28 if (state != 0) {
29 printf(mysql_error(&mysql));
30 return 1;
31 }
32
33 result = mysql_store_result(&mysql);
34 printf("Rows: %d\n", mysql_num_rows(result));
35
36 while ( ( row = mysql_fetch_row(result)) != NULL ) {
37 printf("%s@%s\n", row[0], row[1]);
38 }
39 mysql_free_result(result);
40
41 puts("==== Prepared Statement ====");
42 stmt = mysql_stmt_init(&mysql);
43 if (!stmt) {
44 fprintf(stderr, " mysql_stmt_init(), out of memory\n");
45 exit(0);
46 }
47
48 char sql2[] = "SELECT user, host FROM mysql.user WHERE host LIKE ?";
49 if (mysql_stmt_prepare(stmt, sql2, strlen(sql2))){
50 fprintf(stderr, " mysql_stmt_prepare(), prepare failed\n");
51 fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
52 exit(0);
53 }
54
55 // parameter
56 char sd[20] = "%localhost%";
57 memset(par, 0, sizeof(par));
58 par[0].buffer_type= MYSQL_TYPE_STRING;
59 par[0].buffer= (char *)sd;
60 par[0].buffer_length= STRING_SIZE;
61 par[0].is_null= 0;
62 par[0].length= &str_leng;
63 if (mysql_stmt_bind_param(stmt,par)){
64 fprintf(stderr, " mysql_stmt_bind_param() failed\n");
65 fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
66 exit(0);
67 }
68
69 str_leng = strlen(sd);
70 if (mysql_stmt_execute(stmt)){
71 fprintf(stderr, " mysql_stmt_execute(), failed\n");
72 fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
73 exit(0);
74 }
75
76 char dat1[64];
77 char dat2[64];
78 memset(res, 0, sizeof(res));
79 res[0].buffer_type= MYSQL_TYPE_STRING;
80 res[0].buffer= (char *)dat1;
81 res[0].is_null = 0;
82 res[0].buffer_length = 40;
83 res[1].buffer_type= MYSQL_TYPE_STRING;
84 res[1].buffer= (char *)dat2;
85 res[1].is_null = 0;
86 res[1].buffer_length = 40;
87
88 if (mysql_stmt_bind_result(stmt, res)){
89 fprintf(stderr, " mysql_stmt_bind_result() failed\n");
90 fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
91 exit(0);
92 }
93
94 if (mysql_stmt_store_result(stmt)){
95 fprintf(stderr, " mysql_stmt_store_result() failed\n");
96 fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
97 exit(0);
98 }
99
100 while(!mysql_stmt_fetch(stmt)) {
101 printf("%s@%s\n", dat1, dat2);
102 }
103
104 mysql_stmt_close(stmt);
105 mysql_close(&mysql);
106}