C语言操作mysql

 

php中 mysqli, pdo 可以用 mysqlndlibmysqlclient 实现

前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性,推荐用 mysqlnd

 

mysqlnd , libmysqlclient 对比:
http://php.net/manual/en/mysqlinfo.library.choosing.php

 

mysqlnd 目前是php源码的一部分

http://php.net/manual/en/intro.mysqlnd.php

 

php编译参数:

// Recommended, compiles with mysqlnd
$ ./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd// Alternatively recommended, compiles with mysqlnd as of PHP 5.4
$ ./configure --with-mysqli --with-pdo-mysql --with-mysql// Not recommended, compiles with libmysqlclient
$ ./configure --with-mysqli=/path/to/mysql_config --with-pdo-mysql=/path/to/mysql_config --with-mysql=/path/to/mysql_config

 

环境准备:

1、安装 libmysqlclient

http://cdn.mysql.com/Downloads/Connector-C/mysql-connector-c-6.0.2.tar.gz

  1. Change location to the top-level directory of the source distribution.

  2. Generate the Makefile:

    shell> cmake -G "Unix Makefiles"
    

    Or, for a Debug build:

    shell> cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
    

    By default, the installation location for Connector/C is /usr/local/mysql. To change this location, use theCMAKE_INSTALL_PREFIX option to specify a different directory when generating the Makefile. For example:

    shell> cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/opt/local/mysql
    

    For other CMake options that you might find useful, see Other Connector/C Build Options.

  3. Build the project:

    shell> make
    
  4. As root, install the Connector/C headers, libraries, and utilities:

    root-shell> make install

 示例代码:

//main.c
//gcc main.c -o test -lmysqlclient// @link http://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.htm// libmysqlclient library

