‘学习资料’栏目的所有文章

2010年06月10日 22:16

你应该知道的PHP十件事

1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里。 这种方法把存储空间降到了接近四分之一(char(15)的15个字节对整形的4个字节),计算一个特定的地址是不是在一个区段内也更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。 2.在验证Email地址的时候使用checkdnsrr() 函数验证域名是否存在。 这个内置函数能够确认指定的域名能够解析成IP地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于checkdnsrr(),用来验证 email 地址的合法性。对于那些认为自己的Email地址是user@www163.com而不是user@163.com的家伙们,这个方法可以很方便的抓住他们。 3.如果你使用的是PHP 5和MySQL 4.1 或者更高的版本,考虑用mysqli_* 系列函数。 一个很好的功能就是你可以使用预处理语句,如果你在维护一个数据库密集型站点,这个功能能够加快查询速度。一些评估分数。 4.学会爱上三元运算符。 5.如果你在项目中感觉到有可复用的部分,在你写下一行代码前先看看PEAR中是否已经有了。 很多PHP程序员都知道 PEAR 是一个很好的资源库,虽然还有很多程序员不知道。这个在线资源库包含了超过400个可以复用的程序片段,这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的,你总能找到帮你节省时间的 PEAR包。 6.用 highlight_file()来自动的打印出格式化的很漂亮的源代码。 如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话,这个函数用起来非常的顺手。当然了,要小心不要意外的泄露出你的数据库连接信息和密码等。 7.使用 error_reporting(0)函数来防止用户看到潜在的敏感错误信息。 在理想情况下,发布服务器应该在php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话,你没有自己的 php.ini 文件,那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。这就能够在出错的时候完全屏蔽敏感的SQL查询语句和路径名。 8.在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。 这个PHP内置函数使用 gzip 算法,可以压缩普通文本达 90%。在我每次要读写BLOB类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。 9.通过“引用”传递参数的方法从一个函数中得到多个返回值。 就像三元运算符一样,大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下,从一个函数里返回多个值?”答案就是在变量前加上一个 “&” 符号,通过“引用”传递而非“值”传递。 [...]

2010年06月10日 21:00

收集一些常用的正则表达式

“^\d+$”  //非负整数(正整数 + 0) “^[0-9]*[1-9][0-9]*$”  //正整数 “^((-\d+)|(0+))$”  //非正整数(负整数 + 0) “^-[0-9]*[1-9][0-9]*$”  //负整数 “^-?\d+$”    //整数 “^\d+(\.\d+)?$”  //非负浮点数(正浮点数 + 0) “^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$”  //正浮点数 “^((-\d+(\.\d+)?)|(0+(\.0+)?))$”  //非正浮点数(负浮点数 + 0) “^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$”  //负浮点数 “^(-?\d+)(\.\d+)?$”  //浮点数 “^[A-Za-z]+$”  //由26个英文字母组成的字符串 “^[A-Z]+$”  //由26个英文字母的大写组成的字符串 “^[a-z]+$”  //由26个英文字母的小写组成的字符串 “^[A-Za-z0-9]+$”  //由数字和26个英文字母组成的字符串 “^\w+$”  //由数字、26个英文字母或者下划线组成的字符串 “^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”    //email地址 “^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$”  //url /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日 /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年 “^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$”   //Emil /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/     //电话号码 “^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$”   //IP地址 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配空行的正则表达式:\n[\s| ]*\r 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 元字符及其在正则表达式上下文中的行为: \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 ^ 匹配输入字符串的开始位置。如果设置了 [...]

2009年02月6日 15:24

键盘上每个键作用!!!

