python操作数据库(二)SQL语句参数化及防SQL注入

我们在做数据库开发过程中如果一不小心就会留下一些漏洞给别人留下可趁之机比如下面的代码:

import pymysql
import pymysql.cursors

conn=pymysql.connect(host="localhost",user="root",passwd="mysql",port=3306,db="studet")

cursor1=conn.cursors()

tem=input("请输入要查询的名字:")
sql = "select * from user where name=%s"%tem
cursor1.execute(sql)
a=cursor1.fetchall()
print(a)
conn.close()

代码本来的意思是根据输入的学生名字获得对应学生的详细信息,但是有的有人会利用代码的漏洞,比如下图img4.png

就能跳过要输入的name,直接获取所有信息,当这种方法被用到用户的登陆时,后果是可怕的。

python的数据库操作提供了参数化这个功能,只需要对代码进行一点微小的修改,就能有效避免这种结果,还能不影响他的真实效果。修改如下:
import pymysql
import pymysql.cursors

conn=pymysql.connect(host="localhost",user="root",passwd="mysql",port=3306,db="studet")

cursor1=conn.cursors()

tem=input("请输入要查询的名字:")
sql ="select * from user where name=%s"
cursor1.execute(sql,tem)
a=cursor1.fetchall()
print(a)
conn.close()

再次输入SQL注入语句就会得到下面的结果:
img6.png
这样就能很好的屏蔽掉了SQL注入!

指针的意义——间接赋值

通过指针间接赋值成立的三大条件:
1.2个变量(一个普通的变量一个指针变量)
2.建立关系
3.通过*操作指针指向的内存

void test()
{
    int a=100;
    int *p=NULL;
    p=&a;
    *p=20;
    printf("%d\n",a);//a=20;
}

面向对象的三大特征

面向对象的三大特征---封装,继承,多态
封装:
把属性和方法封装起来
class Maker{//类
public:
string name;//属性
int age;//属性
public:
void printClass()//方法
{
cout<<name<<age<<endl;
}
}
void test()
{
Maker maker;//maker为对象
}
继承:
class Son:public Maker{
public:
string SonName;
int SonAge;
public:
void printSonClass()
{
cout<<"Son"<<endl;
}

}
Son中有属性:SonName,SonAge,name,age
Son中有方法:printClass(),printSonClass();
多态:有继承,有重写父类的虚函数,有父类指针或引用指向子类对象。

python操作数据库(一)

做开发,肯定离不开数据存储,数据存储就肯定离不开数据库,我们今天就介绍一下python操作数据库。
需要的工具
1.python3.5
2.pycharm
3.mysql数据库(首先要下载一个数据库,安装一直点默认就可以正常安装)
4.pymysql(进入python3.5的安装目录,进入Scripts目录下面,进入windows下的黑窗口,./pip.exe install pymysql)

一般我们只是通过python操作数据库,创建数据库和表直接在mysql的客户端进行操作

安装好mysql之后,你会在开始菜单发现一个mysql文件夹,点击mysql文件夹下面的mysql client 软件界面如下,画圈的那个:
img1.png
然后输入你在安装mysql的时候输入的密码,就进入mysql客户端,界面如下:
img2.png

然后就可以在mysql客户段输入sql语句了。

1.创建数据库
create database classTest charset=utf8;(charset=utf8是设置数据库的编码格式,classTest是数据库名称,每条语句后面跟;表示语句结束)
2.展示数据库
show databases;
3.选择数据库
use classTest;
4.创建表
create table temploee(name(varchar),salary(int),sex(tinyint));
5.删除表
drop table temploee;
6.向表里面插入数据
insert into temploee(name,salary,sex) values('xiaowang',5000,1);
7.从表里面删除数据
delete from temploee where salary=5000;(删除工资为5000的数据)
8.更新表里面的数据
update temploee set salary=4000 where sex=1;
9.查看表里面数据
select * from temploee;(查询所有数据)
select * from tempolee where salary=5000;(查询工资为五千的所有数据)
select name,sex from temploee where salary=5000;(查询工资为五千的name和sex)

常用的就是这些语句,具体详细mysql操作的可以参考我另外一篇专门写mysql数据库的文章。

接下来我们在pycharm里面用python代码来操作mysql数据库,向数据库插入一条数据,代码如下:
import pymysql
import pymysql.cursors

