mysql_query(MYSQL *connevtion, char *sql)
执行SELECT语句得到查询结果
MYSQL_RES *mysql_store_result(MYSQL *pmysql);
成功返回一个查询结果指针,查询为结果或者错误返回NULL
mysql_free_result(MYSQL_RES *result)
调用完mysql_store_result,一定要释放相关资源。
查看查询结果的行信息
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); //返回的是记录(行)
查看查询结果的字段信息
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result); //返回的是字段(列)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <termios.h>
#include <mysql/mysql.h>
#define BUFSIZE 1024
MYSQL mysql, *connection = NULL;
void deletename(char *SQL)
{
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "%s", "请输入要干掉的名字>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
// SQL程序的标准写法如下所示
char name[1024];
memset(name, 0, sizeof(name));
read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要删除的名字
name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "delete from table1 where name = '%s'", name);
printf("'%s'\n", SQL);
}
void insertname(char *SQL)
{
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "%s", "请输入要插入的名字>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
// SQL程序的标准写法如下所示
char name[1024];
memset(name, 0, sizeof(name));
read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要插入的名字
name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉
sprintf(SQL, "%s", "请输入要插入的性别>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
char sex[1024];
memset(sex, 0, sizeof(sex));
read(STDIN_FILENO, sex, sizeof(sex));// 等待用户输入要插入的性别
sex[strlen(sex) - 1] = 0;// 将字符串最后一个回车去掉
sprintf(SQL, "%s", "请输入要插入的年龄>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
char age[1024];
memset(age, 0, sizeof(age));
read(STDIN_FILENO, age, sizeof(age));// 等待用户输入要插入的年龄
age[strlen(age) - 1] = 0;// 将字符串最后一个回车去掉
sprintf(SQL, "%s", "请输入要插入的班级>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
char classid[1024];
memset(classid, 0, sizeof(classid));
read(STDIN_FILENO, classid, sizeof(classid));// 等待用户输入要插入的班级
classid[strlen(classid) - 1] = 0;// 将字符串最后一个回车去掉
sprintf(SQL, "INSERT INTO table1 (name, sex, age, class) VALUES ('%s', '%s', %s, '%s')", name, sex, age, classid);
printf("'%s'\n", SQL);
}
void updatename(char *SQL)
{
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "%s", "请输入要修改的名字>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
// SQL程序的标准写法如下所示
char name[1024];
memset(name, 0, sizeof(name));
read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要更新的名字
name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "%s", "请输入要修改的性別>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
// SQL程序的标准写法如下所示
char sex[1024];
memset(sex, 0, sizeof(sex));
read(STDIN_FILENO, sex, sizeof(sex));// 等待用户输入要更新的性別
sex[strlen(sex) - 1] = 0;// 将字符串最后一个回车去掉
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "%s", "请输入要修改的年齡>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
// SQL程序的标准写法如下所示
char age[1024];
memset(age, 0, sizeof(age));
read(STDIN_FILENO, age, sizeof(age));// 等待用户输入要更新的性別
age[strlen(age) - 1] = 0;// 将字符串最后一个回车去掉
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "%s", "请输入要修改的班级>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
// SQL程序的标准写法如下所示
char classes[1024];
memset(classes, 0, sizeof(classes));
read(STDIN_FILENO, classes, sizeof(classes));// 等待用户输入要更新的班级
classes[strlen(classes) - 1] = 0;// 将字符串最后一个回车去掉
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "UPDATA table1 SET sex = '%s', age = '%s', class = '%s' WHERE name = '%s'", sex, age, classes, name);
printf("'%s'\n", SQL);
}
void selectname(char *SQL)
{
/*
char SQL[1024];
memset(SQL, 0, BUFSIZE);
sprintf(SQL, "%s", "请输入要查询的名字>:");
write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
char name[1024];
memset(name, 0, sizeof(name));
read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要更新的名字
name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉
memset(SQL, 0, BUFSIZE);
if (strlen(name) == 0)
{
sprintf(SQL, "SELECT * FROM table1");
}
else
{
sprintf(SQL, "SELECT * FROM table1 WHERE name = '%s'", name);
}
*/
if (mysql_query(connection, SQL) != 0)
{
printf("query error, %s\n", mysql_error(&mysql));
}
// 調用mysql__stor_result得到查詢結果,放到result當中
MYSQL_RES *result = mysql_store_result(connection);
// 要知道返回数据有多少列才能自由的使用各种SELECT语句
MYSQL_FIELD *field;
int iFieldCount = 0;
while (1)
{
field = mysql_fetch_field(result);// 循环得到列名,如果循环到列的最后,返回NULL
if (field == NULL)
break;
iFieldCount++;
printf("%s\t", field->name);
}
printf("\n");
// 循环遍历每一行
MYSQL_ROW row;
while (1)
{
row = mysql_fetch_row(result);
if (row == NULL)
break;
int i = 0;
for (; i < iFieldCount; i++)
{
printf("%s\t", (const char*)row[i]);
}
printf("\n");
}
mysql_free_result(result);
}
int main(int arg, char *args[])
{
if (arg < 5)
{
return -1;
}
mysql_init(&mysql); // 相当于SQL内部初始化了一个TCP的socket,同时初始化了SQL必须的内存和一些结构
// 连接mysql_server
connection = mysql_real_connect(&mysql, args[1], args[2], args[3],
args[4], 0, 0, 0);
if (connection == NULL)
{
printf("connect error %s\n", mysql_error(&mysql));
return -1;
}
if (mysql_query(connection, "SET NAMES utf8") != 0)
{
printf("设置字符集错误, %s\n", mysql_error(&mysql));
}
char buf[BUFSIZE];
memset(buf, 0, sizeof(buf));
strcpy(buf, "请选择\n1:插入\n2:删除\n3:修改\n4:查询\n");
write(STDOUT_FILENO, buf, sizeof(buf));
memset(buf, 0, sizeof(buf));
read(STDIN_FILENO, buf, sizeof(buf));
if (strncmp(buf, "4", 1) == 0)
{
memset(buf, 0, sizeof(buf));
strcpy(buf, "请输入任意SELECT语句:");
write(STDOUT_FILENO, buf, sizeof(buf));
memset(buf, 0, sizeof(buf));
read(STDIN_FILENO, buf, sizeof(buf));
selectname(buf);
}
else
{
if (strncmp(buf, "1", 1) == 0)
{
insertname(buf);
}
if (strncmp(buf, "2", 1) == 0)
{
deletename(buf);
}
if (strncmp(buf, "3", 1) == 0)
{
updatename(buf);
}
mysql_query(connection, buf);
}
mysql_close(connection);
return EXIT_SUCCESS;
}
/*
下面测试
printf("AAAAAAAAAAAA");// 这个时候printf会吧输出的字符串放到输出缓冲区里面,直到遇到\n才会输出,或者输出缓冲区满了
memset(name, 0, sizeof(name));
read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要删除的名字
name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉
*/
/*struct termios term; // 定义一个termios结构
if (tcgetattr(STDIN_FILENO, &term) == -1)
{
printf("tchetattr error is %s\n", strerror(errno));
return 0;
}
// oldterm = term; // 保留当前termios设置,以便程序退出的时候可以恢复termios
//term.c_lflag &= ~ICANON;// 取消ICANON选项(不规范输入)
//term.c_lflag |= ICANON;// 设置ICNON选项(规范输入)
//term.c_cc字段为要设置的具体特殊输入字符,如c_cc[VERASE]代表退格键,
//term.c_cc[VERASE] = '\b';意思为把退格键修改为'\b'
//VERASE代表向前擦除一个字符,VINTR代表发送ctrl + c中断信号,ctrl + c的ASCII码为3
//例如:term.c_cc[VINTR] = '\t';意思为将tab键设置为中断信号
//tcsetattr中,第二个参数说明,TCSAFLUSH:发送了所有输出后更改才生效,在更改发生时,未读取的所有输入数据都被删除
//TCSANOW:更改立即生效
//TCSADRAIN:发送了所有输出后更改才发生,如果更改输出参数则应该使用该选项
term.c_cc[VERASE] = '\b';// '\b'为退格键的ASCII吗
if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)// 设置系统termion
{
printf("tcsetattr error is %s\n", strerror(errno));
}
//system("stty erase ^H");// 可以实现在输入状态下,按退格键删除,不回显,等同于上面功能
*/