关于PDO防御sql注入

2017-12-04 14:57:00

不要对已经被 magic_quotes_gpc或者htmlspecialchars 转义过的字符串使用 addslashes(),因为这样会导致双层转义,或会引起其他问题。 如果使用的是PDO,最好不要使用addslashes来达到sql的防注入目的,因为PDO本身就可以防御sql注入。PDO有一项参数:(参考官方手册)PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。 有些驱动不支持或有限度地支持本地预处理。使用此设置强制PDO总是模拟预处理语句(如果为 TRUE ),或试着使用本地预处理语句(如果为 FALSE)。如果驱动不能成功预处理当前查询,它将总是回到模拟预处理语句上。 需要 bool 类型。 有网友做过测试: 传送门使用模拟预处理语句(PDO::ATTR_EMULATE_PREPARES = true), php会...

阅读全文

mysql不允许使用列的别名作为查询条件

2017-03-02 16:24:00

例如:select col+1 as a from table where a>100;这样的sql在执行时会报错。 列表别名可以在 GROUP BY, ORDER BY, HAVING中被引用,而标准的SQL禁止在where中被引用,因为where语句执行在先。所以可以用子查询的方式代替 mysql中sql语句执行顺序:1. from 2. on 3. join 4. where 5. group by 6. with 7. having 8. select 9. distinct 10. order by 11. limit一条SQL会经过这11步的,中间的每一步都会生成一张虚拟表,后面的步骤都是在上一张虚拟表中进行筛选与查询的 更详细可以参考:sql查询顺序

阅读全文

mysql性能分析工具

2016-12-19 16:37:00

mysql version>5.0.37执行sql后,使用 SHOW profiles 查询sql执行时间SHOW profiles;根据query_id 查看某个查询的详细时间耗费,用于分析sql执行各个阶段所花时间(79为query_id)SHOW profile FOR QUERY 79查看占用cpu、 io等信息SHOW profile block io,cpu FOR QUERY 79;mysql对同一条sql进行了缓存,在第二次运行时, 瞬间就完成了,若要清除缓存:reset query cache;

阅读全文

mysql同一字段多条件查询

2016-11-18 11:42:00

例子:抽奖记录表,需要查询每天抽奖人数(去重)、每一种抽奖类型的总数、领取总数表结构:CREATE TABLE `lottery` ( `id` int(10) NOT NULL COMMENT '主键id', `uid` int(10) NOT NULL COMMENT '用户id', `dateline` int(11) NOT NULL COMMENT '时间', `type` tinyint(1) NOT NULL COMMENT '奖品类型:1:现金,2.优惠卷,3.积分', `is_get` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否领取' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖记录表';sql语句:SELECT FROM_UNIXTIME(`dateline`,'%Y-%m-%d') AS days, COUNT(DISTINCT(`uid`)) AS uids, SUM(`is_get`) AS `get`, COUNT(`id`) AS cj, COUNT(IF(type = 1,TRUE,NULL))...

阅读全文

mysql实用时间日期函数

2016-10-26 16:37:00

时间戳字段名: timestamp_name (如:1470651537)时间日期字段名: datetime_name (如:2016-08-08 18:18:57) 今天select * from 表名 where to_days(datetime_name)=to_days(now()); 昨天SELECT * FROM `表名` where TO_DAYS(NOW()) – TO_DAYS(datetime_name) = 1;/*DATEDIFF(now() , FROM_UNIXTIME(`timestamp_name`)) = 1; //时间字段 存储类型为时间戳*/ 7天SELECT * FROM `表名` where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(datetime_name);/*DATEDIFF(now() , FROM_UNIXTIME(`timestamp_name`)) = 7; //时间字段 存储类型为时间戳*/ 近30天SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <...

阅读全文

mysql 全文索引

2016-06-29 18:29:24

MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。如:SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('词1 词2 词3 ... 词m');MATCH 相当于要匹配的列,而 AGAINST 就是要找的内容。 table需要是MyISAM类型的表,col1、col2 必须是char、varchar或text类型,在查询之前需要在 col1 和 col2 上分别建立全文索引(FULLTEXT索引)。 mysql官方原文:MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])MySQL支持全文索引和搜索功能。MySQL中的全文索引类型FULLTEXT的索引。  FULLTEXT 索引仅可用于 MyISAM 表;他们可以从CHAR、 VARCHAR...

阅读全文

redis安装到windows

2016-05-16 10:14:00

windows下安装redis先phpinfo看下自己php和电脑相关环境版本:PHP Version 5.6.15System        Windows NT DEV-3 6.1 build 7601 (Windows 7 Ultimate Edition Service Pack 1) i586Compiler     MSVC11 (Visual C++ 2012)Architecture     x86虽然我用的是x64系统,但是环境用的是x86的,所以下载redis扩展应对应下载 5.6 Thread Safe (TS) x86non-thread-safe 非线程安全 与IIS搭配环境thread-safe  线程安全 与apache搭配环境下载地址:php_redis扩展下载https://pecl.php.net/package/redis/2.2.7/windowsredis安装包下载https://github.com/dmajkic/redi...

阅读全文

mysql 逗号分隔查询

2016-05-13 10:36:00

FIND_IN_SET(str,strlist) str为要查询的字符串;strlist需是以逗号分隔的字符串;第一个参数不可以有(','); 查询有结果则返回记录行,没有则为空例:SELECT * from test where FIND_IN_SET('3',strlist);strlist为要查询的字段,'3'为要查询的数据比如strlist的数据有(2,3,4),(5,13,23),(7,36,33),(3)则查到的数据为第一条和最后一条 它不同于 like 模糊查询,它是以“,”来分隔值like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于或等于like查询的结果。 FIND_IN_SET还可以用来替代in的功能,如:SELECT * from test where FIND_IN_SET(id,'2,5,3,9'); /*...

阅读全文

mysql重复字段查询

2016-03-30 10:19:00

mysql重复字段查询:按重复字段name查询,筛选数据为idSELECT id, name, score, GROUP_CONCAT(id order by id ASC separator ',') AS someid FROM testtb WHERE 1 GROUP BY name;按重复字段score查询,筛选数据为idSELECT id, name, score, GROUP_CONCAT(id) AS someid FROM testtb WHERE 1 GROUP BY score;GROUP_CONCAT与GROUP BY一起用,group by后面的字段为要查询的重复字段,GROUP_CONCAT里面的字段为重复记录里面其他字段值的集合, separator是符号分隔符,如果没有,默认为逗号(,)

阅读全文

mysql批量插入insert into性能优化

2016-02-24 16:50:00

源代码:<?php //批量插入 function insertAll($tbname,$info){ if(!is_array($info[0])) return false; $data = array(); foreach ($info as $value) { $data[] = '('.implode(',', $this->array_batch($value,"'")).')'; } $fields = '('.implode(',', array_keys($info[0])).')'; $sql = "insert ".$tbname." ".$fields." values ".implode(',', $data); return $this->db->query($sql); }//数组批量处理 function array_batch($info,$bat="'"){ $data = array(); foreach ($info as $key => $value) { $data[$key] = $bat.$value.$bat; } return $data; } ?&gt...

阅读全文