F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 CTRL+A全选 CTRL+C复制 CTRL+X剪切 CTRL+V粘贴 CTRL+Z撤消 CTRL+O打开 SHIFT+DELETE永久删除 DELETE删除 ALT+ENTER属性 ALT+F4关闭 CTRL+F4关闭 ALT+TAB切换 ALT+ESC切换 ALT+空格键窗口菜单 CTRL+ESC开始菜单 拖动某一项时按CTRL复制所选项目 拖动某一项时按CTRL+SHIFT创建快捷方式 将光盘插入到CD-ROM驱动器时按SHIFT键阻止光盘自动播放 Ctrl+1,2,3… 切换到从左边数起第1,2,3…个标签 Ctrl+A 全部选中当前页面内容 Ctrl+C 复制当前选中内容 Ctrl+D 打开“添加收藏”面版(把当前页面添加到收藏夹中) Ctrl+E 打开或关闭“搜索”侧边栏(各种搜索引擎可选) Ctrl+F 打开“查找”面版 Ctrl+G 打开或关闭“简易收集”面板 Ctrl+H 打开“历史”侧边栏 Ctrl+I 打开“收藏夹”侧边栏/另:将所有垂直平铺或水平平铺或层叠的窗口恢复 Ctrl+K 关闭除当前和锁定标签外的所有标签 Ctrl+L 打开“打开”面版(可以在当前页面打开Iternet地址或其他文件…) Ctrl+N 新建一个空白窗口(可更改,Maxthon选项→标签→新建) Ctrl+O 打开“打开”面版(可以在当前页面打开Iternet地址或其他文件…) Ctrl+P 打开“打印”面板(可以打印网页,图片什么的…) Ctrl+Q 打开“添加到过滤列表”面板(将当前页面地址发送到过滤列表) Ctrl+R 刷新当前页面 Ctrl+S 打开“保存网页”面板(可以将当前页面所有内容保存下来) Ctrl+T 垂直平铺所有窗口 Ctrl+V 粘贴当前剪贴板内的内容 Ctrl+W 关闭当前标签(窗口) Ctrl+X 剪切当前选中内容(一般只用于文本操作) Ctrl+Y 重做刚才动作(一般只用于文本操作) Ctrl+Z 撤消刚才动作(一般只用于文本操作) Ctrl+F4 关闭当前标签(窗口) Ctrl+F5 刷新当前页面 Ctrl+F6 按页面打开的先后时间顺序向前切换标签(窗口) Ctrl+F11 隐藏或显示菜单栏 Ctrl+Tab 以小菜单方式向下切换标签(窗口) Ctrl+Enter 域名自动完成http://www.XXX.com(内容可更改,Maxthon选项→地址栏→常规)/另:当输入焦点在搜索栏中时,为高亮关键字 Ctrl+拖曳 保存该链接的地址或已选中的文本或指定的图片到一个文件夹中(保存目录可更改,Maxthon选项→保存) [...]

2009年01月6日 04:08

两个PHP冷门函数的简要使用

相信你在使用Google或者Baidu搜索的时候,肯定碰到过他们的关键词提示。 对于搜索引擎来说,他们有一整套分词技术及完整的词库。而对于一般简单的PHP应用来说,做到这种完善的分词又是很困难的。 其实php中有两个函数,可以近似的完成这样的功能。 这两个函数就是:levenshtein 和 similar_text 以下分别是这两个函数的官方解释: http://www.php.net/manual/en/function.levenshtein.php http://www.php.net/manual/en/function.similar-text.php 我们来简单看一下使用这两个函数的效果。 echo levenshtein(“ubuntu”,”ubuntw”);     echo “<br>”;     echo levenshtein(“ubuntu”,”aubvntu”);         echo “<br>”;     echo levenshtein(“ubuntu”,”vbvntw”);         echo “<br>”;     echo levenshtein(“ubuntu”,”ubuntu”); 这段代码的输出是: 1 2 3 0 也就是说,对于levenshtein函数,两个字符相似度越高,其返回值越小,如果相等,则函数返回0。 再来看看similar_text函数 similar_text(“ubuntu”,”ubuntw”,$a);              echo $a;     echo “<br>”;      similar_text(“ubuntu”,”aubvntu”,$a);          echo $a;         echo “<br>”;      similar_text(“ubuntu”,”vbvntw”,$a);          [...]

2009年01月4日 09:43

网站之MySQL 索引分析和优化

   一、什么是索引?   索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。      假设我们创建了一个名为people的表:      CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );      然后,我们完全随机把1000个不同name值插入到people表。下图显示了people表所在数据文件的一小部分:      可以看到,在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列:      对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录的peopleid(SQL命令为“SELECT peopleid FROM people WHERE name=’Mike’;”),MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引,MySQL要扫描数据文件中的所有记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。      二、索引的类型   MySQL提供多种索引类型供选择:      普通索引   这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:   创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);   修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);   创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] [...]

