QL *mysql) , 分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。函数返回初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
?
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
?
mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
?
第一个参数mysql应是已有MYSQL结构的地址。
?
“host”的值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。
?
“passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
“db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
?
如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
?
如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
?
?
client_flag的值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:
| 标志名称 |
标志描述 |
| CLIENT_COMPRESS |
使用压缩协议。 |
| CLIENT_FOUND_ROWS |
返回发现的行数(匹配的),而不是受影响的行数。 |
| CLIENT_IGNORE_SPACE |
允许在函数名后使用空格。使所有的函数名成为保留字。 |
| CLIENT_INTERACTIVE |
关闭连接之前,允许interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话wait_timeout变量被设为会话interactive_timeout变量的值。 |
| CLIENT_LOCAL_FILES |
允许LOAD DATA LOCAL处理功能。 |
| CLIENT_MULTI_STATEMENTS |
通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。 |
| CLIENT_MULTI_RESULTS |
通知服务器,客户端能够处理来自多语句执行或存储程序的多个结果集。如果设置了CLIENT_MULTI_STATEMENTS,将自动设置它。 |
| CLIENT_NO_SCHEMA |
禁止db_name.tbl_name.col_name语法。它用于ODBC。如果使用了该语法,它会使分析程序生成错误,在捕获某些ODBC程序中的缺陷时,它很有用。 |
| CLIENT_ODBC |
客户端是ODBC客户端。它将mysqld变得更为ODBC友好。 |
| CLIENT_SSL |
使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的。 |
?
如果连接成功,函数返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
?
const char *mysql_error(MYSQL *mysql);
对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。
经验规则是,如果成功,所有向服务器请求信息的函数均会复位mysql_error()。
下面为编译和执行结果输出:
?
# make
cc -Wall -Werror -O2 -I/usr/include/mysql/ -c -o main.o main.c
Linking target_bin...
# ./target_bin
Connected MySQL successful!
?
如果故意改错密码,编译链接之后程序输出如下信息:
?
# ./target_bin
mysql_real_connect(): Access denied for user 'root'@'localhost' (using password: YES)
2.查询数据库示例:
?
#include
#include
#include
int main(int argc, const char *argv[]) { MYSQL mysql; MYSQL_RES *res = NULL; MYSQL_ROW row; char *query_str = NULL; int rc, i, fields; int rows; if (NULL == mysql_init(&mysql)) { printf("mysql_init(): %s\n", mysql_error(&mysql)); return -1; } if (NULL == mysql_real_connect(&mysql, "localhost", "root", "shallnet", "db_users", 0, NULL, 0)) { printf("mysql_real_connect(): %s\n", mysql_error(&mysql)); return -1; } printf("1. Connected MySQL successful! \n"); query_str = "select * from tb_users"; rc = mysql_real_query(&mysql, query_str, strlen(query_str)); if (0 != rc) { printf("mysql_real_query(): %s\n", mysql_error(&mysql)); return -1; } res = mysql_store_result(&mysql); if (NULL == res) { printf("mysql_restore_result(): %s\n", mysql_error(&mysql)); return -1; } rows = mysql_num_rows(res); printf("The total rows is: %d\n", rows); fields = mysql_num_fields(res); printf("The total fields is: %d\n", fields); while ((row = mysql_fetch_row(res))) { for (i = 0; i < fields; i++) { printf("%s\t", row[i]); } printf("\n"); } mysql_close(&mysql); return 0; }
int mysql_real_query(MYSQL *m