conn = pymysql.connect(user='root',passwd='123456',db='asia',host='127.0.0.1',port=3306)

dbcour = conn.cursor()

dbcour.execute("insert into temp(name,salary,sex) values('xiaowang',5000,1)")

conn.commit()#一定要提交不然在数据库里面看不到插入数据
conn.close()

执行上面的代码之后进入mysql客户端查看一下,会发现数据库已经增加了一条数据。

学完插入之后我们再来看一下查询数据。
import pymysql
import pymysql.cursors

conn = pymysql.connect(host='127.0.0.1',db='asia',user='root',passwd='123456')

cursor = conn.cursor()

cursor.execute("select * from temp")

print(cursor.fetchone())#fetchone()获取一条数据,fetchall()获得所有的数据,fetchmany(2)从数据库得到两条数据,rowcount属性能显示这次的查询结构能够得到多少条记录,fetchone()和fetchmany()函数都是迭代执行的,第二次执行这个函数得到的数据和第一次执行可能不一样
conn.close()

执行上面的代码就能获得数据库中的一条数据,执行结果如下:
img3.png

python爬虫(一)

安装完python开发环境肯定迫不及待想撸一发python代码。那我们就从爬虫开始吧!

我们可以先通过python 来实现这样一个简单的爬虫功能,把我们想要的网上的图片爬取到本地。下面我们就一起使用python来实现这样一个功能。

1.先获取整个页面的信息

import urllib.request

def getHtml(url):
page = urllib.request.urlopen(url).read()
page = page.decode('UTF-8')#设置编码格式,网页中有中文的话就会出现乱码
return page

html = getHtml("http://tieba.baidu.com/p/2738151262")

print (html)

urllib.request模块提供了web页面读取数据的接口,urlopen方法打开一个网址,然后再用read()读取数据,就得到了网页的源代码,注意这里的网址必须加上http://,平常我们通过浏览器输入网址,浏览器会自动帮我们加上协议头,但是自己写代码实现就得自己规定好协议头。如果要爬取的网页有中文,还要设置读取内容的编码格式。最后你就能看到爬取的页面信息了。

当然这不是我们想要的数据,接着我们就要筛选数据了。
2.筛选需要的数据

筛选数据一般用正则表达式,python提供了非常强大的正则表达式,我们后面会讲到,这里先简单用一下。

这里我找的是百度贴吧,美图吧随便挑的一个帖子当例子,来爬取上面的内容。帖子的地址是https://tieba.baidu.com/p/5207790512

我用的是谷歌浏览器,所以这里面就以谷歌浏览器为例。先打开页面,鼠标单击右键,能看到如下图的界面
审查图片

点击检查,就能看到如下的样子检查元素

通过检查元素我们找到了图片的地址,格式类似于:

修改我们的简单代码,如下

import urllib.request
import re

def getHtml(url):
page = urllib.request.urlopen(url).read()
page = page.decode('UTF-8')
return page

def getImg(page):
imglist = re.findall(r'<img class="BDE_Image" src="(.+?)" size',page)
return imglist

html = getHtml("https://tieba.baidu.com/p/5207790512")
print (getImg(html))

re模块就是python给我们提供的正则表达式包

re.findall()第一个参数是正则表达式对象,第二个参数是目标字符串,也就是我们取到的网页源代码

运行这串代码,讲打印出整个页面中包含图片的URL地址运行结果如下:img5.png

3.把找到的图片保存到本地
代码如下

import urllib.request
import re

def getHtml(url):
page = urllib.request.urlopen(url).read()
page = page.decode('UTF-8')
return page

def getImg(page):
imglist = re.findall(r'<img class="BDE_Image" src="(.+?)" size',page)
x=0
for imgurl in imglist:
f = open("%s.jpg"%x,'wb')
f.write(urllib.request.urlopen(imgurl).read())
print("正在保存图片%s.jpg"%x)
f.close()
x+=1

html = getHtml("https://tieba.baidu.com/p/5207790512")
getImg(html)

用for循环遍历刚才我们找到的图片地址,然后再一次调用urlopen就得到了图片,注意,这里的写入是wb模式,也就是二进制写入,因为是图片,和我们平常文本写入不太一样!

执行上面那串代码的结果如下:
img6.png

我们就可以欣赏我们工作成果了!!!