2009年01月4日 09:29

MYSQL列类型选择与MYSQL查询效率

要选择有助于使查询执行更快的列,应遵循如下规则(这里,“BLOB 类型”应该理解为即包含B L O B也包含TEXT 类型):    ■ 使用定长列,不使用可变长列。这条准则对被经常修改,从而容易产生碎片的表来说特别重要。例如,应该选择CHAR 列而不选择VARCHAR 列。所要权衡的是使用定长列时,表所占用的空间更多,但如果能够承担这种空间的耗费,使用定长行将比使用可变长的行处理快得多。    ■ 在较短的列能够满足要求时不要使用较长的列。如果正使用的是定长的CHAR 列,应该使它们尽量短。如果列中所存储的最长值为40 个字符,那么就不要将其定义为CHAR ( 2 5 5 );只要定义为CHAR(40) 即可。如果能够使用MEDIUMINT 而不是BIGINT,表将会更小(磁盘I/O 也较少),其值在计算中也可以处理得更快。    ■ 将列定义为NOT NULL。这样处理更快,所需空间更少。而且有时还能简化查询,因为不需要检查是否存在特例NULL。    ■ 考虑使用ENUM 列。如果有一个只含有限数目的特定值的列,那么应该考虑将其转换为ENUM 列。ENUM 列的值可以更快地处理,因为它们在内部是以数值表示的。    ■ 使用PROCEDURE ANALYSE( )。如果使用的是MySQL3.23 或更新的版本,应该执行PROCEDURE ANALYSE( ),查看它所提供的关于表中列的信息:     相应输出中有一列是关于表中每列的最佳列类型的建议。第二个例子要求PROCEDURE ANALYSE( ) 不要建议含有多于16 个值或取多于256 字节的ENUM 类型(可根据需要更改这些值)。如果没有这样的限制,输出可能会很长;ENUM 的定义也会很难阅读。根据PROCEDURE ANALYSE( ) 的输出,会发现可以对表进行更改以利用更有效的类型。如果希望更改值类型,使用ALTER TABLE [...]

2008年12月24日 21:54

PHP function : preg_match_all

<?php   /* preg_match_all – Perform a global regular expression match. int preg_match_all (string $pattern , string $subject , array &$matches [ , int $flags [ , int $offset]]) Search $subject for all matches to the regular expression given in $pattern and put them in $matches in the order specified by $flags. After the first [...]

2008年02月24日 00:35

php正则表达式专题

一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 这里有一些可能会遇到的正则表达式示例: Visual Basic Scripting Edition VBScript 匹配 /^\[ \t]*$/ “^\[ \t]*$” 匹配一个空白行。 /\d{2}-\d{5}/ “\d{2}-\d{5}” 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。 /<(.*)>.*<\/\1>/ “<(.*)>.*<\/\1>” 匹配一个 HTML 标记。 下表是元字符及其在正则表达式上下文中的行为的一个完整列表: 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “(“。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 [...]

2008年02月24日 00:27

优化PHP代码的40条建议

优化PHP代码的40条建议 40 Tips for optimizing your php Code 原文地址:http://reinholdweber.com/?p=3 英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有限,请广大PHPer指正。 1.    If a method can be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。 2.    echo is faster than print. echo 比 print 快。 3.    Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。 4.    Set the maxvalue [...]

2007年09月27日 18:28

MySQL中代替Like语句的另一种写法

如查找用户名包含有”c”的所有用户, 可以用 use mydatabase select * from table1 where username like’%c%” 下面是完成上面功能的另一种写法: use mydatabase select * from table1 where charindex(‘c’,username)>0 这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字 符串及其它的运算上, 所以运用charindex函数也没什么大不了. 用这种方法也有好处, 那就是对%,|等在不能直接用like 查找到的字符中可以直接在这charindex中运用, 如下: use mydatabase select * from table1 where charindex(‘%’,username)>0 也可以写成: use mydatabase select * from table1 where charindex(char(37),username)>0 ASCII的字符即为%