我使用的是sublime3,首先下载MinGW,别问我是啥,我也不怎么了解,网上说 MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境,提供了GNU工具集。在这里我就理解它提供了gcc、g++、make等编译器吧。具体自行了解。 你可以上minGW官网http://www.mingw.org 或其他地方可以下载到,可视化安装界面,自行选择目录安装。比如我安装到了D:\minGW 安装完毕后,将minGW安装目录下的bin目录添加到环境变量,如下图,我将D:\minGW\bin添加到环境变量
关于使用PDO无法执行两次查询的问题
今天在使用PDO查询数据时遇到这么一个问题,使用实例化的PDO类无法执行两次查询,即第一次查询是正常的,第二次查询是无效的。 举个栗子:
1 | $pdo = new PDO('mysql:host=127.0.0.1;dbname=test;', 'root', ''); |
了解mysql中多版本并发控制
前面写的一篇《了解mysql的并发控制》中了解了mysql的并发控制,主要是通过锁机制来控制并发的。控制严格的锁会影响性能,反之则影响数据安全性。而mysql的大多数事务性存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。
可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。 MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。
了解mysql事务
mysql事务可能大多数人都有所了解,本篇博文主要记录我了解的事务的一些细节之处,也必然对事务能有进一步的理解。 看过《高性能mysql》一书,上面写道事务就是一组原子性的sql查询,或者说一个独立的工作单元。可能这句话并不是那么好理解,什么叫原子性?什么又是独立的工作单元?看几个例子和几个名词解释或许更加有帮助。
在事务中,如果数据库引擎能够成功地对数据库应用一组查询的全部语句,那么就执行这组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。 讲解事务最经典的例子还是银行转帐。
了解mysql的并发控制
关于mysql的并发控制,主要涉及“锁”这个概念。本篇博文为纯文字理论,看似可能有点枯燥,但易于理解也易懂。 何谓“锁”,“锁”是用来干嘛的?
我们先来看一个例子,我们以Unix系统的email box为例,这是一个邮箱,邮箱中的所有邮件都串行在一起,彼此首尾相连。这种格式对于读取和分析邮件信息非常友好,同时投递邮件也很容易,只要在文件末尾附加新的邮件内容即可。 那么,问题来了! 如果有两个进程同一时刻对同一个邮箱投递邮件,会发生什么情况?显然,邮箱的数据会被破坏,两份邮件的内容会交叉的附加在邮箱文件的末尾。那么我们就需要一种东西来控制邮件的投递,使得一个客户投递邮件时,将邮箱锁住,此时其他客户无法对此邮箱进行投递而进入等待,直到这个客户投递完毕解开锁才能进行投递。这就是所谓的“锁”,与mysql中的“锁”概念类似。
简单了解mysql逻辑架构
使用渐进式JPEG来提升用户体验
今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式)。
两种格式有相同尺寸以及图像数据,他们的扩展名也是相同的,唯一的区别是二者显示的方式不同。 Baseline JPEG 这种类型的JPEG文件存储方式是按从上到下的扫描方式,把每一行顺序的保存在JPEG文件中。打开这个文件显示它的内容时,数据将按照存储时的顺序从上到下一行一行的被显示出来,直到所有的数据都被读完,就完成了整张图片的显示。如果文件较大或者网络下载速度较慢,那么就会看到图片被一行行加载的效果,这种格式的JPEG没有什么优点,因此,一般都推荐使用Progressive JPEG。
OAuth2.0认证和授权原理
以前做过一个人人网的站内应用(http://apps.renren.com/rr_timer不过已经很久没更新了),其中就用到了OAtuth授权,今天要做个新浪微博授权登陆,那么正巧再复习一下OAuth认证和授权原理吧,也没多少时间写这玩意儿,网上之前看到一篇不错的就拉过来了。 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 
Windows下安装python和pip
此前安装过python,但因为安装pip过程中遇到了问题,所以把python也一起卸载了。现在重新安装一下这两个。 这里选择了python2.7.8版本进行安装,因为我需要使用sqlmap这个工具,而这个工具对python版本有要求,最新版本的python会出错,所以我选择了2.7.8的版本。 首先上官网https://www.python.org/downloads 下载
下载的是msi文件,直接打开像安装普通软件一样安装就行。但有一点一定要注意,如果你要使用pip,则安装python时选择的安装路径目录中不要有空格,如果安装到了Program Files这样的目录下,那么接下来安装的pip将无法正常运行,会报错。所以这里我直接选择了D盘下,安装前记得选择将python.exe添加到系统环境变量。
安装完之后在CMD中输入python命令会看到欢迎界面。 接下来安装pip,上https://pip.pypa.io/en/latest/installing.html下载 get-pip.py脚本 在CMD下找到该文件目录并运行下列命令(需要管理员权限): python get-pip.py
安装好之后,会发现python安装目录下会多出一个Scripts目录(若之前没有)。 这时我们直接在命令行输入pip,会显示‘pip’不是内部命令,也不是可运行的程序。因为我们还没有添加环境变量。 只要在PATH变量中添加:D:\Python27\Scripts;(路径自己更换)就好了,输入pip list 查看安装情况
如果出现下列错误,那么原因可能就是上面我所说的python安装路径目录名中有空格了
Fatal error in launcher: Unable to create process using ‘“D:\Program Files\Python27\python.exe” “D:\Program Files\Python27\Scripts\pip.exe” ‘
(完)
sql中where 1=1和 0=1 的作用
刚在写sql的时候思考了一下在不确定条件因素时的情况,之前看到别人使用过where 1=1这个条件, 这个条件始终为True,后来了解到在不定数量查询条件情况下,1=1可以很方便的规范语句。
一、不用where 1=1 在多条件查询中的困扰
举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大体如下:
$sql=”select * from table where”;
if(!empty($age))
{
$sql .= ‘age=’.$age’;
}
if(!empty($address))
{
$sql. = ‘and address=’.$address;
}
如果上述的两个if判断语句,均为true,即用户都输入了查询词,那么,最终的$sql动态构造语句变为: $sql= ‘select * from table where age=20 and address=”常州”‘; 可以看得出来,这是一条完整的正确的SQL查询语句,能够正确的被执行,并根据数据库是否存在记录,返回数据。 ②种假设 如果上述的两个if判断语句不成立,那么,最终的$sql动态构造语句变为: $sql = ‘select * from table where’; 现在,我们来看一下这条语句,由于where关键词后面需要使用条件,但是这条语句根本就不存在条件,所以,该语句就是一条错误的语句,肯定不能被执行,不仅报错,同时还不会查询到任何数据。 上述的两种假设,代表了现实的应用,说明,语句的构造存在问题,不足以应付灵活多变的查询条件。
二、使用 where 1=1 的好处
假如我们将上述的语句改为:
$sql=”select * from table where 1=1”;
if(!empty($age))
{
$sql .= ‘ and age=’.$age’;
}
if(!empty($address))
{
$sql. = ‘and address=’.$address;
}
①种假设 如果两个if都成立,那么,语句变为: $sql = ‘select * from table where 1=1 and age=12 and address=”常州’”,很明显,该语句是一条正确的语句,能够正确执行,如果数据库有记录,肯定会被查询到。 ②种假设 如果两个if都不成立,那么,语句变为: $sql = ‘select * from table where 1=1’,现在,我们来看这条语句,由于where 1=1 是为true的语句,因此,该条语句语法正确,能够被正确执行,它的作用相当于:$sql = ‘select * from table’,即返回表中所有数据。 言下之意就是:如果用户在多条件查询页面中,不选择任何字段、不输入任何关键词,那么,必将返回表中所有数据;如果用户在页面中,选择了部分字段并且输入了部分查询关键词,那么,就按用户设置的条件进行查询。 说到这里,不知道您是否已明白,其实,where 1=1的应用,不是什么高级的应用,也不是所谓的智能化的构造,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法。 where 1=0; 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表 “select * from table where 1=0”; 该select语句主要用于读取表的结构而不考虑表中的数据,这样节省了内存,因为可以不用保存结果集。 create table newtable as select * from oldtable where 1=0; 创建一个新表,而新表的结构与查询的表的结构是一样的。