#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>MYSQL *get_conn()
{//连接配置char *host = "127.0.0.1";char *user = "root";char *passwd = "";char *db = "test";int  port = 3306;my_bool reconnect = 1;MYSQL *my_con = (MYSQL *)malloc( sizeof(MYSQL) ); //数据库连接句柄//连接数据库
    mysql_init(my_con); mysql_options(my_con, MYSQL_OPT_RECONNECT, &reconnect);mysql_real_connect(my_con, host, user, passwd, db, port, NULL, CLIENT_FOUND_ROWS);mysql_query(my_con, "set names utf8");return my_con;
}/*** 释放空间,关闭连接* * @param mysql* @return */
void free_conn(MYSQL *mysql)
{mysql_close(mysql);free(mysql);
}//发生错误时,输出错误信息,关闭连接,退出程序
void error_quit(const char *str, MYSQL *connection)
{fprintf(stderr, "%s\n errno: %d\n error:%s\n sqlstat:%s\n",str, mysql_errno(connection),mysql_error(connection),mysql_sqlstate(connection));if( connection != NULL ){mysql_close(connection);}free(connection);exit(EXIT_FAILURE);
}void insert(MYSQL *my_con)
{int res;res = mysql_query(my_con, "INSERT INTO test(fid) VALUES(null)");if( res != 0 ){error_quit("Select fail", my_con);}printf("affected rows:%d \n", mysql_affected_rows(my_con));printf("last insertId :%d \n", mysql_insert_id(my_con));}void update(MYSQL *my_con)
{int res;res = mysql_query(my_con, "UPDATE test SET FScore=119.10");if( res != 0 ){error_quit("Select fail", my_con);}printf("affected rows:%d \n", mysql_affected_rows(my_con));}void delete(MYSQL *my_con)
{int res;res = mysql_query(my_con, "DELETE FROM test WHERE FID=31");if( res != 0 ){error_quit("Select fail", my_con);}printf("affected rows:%d \n", mysql_affected_rows(my_con));}void query(MYSQL *my_con)
{MYSQL_RES   *my_res;    //查询结果MYSQL_FIELD *my_field;  //结果中字段信息MYSQL_ROW    my_row;    //结果中数据信息
    unsigned long *lengths;int cols, res, i;//获取整个表的内容
    res = mysql_query(my_con, "SELECT * FROM test LIMIT 5");if( res != 0 ){error_quit("Select fail", my_con);}        /*mysql_query , mysql_real_query 区别While a connection is active, the client may send SQL statements to the server using mysql_query() or mysql_real_query(). The difference between the two is that mysql_query() expects the query to be specified as a null-terminated string whereas mysql_real_query() expects a counted string. If the string contains binary data (which may include null bytes), you must use mysql_real_query().     *///从服务端取回结果 mysql_store_result 会把数据全部拉取到客户端, mysql_use_result() 则不会my_res = mysql_store_result(my_con); // A MYSQL_RES result structure with the results. NULL (0) if an error occurred or has not result like deleteif( NULL == my_res ) //可以通过返回值来判断是否是 select 
    {error_quit("Get result fail", my_con);}// mysql_row_seek(), mysql_data_seek() , mysql_num_rows 只有在用mysql_store_result 才可以使用printf("num rows:%d \n", mysql_num_rows(my_res));//获取表的列数cols = mysql_num_fields(my_res);printf("num cols:%d \n", cols);//获取字段信息my_field = mysql_fetch_fields(my_res);for(i=0; i<cols; i++){printf("%s\t", my_field[i].name);}printf("\n");for(i=0; i<cols; i++){//字段类型printf("%d\t", my_field[i].type);}printf("\n");//输出执行结果while( my_row = mysql_fetch_row(my_res) ){for(i=0; i<cols; i++){//数据长度lengths = mysql_fetch_lengths(my_res);printf("%s(%lu)\t", my_row[i], lengths[i]);}printf("\n");}mysql_free_result(my_res);}void status(MYSQL *my_con)
{printf("mysql_get_server_info: %s \n", mysql_get_server_info(my_con));printf("mysql_stat: %s \n", mysql_stat(my_con));printf("mysql_get_proto_info: %u \n", mysql_get_proto_info(my_con));}int main(int argc, char *argv[]) 
{//连接数据库MYSQL *my_con = get_conn();if( NULL == my_con ) {error_quit("Connection fail", my_con);}printf("Connection success \n");status(my_con);insert(my_con);delete(my_con);update(my_con);//select
    query(my_con);// free the memory
    free_conn(my_con);return EXIT_SUCCESS;
}

 

test.sql

/*
Navicat MySQL Data TransferSource Server         : localhost
Source Server Version : 50524
Source Host           : 127.0.0.1:3306
Source Database       : testTarget Server Type    : MYSQL
Target Server Version : 50524
File Encoding         : 936Date: 2015-09-16 15:02:57
*/create DATABASE test;SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `test`
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (`FID` int(11) NOT NULL AUTO_INCREMENT,`FTableName` char(60) NOT NULL DEFAULT '',`FFieldName` char(30) NOT NULL DEFAULT '',`FTemplate` char(30) NOT NULL DEFAULT '',`FScore` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT 'ио╩§',PRIMARY KEY (`FID`)
) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=latin1;-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO test VALUES ('1', 'A', 'xx', 'TEMPALTE 1', '119.10');
INSERT INTO test VALUES ('2', 'B', 'jj', 'TEMPALTE 1', '119.10');
INSERT INTO test VALUES ('3', 'D', 'k', 'TEMPALTE 1', '119.10');
INSERT INTO test VALUES ('4', 'C', 'm', 'TEMPALTE 1', '119.10');
INSERT INTO test VALUES ('5', 'B', 'y', 'TEMPALTE 2', '119.10');
INSERT INTO test VALUES ('6', 'D', 'k', 'TEMPALTE 2', '119.10');
INSERT INTO test VALUES ('7', 'C', 'm', 'TEMPALTE 2', '119.10');
INSERT INTO test VALUES ('8', 'E', 'n', 'TEMPALTE 2', '119.10');
INSERT INTO test VALUES ('9', 'D', 'z', 'TEMPALTE 3', '119.10');
INSERT INTO test VALUES ('10', 'E', 'n', 'TEMPALTE 3', '119.10');
INSERT INTO test VALUES ('11', 'A', 'x', 'TEMPALTE 2', '119.10');
INSERT INTO test VALUES ('12', 'A', 'x', 'TEMPALTE 3', '119.10');
INSERT INTO test VALUES ('13', 'A', 'x', 'TEMPALTE 4', '119.10');
INSERT INTO test VALUES ('14', 'E', 'p', 'TEMPALTE 4', '119.10');
INSERT INTO test VALUES ('15', 'A', 'x', 'TEMPALTE 5', '119.10');
INSERT INTO test VALUES ('16', 'C', 'q', 'TEMPALTE 5', '119.10');
INSERT INTO test VALUES ('17', '', '', '', '119.10');

 

 

参考文档:http://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html

 http://www.linuxfocus.org/ChineseGB/September2003/article304.shtml#304lfindex3

转载于:https://www.cnblogs.com/siqi/p/4810369.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日温度

根据每日 气温 列表&#xff0c;请重新生成一个列表&#xff0c;对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高&#xff0c;请在该位置用 0 来代替。 例如&#xff0c;给定一个列表 temperatures [73, 74, 75, 71, 69, 72, 76, 73]&#xf…

什么是Modbus

什么是Modbus 1. Modbus如何工作 Modbus是通过设备之间的几根连线来传递数据&#xff0c;最简单的设置就是主站和从站之间用一跟串口线相连。数据通过一串0或者1来传递&#xff0c;也就是位。0为正电压&#xff0c;1为负电压。位数据传递速度非常快&#xff0c;常见的传输速度为…

Android实例-拍摄和分享照片、分享文本(XE8+小米2)

结果&#xff1a; 1.分享文本不好使&#xff0c;原因不明。有大神了解的&#xff0c;请M我&#xff0c;在此十分感谢。 2.如果想支持图片编辑&#xff0c;将Action事件的Editable改为True。 相关资料&#xff1a; 官网地址&#xff1a;http://docwiki.embarcadero.com/RADStudi…

go语言 expected ; found a

错误代码&#xff0c;这是一段测试go语言类型转换的代码 package type_testimport "testing"type MyInt int64func TestImplicit(t *testing.T) {var a int32 1var b int64 3b (int64)avar c MyInt 4// c bt.Log(a, b, c) }报错代码 b (int64)a改正 b int6…

win8 metro 调用摄像头拍摄照片并将照片保存在对应的位置

刚刚做过这类开发&#xff0c;所以就先献丑了&#xff0c;当然所贴上的源代码都是经过验证过的&#xff0c;已经执行成功了&#xff0c;希望能够给大家一些借鉴&#xff1a; 以下是metro UI代码&#xff1a; <Pagex:Class"Camera.MainPage"xmlns"http://sche…

poj 3678 Katu Puzzle(2-sat)

Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a boolean operator op (one of AND, OR, XOR) and an integer c (0 ≤ c ≤ 1). One Katu is solvable if one can find each vertex Vi a value Xi (0 ≤ Xi ≤ 1) suc…

go 语言 first argument to append must be slice

错误代码 func TestSliceGrowing(t *testing.T) {s : [4]int{1, 2, 3, 4}for i :0; i<10; i {s append(s, i)t.Log(len(s), cap(s))} }报错代码 s append(s, i)原因&#xff1a;append的第一个参数必须是切片 更正 func TestSliceGrowing(t *testing.T) {s : []int{1,…

豆瓣网静态页面

divcss网站登录注册豆瓣读书视频 音乐同城小组阅读 豆瓣FM东西更多豆瓣视频 影讯&购票电视剧排行榜 分类影评预告片 向后向前3/5正在热映全部正在热映>>即将上映 烈日灼心 4.7终结者&#xff1a;创世纪... 4.7百团大战 4.7刺客&#xff1a;聂隐娘 4.7近期热门更多影视…

C++并发编程实战(豆瓣评分5.4)

评分已说明一切&#xff0c;切勿踩坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 推荐的翻译 C并发编程实战 关注公众号回复【C并发编程实…

奔跑吧,兄弟

10月底的时候&#xff0c;不能忍受老婆的奚落&#xff0c;开始了我的跑步计划。 说说&#xff0c;跑步需要注意的事项&#xff0c;首先你得有双跑步鞋&#xff0c;我有一次是穿了薄底鞋跑的&#xff0c;结果&#xff0c;打满了水泡。跑步前控制饮水&#xff0c;最好在饮食后2个…

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持&#xff0c;openSession、getCurrentSession都是编程式事务&#xff08;手动设置事务的提交、回滚&#xff09;中重要的对象&#xff0c;Hi…

go返回多个值和python返回多个值对比

go package mulVals_test import "testing" func returnMultiValues(n int)(int, int){return n1, n2 }func TestReturnMultiValues(t *testing.T) {// a : returnMultiValues(5)// 这里尝试用一个值接受多个返回值&#xff0c;将编译错误a, _ : returnMultiValues(…

努力学习 HTML5 (3)—— 改造传统的 HTML 页面

要了解和熟悉 HTML5 中的新的语义元素&#xff0c;最好的方式就是拿一经典的 HTML 文档作例子&#xff0c;然后把 HTML5 的一些新鲜营养充实进入。如下就是我们要改造的页面&#xff0c;该页面很简单&#xff0c;只包含一篇文章。 ApocalypsePage_Original.html&#xff0c;这是…

判断系统是大端还是小段

大端&#xff1a;高位内存存储低序字节小端&#xff1a;高位内存存储高序字节short a 0x0102&#xff0c;其中 01 高序字节&#xff0c; 02 低序字节 #include<stdio.h>int main() {union {short s;char c[sizeof(short)];} un;un.s 0x0102;if (sizeof(short) 2) {if…

C语言判断系统是32位还是64位

long 在 32 位系统中是 4 字节&#xff0c;与 int 表示范围相同&#xff0c;在 64 位系统中是 8 字节。 #include <stdio.h> #include <stdlib.h> #include <limits.h>int main() {long a INT_MAX;if (a 1 < 0) {printf("32: %ld\n", a);} e…

使用Eclipse搭建Struts2框架

本文转自http://blog.csdn.net/liaisuo/article/details/9064527 今天在Eclipse搭建了Struts2 框架&#xff0c;并完成了一个很简单的例子程序。 搭建好的全局图如下: 第一步:在http://struts.apache.org/download.cgi下载Struts2的最新版即下载Full Distribution&#xff0c;这…

autoLayout自动布局

autoLayout 有两个核心概念&#xff1a; 约束&#xff1a;就是对控件进行高度&#xff0c;宽度&#xff0c;相对位置的控制 参照&#xff1a;多个控件时&#xff0c;一个或多个控件以其中的一个为基准进行高度&#xff0c;宽度&#xff0c;位置的设置 当选择了 use auto layout…

JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

主要内容&#xff1a; JDBC连接数据库步骤。一个简单详细的查询数据的例子。封装连接数据库&#xff0c;释放数据库连接方法。实现查询&#xff0c;插入&#xff0c;删除&#xff0c;更新等十一个处理数据库信息的功能。&#xff08;包括事务处理&#xff0c;批量更新等&#x…

C++学习笔记25,析构函数总是会宣布virtual

为了永远记住析构函数声明virtual----><<effective c>> 为这句话不一定对,但无需质疑的是这句话是非常实用的. 查看以下的样例: #include <iostream> #include <string> using namespace std; class B{ public:~B(){cout<<"base is dest…

各大互联网公司2014前端笔试面试题–JavaScript篇

很多面试题是我自己面试BAT亲身经历碰到的。整理分享出来希望更多的前端er共同进步吧&#xff0c;不仅适用于求职者&#xff0c;对于巩固复习js更是大有裨益。 而更多的题目是我一路以来收集的&#xff0c;也有往年的&#xff0c;答案不确保一定正确&#xff0c;如有错误或有更…