00:00
行,诶刚才呢,咱们引出这个问题了,说诶为什么这块我就不写12呢,这个位置我就去了呢,这样做首先说可以,但是我们一般呢,使用prepare的statement的时候呢,都不会这样去做,咱们还是会,呃填充障碍符,然后呢,去把这个数据呢填上去,这样的一种模式,这种模式呢,也是针对于咱们prepare statement它使用的,也就是说statement呢,不是这样子的,哎,正因为statement不是这样的,所以它才可能会有SQL注入问题,那我们prepare为什么这样写,它就不会有注入问题了,诶我们下边就来演示一下这个呢,既然是说注入问题呢,咱们不妨就还写到,诶昨天咱们写的这个statement点加这里边啊,下边我们再去创建一个。这里边呢,就没有咱们新的代码了啊,咱就是刚才写的这个方法去应用一下pre statement它的一个测试,在这里边我们来演示解决SQ猪问题。
01:00
演示使用prepared statement。哎,他来替换statement。哎,解决售后猪问题。哎,其实搜购猪问题能解决了,那个拼串问题呢,其实也能解决啊,那么咱们当时做的话呢,是用的这个statement,具体这个做法呢,咱们是下边有个这样的一个操作,再往下下边这个操作呢,就是使用statement来实现的对数据表的一个查询操作了,那咱们现在的话呢,是不是用prepare做了。所以我们这个方法呢,就不用这个get了,用咱们刚才写的啊,查询这里边的找一个对象的方法就是这个呗。把这个操作CTRLC粘过来,粘到咱们的这个里边,诶我CTRLV一下就放到这了,然后咱们在上边做这个测试吧,上面测试的话呢,这个statement咱们测的时候呢,是这个测的,避免你觉得说你这个是不是不一样了,这咱们粘过来啊,就表明了这都是一样的操作。
02:08
行转过来了,然后这块呢,咱们这个不叫get了,我叫get instance。哎,这个我们做一个保存这个user get啊,这个咱们参数的这个顺序不一样啊,但是先写的class了,这个我得先把这个往前提。嗯,这么着是吧,好来捋一下啊,下面呢,就咱们写的这个获取表中的一条记录的一个方法,然后呢,我们一上来输入用户名,输入密码,诶然后这块呢,Select user password from这啊你记得咱们昨天讲的时候呢,一开始我这个user写成是大写了,当时报错了,诶这会就知道了啊,因为你要写成大写的话呢,我们获取这个对象的时候呢,在我们这个user里边。哎,咱们写这了啊,你这是小写的,那个是大写的,是不是找不到这个属性了,诶对,当时就是因为这个原因啊,就是我们这,诶你得用我们这个属性名,碰到了正好人家这个名这块就叫user,所以就也用不着起别名啊,就用统一的这个user小写的就可以了。
03:12
行,那查询这两个from这个表where user这个写法咱们变了,哎,这个呢,因为咱们是用的prepared s user,等于咱们就用不着拼了。你这个呢,原来这个写的有点太恶心了是吧?哎,User等于占位符,And password等于占一符,诶我们是这样写的,然后接着呢,我们诶,Get instance调了方法,这个circle,然后逗号。需要填充这个障碍符,这两个障碍符不就是你上面获取到的这一个叫user,键盘输入的一个叫password吗?所以呢,很显然我们现在已经避免了拼串是吧?诶拼串不用写了,但是这个事呢,其实是个小事,顶多林写起来麻烦一点,这个搜后注入问题是一个大问题,那我这样写完以后,我们再去做一个查询,看看这个时候呢靠不靠谱,保存来。
04:09
首先我们先输入一个这个表中有数据的啊,AA123456。123456回车没问题,这呢是能登录成功的看行,然后下边我们再写一个不靠谱的,就咱们昨天呢,是用这个来充当的叫用户名,然后用后边这个充当的密码,当时呢是存在SQ注入问题的,现在CTRLC。哎,我输入它,然后再换行输入密码。到这儿。CTRLC,哎,CTRLV,这个时候我们如果用的STEM还是登录成功,但是如果用prepare statement会撤就失败了,哎,所以呢,我们使用prepared就解决了这个售后注入问题。那么大家想一下原理是什么,怎么它就可以了呢?
05:05
谁给解释一下?哎,这里边儿的核心点,其实就是这个占位符起到了很大的作用。怎么讲?哎,那我说一下了啊,嗯,你看我们这个位置里边,我叫where user等于谁,And password等于谁,咱们在一开始解释这个prepared statement的时候呢,有一句话,我说这句话呢,就非常简练直观的概括了prepare statement最主要的一个特征,它叫预编译SQ语句。诶,我们在生成这个prepared STEM的时候,你会发现我们连接啊,调了一个方法,我把这个circle呢就已经扔进去了,我们成这个prepared s,其已经把这个circleq呢已经使用过了,算是这叫预变译嘛,哎,那使用过的意思是什么呢?我这个时候的SQ里边,咱们还没有填占略符呢啊,我这个SCO里边针对于咱们这个问题来讲,我就想表示的是谁and的谁的一种关系,这种关系谁也改变不了,在你没有填这个数据的时候呢,我就是一个且的关系,这叫预编译词汇语句,我就表示谁且谁,然后呢,你后边呢,通过填充占位符的方式。
06:33
给我们填了俩数据啊,这俩数据我就认为你这就叫user,你这个呢就叫password。就相当于我挖了俩坑,你把这俩坑的这个数据给我填进去,我这是且的关系,而我们昨天为什么说statement就不靠谱呢?因为statement呢,本来他想表达的呢,也是谁写谁的关系,但是呢,它是整个。啊,拿着这个SQL呢,就上去操作了,他没有预编译这个说法,没有预编译这个说法,所以呢,当我们填的这个数据呢,你看不靠谱的时候呢,我们就把这个原来的谁写谁的关系的给它变成了all的关系了。
07:11
所以导致呢,你这个SQ呢,原来那个意思变了。由且的关系变成了all的关系了,这是因为你没有提前有一个预编译的这个过程,而我们这里边呢,预编译了你就是且的关系,那不管你这块怎么写,那就是且的关系,这种关系不会被改变,所以呢,就不存在SQ注入问题了。对吧。好吧,有点懵,哎,体会一下这个事儿,那么prepared STEM的好处不止于此,哎,你看我们这块呢,说能够解决这个S后主问题了,那我们下边说说,除了解决诶statement的,哎,我们说这个叫拼串,这也算是一个问题啊,还有circleql注入问题之外。说prepared SIM还有哪些好处呢?或者呢,还能做什么呢?诶那这里边呢,我们就是下午要给大家讲解的几个问题了,比如说第一个问题,那我们呢,可以去操作图片呀,视频呀,我们这呢,因为你是个占位符了,我们就可以呢,就诶拿一个流的方式呢去给你填充,但是你要是一个SQL语句里边,你想写一个流,写一个文件,这个事是不现实的,也就是说我们prepared statement它可以呢来操作lob类型的数据啊,而咱们的statement它是做不到的。
08:38
哎,做不到,因为呢,你就是这个circle,你circleq里边怎么能放一个文件,几个G的文件呢,这不现实,而我们这个有障碍符呢,我们是可以传流的,诶他能做到了,这是一个,第二个呢,还能做什么呢?我们说这个prepared statement啊,它呢可以实现更高效的批量插入。更高效的,哎,或者我们就先讲一个批量操作,诶,那么大家也可以简单来体会一下,你看啊,我们现在呢,想把呃,比如说一般的我们都不是这个查询了啊,一般咱们都是一些增删改操作了。
09:19
举个例子,简单说一下这个事,一般呢,我们都是一些增删改操作,比如我现在就是一个添加数据,我现在呢,想往customers这个表里边添加1万条数据,添加1万条数据,如果我们用statement的话呢,就是你把这个数据都没有专碍符啊,你都写具体了,然后呢,这时候有一条执行一次,再有一条再执行一次,一共呢有1万条,这里边呢,每一条词后语句是不是都不一样,因为我们这里边这个信息是不是都不一样,对它就需要呢?呃,把这个SQ语句,它也得需要有个语法的校验哈,1万次的话呢,它就要校验1万次,而我们用prepared STEM的话呢,我不管你先要填什么,反正大家都是这个格式,这个我就校验一次,检验一次,我就给它缓存起来之后的你1万次数据的添加,只是呢填充这几个位置而已,所以呢,他在批量操作方面比我们statement也要好。
10:19
嗯,哎,比我们这个statement要好,哎这个总之一句话呢,就是我们这个prepared statement呢,诶它是完全的替换了这个statement,诶那下午的时候呢,我们再讲这两个具体的问题啊。
我来说两句