MYSQL撰写的日志

php 安全问题

做web开发,相信搭建都知道一些安全基本知识,”千万不能相信客户端数据“。而php又是一种弱类型语言。很多人在开发过程中忽略了类型转换,参数过滤直接量成不可估量的后果。
不使用过滤函数可能出现以下情况:

数据库被(sql)注入。直接可以导致你的系统崩溃,系统数据丢失,用户信息丢失。
网站被挂马,遇到文件处理则可以将你的网站文件删除。

另外值得一提的是很多人认为开启php安全模式就万事大吉了。其实不然,很多注入者往往绕过正面,进行侧面进攻。

使用 0×7e,0×27等(ASCII码)字符串来充当引号,而php又无法过滤。
注入的一般方式都是在参数里面加入很多mysql sql语法,去获取敏感数据信息。

exp:

View Code SQLand(select 1 from(select count(*),concat((select (select (select concat(0×7e,0×27,phpcms_member.username,0×27,0×7e) from phpcms_member limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and 1=1

mysql information_schema.tables 所有用户都可见可查,能查出所有表结构信息,数据库信息。
php开源系统很多,很多开源系统大家知道数据结构,已级敏感信息表。(这里当然也包括不法分子)
这里指的敏感信息:往往是一些用户信息,管理端信息。现在md5的穷举一直在进行着。很多的md5加密之后的密码仍然能被解密成明文。
很多系统都做了相应的安全提升。
下面介绍以下常见手段:

使用过滤函数,php filter 安全过滤函数.
md5(  md5(‘用户密码’) . ‘私钥’ ) 得出加密结果。
常用的php开源系统后台一定要修改目录名。很多系统后台直接使用admin作为后台入口。
不要将phpmyadmin等数据库操作软件安置在网站可见目录。

等等。。之所以这样是由于现在大量存在扫描工具去扫描这样的管理端。
下面是惊心的一张图

mysql 数据导入导出方法

众所周知mysql的数据导出方法,可以使用到mysqldump这个命令,其中如果导出指定格式的数据困扰了我。
比如到处数据用逗号(‘),竖线(|)隔开的数据。很多人会说使用用

mysql -uUser -pPwd dbName -e “$sql” 进行导出。
其中$sql使用 SELECT * FROM `TABLENAME` WHERE xxx INTO OUTFILE “指定文件路劲” FIELDS TERMINATED BY ”|“

这种往往很多会报没有权限之类的莫名其妙的错误。
错误一

View Code ERRORERROR 1045 (28000) at line 1: Access denied for user ‘qinghua’@'localhost’ (using password: YES)

错误二

View Code ERRORERROR 1 (HY000) at line 1: Can’t create/write to file ‘/home/martin/outfile’ (Errcode: 13)

错误一是由于普通用户没有执行权限,错误二是由于没有权限穿件文件”aa”。
正确的做应该是

View Code SHELLmysql -uqinghua -p123456 qinghua –e "select More >

mysql 字符串处理函数

起因:最近需要用到mysql的字符串处理函数,一开始打算从数据库里面读取出来再采用php进行处理,后来一想干嘛非得借助别的语言呢,难道mysql真的不能完成以上工作吗。
环境:目标字段为一个text类型,存储的是一个json_encode过的对象,长度不一。需要将里面的某一个属性查询出来。
Exp:{“name”:”martin”,”age”:”25″,”Time”:”1299899245″,”status”:1} 取出Time属性。
初试:想采用mysql正则表达式去匹配其中的属性。
上网看了mysql正则表达式一章:http://dev.mysql.com/doc/refman/5.1/zh/regexp.html
发现只能匹配到某个字符存在与否。当然也可能我看得不够仔细。
再试:想采用mysql字符串处理函数,进行匹配。结果ok。
用到的函数 SUBSTRING、SUBSTING_INDEX、LENGTH、FROM_UNXITIME。

设置变量

View Code MYSQLset  @str = ‘{"name":"martin","age":"25","Time":"1299899245","status":1}’;

获取目标字符所在位置。

View Code MYSQLSELECT LENGTH(SUBSTRING( @str,’","status’,1 ));

使用SUBSTRING进行截取目标字符串

View Code MYSQLSELECT SUBSTRING_INDEX( @str ,  LENGTH(SUBSTRING( @str,’","status’,1 )) , 10 );

时间转换

View Code MYSQLSELECT FROM_UNIXTIME( SUBSTRING( @str ,  LENGTH(SUBSTRING_INDEX( @str,’","status’,1 )) -9, 10 ));

以上就完成了上述任务。还有更好的方法欢迎大家留言。

magento 性能优化

前言:
     Magento 是一个开源电子商务系统,尤其以扩展性高著称,但是很高的扩展性往往是牺牲了速度为代价的,虽然现在magento为速度提升做了很多工作,但是还是没能达到人们对速度的要求。既然如此还是很自然的选择了它,它的速度让很多客户无法接受,最近忙碌于magento性能优化。
     经过优化后,速度上了几个台阶,觉得能让大部分人都接受了,据本人目测最少快了(7-8倍)。
参考结合了前辈的经验总结了如下很重要的几点:
1) Magento Caching. Magento 自身cache
Goto Magento Admin -> System -> Cache Management
- Tick the following items:
– Configuration
– Layouts
– Block HTML output
– Translations
2) MySQL Cache Size 设置
query_cache_size=128M
innodb_buffer_pool_size=64M
innodb_additional_mem_pool=16M
4) Enabling Gzipping 启用gzip压缩
.htaccess
php_flag zlib.output_compression on
AddHandler application/x-httpd-php5 .css
修改 .htaccess mod_deflate 配置
本人配置如下:

View Code PHP # Insert filter on all content
SetOutputFilter DEFLATE
# More >

php 程序员

最近去了tencent,xunlei等互联网名企面试,总结一下:

如果想进入这类企业进行底层开发的话必须对互联网各方面的技术原理了解的很清楚,例如apache实现原理。语言方面既然是php开发自然对c/c++要求比较高。往往需要自己写php扩展。使用mysql自然想很多常见的,性能瓶颈要能有很好的解决方案。mysql 插件编写,apache模块编写。联系起来结合点还是要会c。
倘若是做中间层和前端工作则要求对css,javascript要求比较高。当然对web的一系列实现原理也是要非常熟悉的。
对新技术要比较敏感,才能证明你有很好的学习能力和使用能力。
努力提高自己的英文口语,和阅读能力。往往很多新技术都是老外想出来的。等有了中文版也许这个技术已经不是那么新了。

相信我们很多人都只是了解到中间的皮毛而已,对于技术原理。这类型的东西了解甚少。值得注意的一点,正则这个东西在他们严重也是很重要的。
想成为一位合格的php程序员(高级),必须符合如下条件。
◆ 文件目录处理函数包80%以上的函数的功能的灵活运用。
◆ 日期时间函数中的80%以上的函数的功能的灵活运用
◆ 数学函数库中的100%的内容。
◆ 网络库中的60%以上的内容,对各个函数的功能比较熟悉。
◆ 字符串处理函数下的60%以上的内容,特别是各种处理函数。
◆ 正则表达式函数下的90%以上的内容,特别是各种正则处理
◆ 一些安全库下的40%以上的内容,如果对于安全没有接触的话根本就不可能掌握PHP
◆ XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。
◆ 图形图像函数库下的80%以上的内容,特别是一些图像生成和处理
◆ MySQL 数据库函数下的90%以上的内容,特别是处理各种数据的函数
◆ 数组处理函数下的90%以上的内容,特别是各种操作处理函数
◆ 其它PEAR,PECL,和一些扩展类库中的80%以上的内容,特别是一些常用的类的处理
◆ 针对不同的需求,查找不同的函数库。
◆ 测试:必须熟悉使用phpunit编写测试用例完成代码的自动测试。
◆ 管理:必须熟悉使用xinc, phing等完成工程管理的常用任务,例如工程编译、生成phpdoc、生成、版本控制、自动测试。
◆ 排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。
◆ 思想:必须掌握OOP的主要要求,这样使用PHP开发的系统才能是真正的PHP系统。
◆ 规范:编写的代码必须符合流行的编码规范,这样程序的可读性才比较好。
◆ 博学:掌握OOA、OOD、YiiFramework 、Zendframework、cakephp、symfony、模板技术等流行技术,掌握软件架构设计思想、搜索引擎优化、缓存系统设计、网站负载均衡、系统性能调优等实用技术。
◆ 多去看别人写的代码,php优秀的框架很多,很多人在认知上就有一个错误。认为自己能用一个框架开发一个系统了就认为自己已经熟悉这个框架了,其实会使用他并没有什么一个框架基本都有用户手册,一看基本都会使用了,要想自己技术上面提升,建议多看看这些框架的实现原理(设计模式)。

mysql myisam innodb 区别

最近连续接到了两次tencent的电话面试,当然不是同一个部门。都涉及到了一个mysql的基础知识问题。为了防止第三次打电话来,备注下。^^。
题目1:讲讲你对mysql myisam,innodb的认识。然后你认为他们的区别在那里?为什么?
答:这两个是mysql主要存储引擎。
简要介绍来自官网。
简要介绍:MyIsam
MyISAM是 默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
简要介绍:InnoDB
InnoDB给MySQL提供 了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加 了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的 默认表。
InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
简单概括几点如下:

通过不上不难看出,MyIsam InnoDB的用途,Myisam主要适用于中小型数据量。InnoDB引擎适用于大数据量。上面已经讲得很清楚拉。著名的开源电子商务系统[magento]就是采用InnoDB创建。
MyIsam写入速度比InnoDB快。
在使用InnoDB时候需要对my.cnf进行配置以保证mysql达到最大效率。详细可以查看官网[inndo性能调节]:http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。

其中有很多人在网上发表了关于mysql MyIsam 和 InnoDB在存贮和读取方面的差异。暂时还没有做过度研究。
基本测试都是基于使用[事务]和不使用[事务],进行对比。mysql对于[非事务表]速度会比较块。
原因:待查证。
猜测:设定了 innodb_flush_log_at_trx_commit 如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交[SET AUTOCOMMIT = 0]来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能。
通过上面的分析,在我们采用mysql存储引擎的时候要按需分配。针对不同的存储引擎要采用不同的数据设计。
题目2:开发过程中,遇到糟糕的sql语句你是怎么解决的。
答:使用mysql的[EXPLAIN]对sql进行解释。因该还有更多好方法。
mysql 常见问题可以查看:http://www.blags.org/mysql-error-daquan-and-solutions/
mysql存储引擎的介绍 :http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html
以上如有不足之处,请大家帮忙补充,thk。

mysql 错误大全以及解决方法

     最近一直在捣鼓mysql.中间遇到各种各样的问题,记录一下。
服务器环境:lamp (linux[centos],apache2,mysql(5.x),php(5.2X)).
linux 环境下。所有数据库以及用户信息的存放位置可以在(vim /etc/my.cnf)查看[datadir=/usr/local/mysql_data ].
备份好这个目录里面的数据就会将mysql用户信息已经数据信息全部备份好了。安装好新的mysql版本之后修改[datadir]的指向,重启mysql就可以读取到信息了。
本人为了省事就采用了[yum install mysql],当然也可以采用下载然后编译.
以上过程中可能出现的问题:

读取不到数据库信息(原因:移动datadir过程中权限也改变了[chown mysql:mysql -R datadir]) ,datadir是你的存放路径。
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2),解决方法[查看是不是存在该文件。修改相应的路径 vim /etc/my.cnf,
查看是不是权限不对.ls -l ].
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (111),解决方法[修改相应的路径 vim /etc/my.cnf]
添加下面这段:

View Code MYSQL[client]
port More >

centos+zendce+red5+ffmpeg安装配置

本文主要是讲叙在centos服务器下如何快速的搭建AMP环境和流媒体服务器。至于性能测试和调优暂不涉及。
首先假设服务器已经安装了centos系统。推荐一款小软件。nmon for linux 服务器系统监测工具: wget http://sourceforge.net/projects/nmon/files/download/nmon_mainframe_12a_v2.zip/download
第一步,AMP环境采用Zend server 社区班Zend CE。
1.首先你要在建立Zend CE的下载库路径
vi /etc/yum.repos.d/zend.repo
添加的内容如下:

View Code ZEND[Zend]
name=Zend CE $releasever – $basearch – Released Updates
baseurl=http://repos.zend.com/rpm/ce/$basearch/
enabled=1
gpgcheck=0
[Zendce-noarch]
name=Zend CE – noarch
baseurl=http://repos.zend.com/rpm/ce/noarch
enabled=1
gpgcheck=0

2.开始安装如果服务器没有安装svn则需
yum install svn
如果服务器svn版本比较老。可以先删除在从yum安装。
# rpm -qa | grep -i subversion
subversion-1.4.2-2.el5
subversion-1.4.2-2.el5
rpm -evf –allmatches subversion-1.4.2-2.el5
3.yum install zend-ce
yum clean all//清楚缓存
4.让linux自动加载zend库文件
vim /etc/profile
在最后面添加内容:
PATH=$PATH:/usr/local/zend/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/zend/lib
保存退出
source /etc/profile   //生效
zendtpl.sh status //查看Zend server运行状态
zendtpl.sh start  //apache start
zendtpl.sh stop
zendtpl.sh restart  等同于 /etc/init.d/httpd restart 和 service More >

lamp 是什么

LAMP是一个缩写(linux apache mysql php[perl,python]),起源于英国,它指一组通常一起使用来运行动态网站或者服务器的自由软件.
Linux,操作系统;
Apache,网页服务器;
MySQL,数据库管理系统(或者数据库服务器);
PHP 和有时 Perl 或 Python,脚本语言。
虽然这些开放源代码程序本身并不是专门设计成同另几个程序一起工作的,但由于它们的廉价和普遍,这个组合开始流行(大多数Linux发行版本捆绑了这些软件)。当一起使用的时候,它们表现的像一个具有活力的解决方案包。
LAMP包的脚本组件中包括了CGIweb接口,它在90年代初期变得流行。这个技术允许网页浏览器的用户在服务器上执行一个程序,并且和接受静态的内容一样接受动态的内容。程序员使用脚本语言来创建这些程序因为它们能很容易有效的操作文本流,甚至当这些文本流并非源自程序自身时也是。正是由于这个原因系统设计者经常称这些脚本语言为胶水语言。
Michael Kunze 在一篇为德国电脑杂志c’t(1998,第12期,230页)而写的文章中使用了缩略语 LAMP。这篇文章意在展示一系列的自由软件成为了商业包的替换物。由于IT世界众所周知的对缩写的爱好,Kunze提出LAMP这一容易被市场接受的术语来普及自由软件的使用。
O’Reilly和MySQL AB在英语人群中普及了这个术语。的确,MySQL AB 自己的市场推广在某种程度上基于LAMP包的推广。其他的项目和厂商则推行这个术语的一些变体,包括:
LAPP(以PostgreSQL 替代 MySQL).
LAMP(最后两个字母意味着 Middleware 和 PostgreSQL).
WAMP(以 Microsoft Windows 替代 Linux).
MAMP(以 Macintosh 替代 Linux).
LAMJ 意指 JSP/servlet.
BAMP 以 BSD 替代 Linux.
WIMP 指 Microsoft Windows, Microsoft IIS,MySQL, PHP.
AMP(省略了操作系统;Apple最喜欢这个词眼[来源请求]).
XAMP(xml + apache + mysql + php).
一些人借用LAMP 来描述一类可定制组成的系统,而不是制造一系列新词,并用它来表示这些系统和统一打包的页面开发环境的不同。

access left join 使用方法

最近在用了下好久不用的access数据库。发现left join 和mysql的写法有些不一样记录一下。
access 左链接 层层都要加括号”()”。
mysql left join

View Code MYSQLselect h.*,ht.HouseTypeName,rt.RegionName,st.SubwayName from house h
left join HouseType ht on ht.ID = h.HouseTypeID
left join RegionType rt on rt.ID = h.RegionTypeID
left join SubwayType st on st.ID = h.SubwayTypeID
group by h.id order by h.id desc

access lef join

View Code ACCESSselect h.*,ht.HouseTypeName,rt.RegionName,st.SubwayName from
(
( (house h left join HouseType ht More >