在线
客服

在线客服
尊敬的客户,我们24小时竭诚为您服务 公司总机: 0755-83312037 (32条线)

客服
热线

0755-83312037 (32条线)
7*24小时客服服务热线

?

关注
微信

关注官方微信

返回
顶部

13

2019-04
PHP6.0备受关注:让面向对象编程更加简单

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">传PHP 6.0即将发布,包含很多新特性与语法.</font> </td> </tr></tbody></table> PHP 6.0将包含很多新的特性、语法改进,会让面向对象编程更加简单,另外还有很多重要的改进,比如Unicode的核心支持,这将让PHP更适合全球范围支 持和更加的健康发展。 <p>PHP下一个备受关注的版本6.0,已经进入snapshot阶段,不久即将发布。PHP 6.0将包含很多新的特性、语法改进,会让面向对象编程更加简单,另外还有很多重要的改进,比如Unicode的核心支持,这将让PHP更适合全球范围支 持和更加的健康发展。PHP是已经风靡全球的开源脚本语言,在数以万计的网站上运行着,PHP 6.0将完全向前兼容,同时增加许多令人激动的特性。 </p> <p>更加好的Unicode支持<br>NameSpace:名字空间,将更好的避免在函数及类之间的变量名冲突。<br>令人激动的Web 2.0特性<br>SOAP: 简单对象访问协议 (SOAP:Simple Object Access Protocol)SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。<br>XML:从PHP 5.1版本开始,XMLReader和XMLWriter就已经包含在PHP内核,它可以让它可以让XML编程更加轻松。</p> <p>当然,除了增加新的特性,一些会给系统带来不稳定因素和安全隐患的特性也将被取消,以下是取消的内容列表:</p> <p>magic_quotes<br>register_globals<br>register_long_arrays<br>safe_mode<br>magic_quotes<br></p>

Read more+

13

2019-04
PHP开发技巧:PHP网站发开实用技巧集锦

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">提高PHP开发效率的53个编程技巧.</font> </td> </tr></tbody></table> <p>用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。</p> <p>1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。</p> <p>2、$row[’id’] 的速度是$row[id]的7倍。</p> <p>3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。</p> <p>4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。</p> <p>5、注销那些不用的变量尤其是大数组,以便释放内存。</p> <p>6、尽量避免使用__get,__set,__autoload。</p> <p>7、require_once()代价昂贵。</p> <p>8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。</p> <p>9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p> <p>10、函数代替正则表达式完成相同功能。</p> <p>11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。</p> <p>12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。</p> <p>13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。</p> <p>14、用@屏蔽错误消息的做法非常低效,极其低效。</p> <p>15、打开apache的mod_deflate模块,可以提高网页的浏览速度。</p> <p>16、数据库连接当使用完毕时应关掉,不要用长连接。</p> <p>17、错误消息代价昂贵。</p> <p>18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。</p> <p>19、递增一个全局变量要比递增一个局部变量慢2倍。</p> <p>20、递增一个对象属性(如:$this-&gt;prop++)要比递增一个局部变量慢3倍。</p> <p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p> <p>22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。</p> <p>用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。</p> <p>1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。</p> <p>2、$row[’id’] 的速度是$row[id]的7倍。</p> <p>3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。</p> <p>4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。</p> <p>5、注销那些不用的变量尤其是大数组,以便释放内存。</p> <p>6、尽量避免使用__get,__set,__autoload。</p> <p>7、require_once()代价昂贵。</p> <p>8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。</p> <p>9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p> <p>10、函数代替正则表达式完成相同功能。</p> <p>11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。</p> <p>12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。</p> <p>13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。</p> <p>14、用@屏蔽错误消息的做法非常低效,极其低效。</p> <p>15、打开apache的mod_deflate模块,可以提高网页的浏览速度。</p> <p>16、数据库连接当使用完毕时应关掉,不要用长连接。</p> <p>17、错误消息代价昂贵。</p> <p>18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。</p> <p>19、递增一个全局变量要比递增一个局部变量慢2倍。</p> <p>20、递增一个对象属性(如:$this-&gt;prop++)要比递增一个局部变量慢3倍。</p> <p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p> <p>22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。</p> <p>&#160;</p> <table style="BORDER-BOTTOM: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-RIGHT: #cccccc 1px dotted" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf">if (strlen($foo) &lt; 5) { echo “Foo is too short”$$ }</td> </tr></tbody></table> <p>&#160;</p> <p>(与下面的技巧做比较)</p> <p>&#160;</p> <table style="BORDER-BOTTOM: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-RIGHT: #cccccc 1px dotted" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf">if (!isset($foo{5})) { echo “Foo is too short”$$ }</td> </tr></tbody></table> <p>&#160;</p> <p>调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。</p> <p>34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。</p> <p>35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。</p> <p>36、并非要用类实现所有的数据结构,数组也很有用。</p> <p>37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?</p> <p>38、当你需要时,你总能把代码分解成方法。</p> <p>39、尽量采用大量的PHP内置函数。</p> <p>40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。<br>41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。<br>42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。</p> <p>43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;</p> <p>44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;</p> <p>45、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);</p> <p>46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);</p> <p>47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);</p> <p>48、多维数组尽量不要循环嵌套赋值;</p> <p>49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;</p> <p>50、foreach效率更高,尽量用foreach代替while和for循环;</p> <p>51、用单引号替代双引号引用字符串;</p> <p>52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;</p> <p>53、对global变量,应该用完就unset()掉;</p>

Read more+

13

2019-04
Windows7系统环境安装配置PHP开发环境

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">Windows7系统环境安装配置PHP开发环境.</font> </td> </tr></tbody></table> <strong>一、Apache安装<br></strong>版本解释:openssl是表示带有openssl模块,利用openssl就可以给Apache配置SSL安全链接的,也就是使用https://方式进行访问。<br>     nossl则表示不带OpenSSL模块,无 法用于SSL安全链接,在这里我们下载带OpenSSL的。<br>选择版本:apache_2.2.14-win32-x86-openssl-0.9.8k.msi<br>下载地址:<a href="http://www.apache.org/dist/httpd/binaries/win32/"><font color="#0179a5">http://www.apache.org/dist/httpd/binaries/win32/</font></a> <p>首先我们在D盘(盘符根据实际情况自己选择)新建一个目录,<br>并且命名为“WAMP”其意义为“Wdindows Apache Mysql PhpMyAdmin” 之后安装的一些内容,也都将安装在该目录下。</p> <p>1.安装说明:<br>运行apache安装程序,方法非常简单,弹安装界面后一直“next”</p> <p>接着会出现一个界面,需要填写3个内容,分别为:Network Domain、Server Name、Administrator’s Email Address 随便填写就好,不影响内容。<br>在下面还有2个选项,默认选择为80端口,第二个为8080端口,根据个人需求选择,一般为默认80端口。<br>我们继续安装,选择Custom(自定义安装)-“next”</p> <p>其中有打着红X的组件,我们单击这个组件容,选择“This feature, and all subfeatures, will be installed on local hard drive.”,即“此部分,及下属子部分内容,全部安装在本地硬盘上”。-“next”</p> <p>然后选择右下角的“change ”改变安装路径,安装到刚才建立的目录中“D:\WAMP\Apache\”-“next”<br>安装完毕后,电脑右下角会多出一个图标,双击打开,选择start或restart,能正常运行,至此安装完毕。</p> <p>2.修改配置:<br>打开安装录下D:\WAMP\Apache\conf\httpd.conf 文件(修改配置文件时,不建议使用记事本,可能会对其造成影响,推荐使用Notepad++或其他编辑软件打开修改)</p> <p>打开以后Ctrl+F查找所要修改的内容</p> <p>在#LoadModule vhost_alias_module modules/mod_vhost_alias.so下添加:<br>LoadModule php5_module “D:/WAMP/PHP/php5apache2_2.dll”<br>PHPIniDir “D:/WAMP/PHP”<br>AddType application/x-httpd-php .php<br>AddType application/x-httpd-php .htm<br>AddType application/x-httpd-php .html</p> <p>DocumentRoot “E:/WAMP/Apache/htdocs”<br>修改成(这里的路径和IIS中wwwroot目录一样,用于存放网页,自定义或不做修改默认):DocumentRoot “D:/WAMP/www”</p> <p>&lt;Directory “E:/WAMP/Apache/htdocs”&gt;<br>修改成(自定义或不做修改默认):&lt;Directory “D:/WAMP/www”&gt;</p> <p>DirectoryIndex index.html<br>修改成:DirectoryIndex index.php default.php index.html index.htm default.html default.htm</p> <p>3.测试<br>在D:/WAMP/www目录下 建立个index.html页面<br>在浏览器中输入 <a href="http://localhost/"><font color="#0179a5">http://localhost/</font></a><br>如果能正常显示,Apache配置完毕,已经正常运行。</p> <p><strong>二、MySql安装</strong><br>版本解释:The Essentials Package:不包含 embedded server and benchmark suite,有自动安装程序和配置向导,没有MySQL Documentation。<br>     The Complete Package:包含 embedded server and benchmark suite,有自动安装程序和配置向导,有MySQL Documentation。<br>     The Noinstall Archive:包含 embedded server and benchmark suite,没有自动安装程序和配置向导,有MySQL Documentation。<br>选择版本:mysql-essential-5.1.44-win32.msi<br>下载地址:<a href="http://www.mysql.com/downloads/mysql/"><font color="#0179a5">http://www.mysql.com/downloads/mysql/</font></a></p> <p>1.安装说明:<br>打开安装程序,单击“next”<br>选择custom,组件为默认选择,我们不做改动-“next”</p> <p>路径设置为“D:\WAMP\Mysql”-“next”</p> <p>安装好以后点击“finish”<br>跟着会出现一个配置向导-“next”</p> <p>选择“Detailed Configuration(详细配置)”-“next”</p> <p>这里有3个选项:<br>Developer Machine,将只用尽量少的内存;<br>Server Machine,将使用中等数量内存;<br>Dedicated MySQL Server Machine,这台服务器上面只跑mysql数据库,将占用全部的内存。<br>可以根据自己需求选择,这里我们选择第二种“Server Machine”-“next”</p> <p>选择数据库用途,同样有3个选项:<br>Mutltifunctional Database多功能用途,将把数据库优化成很好的innodb存储类型和高效率的myisam存储类型;<br>Transactional Database Only只用于事务处理类型,最好的优化innodb,但同时也支持myisam;<br>Non-Transactional Databse Only非事务处理类型,适合于简单的应用,只有不支持事务的myisam类型是被支持的。<br>一般选择第一种多功能的,同样我们也是。-“next”</p> <p>选择InnodDB的数据存放位置,一般默认就行,为了统一我填写了“WAMP/MySQL Datafiles”-“next”</p> <p>选择mysql允许的最大连接数,第一种是最大20个连接并发数,第二种是最大500个并发连接数,最后一种是自定义,自己可以根据需求选择,我选择第二个-“next”</p> <p>下面是选择数据库监听的端口,一般默认是3306,如果改成其他端口,以后连接数据库的时候都要记住修改的端口,否则不能连接mysql数据库,比较麻烦,这里不做修改,用mysq的默认端口:3306-“next”</p> <p>这一步设置mysql的默认编码,我们选择第三个,并在Character Set菜单中,选择“gbk”编码-“next”<br>(注:如果要用原来数据库的数据,最好能确定原来数据库用的是什么编码,如果这里设置的编码和原来数据库数据的编码不一致,在使用的时候可能会出现乱码。)</p> <p>这一步是是否要把mysql设置成windows的,一般选择设成服务,这样以后就可以通过服务中启动和关闭mysql数据库。下面的复选框也勾选上,这样,在cmd模式下,不必非到mysql的bin目录下执行命令。也就是把上下2个勾都打上,中间默认-“next”</p> <p>这一步是设置mysql的超级用户密码,这个超级用户非常重要,对mysql拥有全部的权限,请设置好并牢记超级用户的密码,下面有个复选框是选择是否允许远程机器用root用户连接到你的mysql服务器上面,如果有这个需求,也请勾选。这里我们使用默认选择,在New root password和Confirm中输入密码。“next”</p> <p>点击“execute”进行配置,稍微等待一会,圆点上的勾全部打上,就代表配置完毕。</p> <p>2.修改配置:<br>打开D:\WAMP\MySQL\my.ini<br>设置datadir为D:/WAMP/MySQL/data/或你所要存放数据位置的目录即可。</p> <p><strong>三、PHP安装<br></strong>版本解释:VC9 专门为IIS定值的脚本,使用Visual Studio 2008编译器编译,支持最新的微软组建,从而提高效率。<br>     VC6 是为了其他WEB服务软件提供的脚本 如 Apache。<br>     Thread Safe 现成安全,之星时会进行线程 安全检查,以防止有心要求就启动新线程(Thread)的CGI执行方式而耗尽系统资源。<br>     Non Thread Safe是非线程安全,在执行时不进行线程(Thread)安全检查<br>选择版本:PHP5.3(5.3.1)中VC6 x86 Thread Safe下&#160;ZIP下载<br>下载地址:<a href="http://windows.php.net/download/"><font color="#0179a5">http://windows.php.net/download/</font></a></p> <p>1.安装说明<br>由于我们下载的的是ZIP压缩包,只需要将文件解压到“D:\WAMP\PHP”目录下即可</p> <p>2.修改配置<br>将E:\WAMP\PHP\php.ini-development 文件修改成php.ini<br>打开php.ini</p> <p>; extension_dir = “ext”<br>修改成:extension_dir = “E:\WAMP\PHP\ext”</p> <p>将947行下,这些文件前面的“;”去除<br>extension=php_curl.dll<br>extension=php_gd2.dll<br>extension=php_mbstring.dll<br>extension=php_mysql.dll<br>extension=php_mysqli.dll<br>extension=php_pdo_mysql.dll<br>extension=php_xmlrpc.dll</p> <p>;date.timezone =<br>修改成(很多网站没提到这里要修改,默认为美国时间,如果不修改会报错):date.timezone = Asia/Shanghai</p> <p>3.测试<br>重启Apache(修改过配置文件 必须重启Apache才会生效)<br>新建个index.php 页面,代码中输入&lt;?php phpinfo();?&gt;,保存文件放到“D:\WMAP\www\”目录下<br>打开浏览器输入:<a href="http://localhost/index.php"><font color="#0179a5">http://localhost/index.php</font></a> 如果能正常显示,说明PHP配置完毕,可以查看该页面的PHP信息是否正确。<br>(注:&lt;?php phpinfo();?&gt;在改文件中输入函数可输出大量的有关<em>PHP</em>当前状态的信息,如<em>PHP</em>版本,服务器信息和环境等。)<br>(注:)</p> <p>接着我们测试下,是否能连接到Mysql<br>再新建个link.php,下代码中输入<br>&lt;?php<br>$link=mysql_connect(“127.0.0.1″,”root”,”Mysql安装时填写的密码”);<br>if(!$link) echo “Mysql数据库连接失败!”;<br>else echo “Mysql数据库连接成功!”;<br>mysql_close();<br>?&gt;<br>也保存文件放到“D:\WMAP\www\”目录下<br>打开浏览器输入:<a href="http://localhost/index.php"><font color="#0179a5">http://localhost/link.php</font></a>&#160;查看</p> <p><strong>四、PhpMyAdmin安装</strong><br>版本解释:phpMyAdmin-3.2.5<br>选择版本:phpMyAdmin-3.2.5-all-languages.zip<br>下载地址:<a href="http://www.phpmyadmin.net/home_page/downloads.php"><font color="#0179a5">http://www.phpmyadmin.net/home_page/downloads.php</font></a></p> <p>1.安装说明<br>解压到D:\WAMP\phpMyAdmin</p> <p>2.修改配置<br>打开D:\WAMP\phpMyAdmin\libraries\config.default.php</p> <p>$cfg['PmaAbsoluteUri'] = ”;<br>修改成(填写访问phpMyAdmin的绝对URL):$cfg['PmaAbsoluteUri'] = ‘http://localhost/PHPMyadmin/’;</p> <p>$cfg['Servers'][$i]['host'] = ‘localhost’;<br>修改成(填写服务器地址,通常默认,不需要修改):$cfg['Servers'][$i]['host'] = ‘localhost’;</p> <p>$cfg['Servers'][$i]['user'] = ‘root’;<br>修改成(填写Mysql用户名,这里我们默认):$cfg['Servers'][$i]['user'] = ‘root’;</p> <p>$cfg['Servers'][$i]['password'] = ”;<br>修改成(填写Mysql密码):$cfg['Servers'][$i]['password'] = ‘Mysql PWD;</p> <p>$cfg['Servers'][$i]['auth_type'] = ‘cookie’;<br>修改成(设置认证方法,安全因素考虑,填写成cookie):$cfg['Servers'][$i]['auth_type'] = ‘cookie’;</p> <p>$cfg['blowfish_secret'] = ”;<br>修改成(设置短语密码,如果上面设置成cookie,那这里不能留空,不然登陆会提示错误):$cfg['blowfish_secret'] = ‘cookie’;</p> <p>3.测试<br>打开浏览器输入:<a href="http://localhost/phpmyadmin/"><font color="#0179a5">http://localhost/phpmyadmin/</font></a>&#160;访问和登陆</p> <p><strong>五、结尾<br></strong>至此Windows7下的PHP环境搭建完毕,大家尽情的使用吧。</p>

Read more+

13

2019-04
PHP开发应用程序:生成随机字符串的方法

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">PHP生成随机密码的三种方法.</font> </td> </tr></tbody></table> <p>使用<strong>PHP</strong>开发应用程序,尤其是网站程序,常常需要<strong>生成随机密码</strong>,如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码。随机密码也就是一串固定长度的字符串,这里我收集整理了几种生成随机字符串的方法,以供大家参考。</p> <p><strong>方法一</strong>:</p> <p>1、在 33 &#8211; 126 中生成一个随机整数,如 35,</p> <p>2、将 35 转换成对应的ASCII码字符,如 35 对应 #</p> <p>3、重复以上 1、2 步骤 n 次,连接成 n 位的密码</p> <p>该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min &#8211; $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 &#8211; 122 位对应 a &#8211; z 的英文字母,具体可参考 ASCII码表; chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。</p> <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <p>function create_password($pw_length = 8)<br>{<br>&#160;&#160;&#160; $randpwd = '';<br>&#160;&#160;&#160; for ($i = 0; $i &lt; $pw_length; $i++) <br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $randpwd .= chr(mt_rand(33, 126));<br>&#160;&#160;&#160; }<br>&#160;&#160;&#160; return $randpwd;<br>}</p> <p>// 调用该函数,传递长度参数$pw_length = 6<br>echo create_password(6);</p> </td> </tr></tbody></table> <p><strong>方法二</strong>:</p> <p>1、预置一个的字符串 $chars ,包括 a &#8211; z,A &#8211; Z,0 &#8211; 9,以及一些特殊字符</p> <p>2、在 $chars 字符串中随机取一个字符</p> <p>3、重复第二步 n 次,可得长度为 n 的密码</p> <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <p>function generate_password( $length = 8 ) {<br>&#160;&#160;&#160; // 密码字符集,可任意添加你需要的字符<br>&#160;&#160;&#160; $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&amp;*()-_ []{}&lt;&gt;~`+=,.;:/?|';</p> <p>&#160;&#160;&#160; $password = '';<br>&#160;&#160;&#160; for ( $i = 0; $i &lt; $length; $i++ ) <br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 这里提供两种字符获取方式<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 第一种是使用 substr 截取$chars中的任意一位字符;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 第二种是取字符数组 $chars 的任意元素<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];<br>&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; return $password;<br>}</p> </td> </tr></tbody></table> <p>function generate_password( $length = 8 ) {<br>&#160;&#160;&#160; // 密码字符集,可任意添加你需要的字符<br>&#160;&#160;&#160; $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&amp;*()-_ []{}&lt;&gt;~`+=,.;:/?|';</p> <p>&#160;&#160;&#160; $password = '';<br>&#160;&#160;&#160; for ( $i = 0; $i &lt; $length; $i++ ) <br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 这里提供两种字符获取方式<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 第一种是使用 substr 截取$chars中的任意一位字符;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 第二种是取字符数组 $chars 的任意元素<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];<br>&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; return $password;<br>}</p> <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <p>function make_password( $length = 8 )<br>{<br>&#160;&#160;&#160; // 密码字符集,可任意添加你需要的字符<br>&#160;&#160;&#160; $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', <br>&#160;&#160;&#160; 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', <br>&#160;&#160;&#160; 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', <br>&#160;&#160;&#160; 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', <br>&#160;&#160;&#160; 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', <br>&#160;&#160;&#160; '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', <br>&#160;&#160;&#160; '@','#', '$', '%', '^', '&amp;', '*', '(', ')', '-', '_', <br>&#160;&#160;&#160; '[', ']', '{', '}', '&lt;', '&gt;', '~', '`', '+', '=', ',', <br>&#160;&#160;&#160; '.', ';', ':', '/', '?', '|');</p> <p>&#160;&#160;&#160; // 在 $chars 中随机取 $length 个数组元素键名<br>&#160;&#160;&#160; $keys = ($chars, $length); </p> <p>&#160;&#160;&#160; $password = '';<br>&#160;&#160;&#160; for($i = 0; $i &lt; $length; $i++)<br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 将 $length 个数组元素连接成字符串<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $password .= $chars[$keys[$i]];<br>&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; return $password;<br>}</p> </td> </tr></tbody></table> <p><strong>时间效率对比</strong></p> <p>我们使用以下PHP代码,计算上面的 3 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。</p> <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <p>&lt;?php<br>function getmicrotime()<br>{<br>&#160;&#160;&#160; list($usec, $sec) = explode(" ",microtime());<br>&#160;&#160;&#160; return ((float)$usec + (float)$sec);<br>}<br>&#160;<br>// 记录开始时间<br>$time_start = getmicrotime();<br>&#160;&#160;&#160; <br>// 这里放要执行的PHP代码,如:<br>// echo create_password(6);<br>&#160;<br>// 记录结束时间<br>$time_end = getmicrotime();<br>$time = $time_end - $time_start;</p> <p>&#160;// 输出运行总时间 <br>echo "执行时间 $time seconds";<br>?&gt;</p> </td> </tr></tbody></table> <p><strong>最终得出的结果是</strong>:</p> <p>方法一:9.8943710327148E-5 秒</p> <p>方法二:9.6797943115234E-5 秒</p> <p>方法三:0.00017499923706055 秒</p> <p>可以看出方法一和方法二的执行时间都差不多,而方法三的运行时间稍微长了点。</p> <p>原文:http://www.ludou.org/how-to-create-a-password-generator-using-php.html</p>

Read more+

13

2019-04
phpwind商家导航上线测试

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">站长之家(chinaz.com)9月21日消息:昨晚,phpwind商家导航体验站上线测试。据了解,phpwind推商家导航主要为了解决本地社区网站的服务商家推广问题。如驾校培训、家居装修、教育、美容等。phpwind商家导航提供捆绑式营销方案,以及灵活的功能配置,可以满足不同的商家</font> </td> </tr></tbody></table> <p>  站长之家(chinaz.com)9月21日消息:昨晚,phpwind商家导航体验站上线测试。据了解,phpwind推商家导航主要为了解决本地社区网站的服务商家推广问题。如驾校培训、家居装修、教育、美容等。phpwind商家导航提供捆绑式营销方案,以及灵活的功能配置,可以满足不同的商家需求。</p> <p>   </p> <center><img alt="" src="http://www.webjx.com/files/allimg/100923/1803130.jpg" width="510" height="478"></center> <p>&#160;</p> <p>  (商家导航站首页截图)</p> <p>   </p> <center><img alt="" src="http://www.webjx.com/files/allimg/100923/1803131.jpg" width="510" height="442"></center> <p>&#160;</p> <p>  (商家分类页面截图)</p> <p>   </p> <center><img alt="" src="http://www.webjx.com/files/allimg/100923/1803132.jpg" width="510" height="311"></center> <p>&#160;</p> <p>  (商家宣传页面截图)</p> <p>  此外,phpwind商家导航可实现的不仅仅是对商品、店铺的简单展示,她还有融合社区元素的交互功能,可满足不同的商家需求。内置店铺组管理、门户化等诸多功能,可大幅度降低本地社区网站运营成本。</p> <p>  phpwind商家导航站的五个亮点:</p> <p>  亮点一:站长可以对不同等级店铺设置对应权限,店铺出售价格也可以高低不同,满足市场不同需求口味!</p> <p>  亮点二:站内搜索绑定店铺广告位,增加站长盈利点。</p> <p>  亮点三:商家店铺集成了web IM(QQ、旺旺),让社区用户和商家交流更便捷!</p> <p>  亮点四:商家导航门户页,可以自定义显示商品或者店铺,给商家提供更多的推广渠道,给站长带来更多的收益!</p> <p>  亮点五:微支付减少商家推广成本。可以通过论坛积分直接购买置顶、加红等推广列表页推广位置,前台简单操作给站长和商家带来双赢!</p> <p>  商家导航演示地址:http://tiyan.phpwind.net/fc/index.php?m=dianpu</p>

Read more+

13

2019-04
PHP实例:国际标准书号ISBN码校验函数

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">PHP校验ISBN码的函数.</font> </td> </tr></tbody></table> <p>最近在编写一个图书管理程序的时候,需要校验图书ISBN码正确性,查了一些资料,了解了图书ISBN码的构成,详细资料可以参考:国际标准书号 &#8211; 维基百科,下面还是简述一下什么是ISBN码:</p> <p>国际标准书号(International Standard Book Number,ISBN;拟发音is-ben),是国际通用的图书或独立的出版物(除定期出版的期刊)代码。出版社可以通过国际标准书号清晰的辨认所有非期刊书籍。一个国际标准书号只有一个或一份相应的出版物与之对应。新版本如果在原来旧版的基础上没有内容上太大的变动,在出版时也不会得到新的国际标准书号码。当平装本改为精装本出版时,原来相应的国际标准书号号码也应当收回。</p> <p>平常我们能够见到的ISBN码有10位和13位两种,其中10位的ISBN自2007年1月起已经停止使用,目前新出版的图书ISBN码都是13位。考虑到一个严谨的图书管理程序要考虑到多方面的问题,因为10位ISBN码的图书还是有巨大的存世量的,所以要校验图书ISBN码的正确性,就必须同时考虑10位和13位的情况。从维基百科可以了解到ISBN码最后一位是校验码,其实要想校验ISBN码的正确,就是通过计算ISBN的校验码,看是否与最后一位吻合。这里所说的校验也只是校验ISBN在构成上是否合法,而不会校验是否为已发行图书的ISBN。下面是维基百科提供的ISBN码校验算法:</p> <p>校验码的计算方法(10码)</p> <p>假设某国际标准书号号码前9位是:7-309-04547 </p> <p>计算加权和S:S = 7×10+3×9+0×8+9×7+0×6+4×5+5×4+4×3+7×2 = 226 </p> <p>计算S÷11的余数M:M = 226 mod 11 = 6 </p> <p>计算11 &#8211; M 的差N:N = 11 ? 6 = 5 </p> <p>如果N = 10,校验码是字母"X" </p> <p>如果N = 11,校验码是数字"0" </p> <p>如果N为其他数字,校验码是数字N </p> <p>所以,本书的校验码是5;如果用户提供的ISBN码是7-309-04547-6,那么校验失败</p> <p>校验码的计算方法(13码)</p> <p>假设某国际标准书号号码前12位是:978-986-181-728 </p> <p>计算加权和S:S = (9×1)+(7×3)+(8×1)+(9×3)+(8×1)+(6×3)+(1×1)+(8×3)+(1×1)+(7×3)+(2×1)+(8×3) = 164 </p> <p>计算S÷10的余数M:M = 164 mod 10 = 4 </p> <p>计算10 &#8211; M 的差N:N = 10 ? 4 = 6 </p> <p>如果N = 10,校验码是数字"0" </p> <p>如果N为其他数字,校验码是数字N </p> <p>所以,本书的校验码是6。完整的国际标准书号号码为 ISBN 978-986-181-728-6</p> <p>好了,背景知识介绍到这,下面我写的ISBN码校验函数(php版),需要的话可以直接使用:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p>function isbn_sum($isbn, $len)<br>{<br>/* <br>&#160;* 该函数用于计算ISBN加权和 <br>&#160;* 参数说明:<br>&#160;*&#160;&#160; $isbn : isbn码<br>&#160;*&#160;&#160; $len&#160; : isbn码长度<br>&#160;*/<br>&#160;&#160;&#160; $sum = 0;<br>&#160;&#160;&#160; if ($len == 10)<br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for ($i = 0; $i &lt; $len-1; $i++)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $sum = $sum + (int)$isbn[$i] * ($len - $i);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160; }<br>&#160;&#160;&#160; elseif ($len == 13)<br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for ($i = 0; $i &lt; $len-1; $i++)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($i % 2 == 0)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $sum = $sum + (int)$isbn[$i];<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $sum = $sum + (int)$isbn[$i] * 3;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160; }<br>&#160;&#160;&#160; return $sum;<br>}<br>function isbn_compute($isbn, $len)<br>{<br>/* <br>* 该函数用于计算ISBN末位校验码<br>* 参数说明:<br>*&#160;&#160; $isbn : isbn码<br>*&#160;&#160; $len&#160; : isbn码长度<br>*/<br>&#160;&#160;&#160; if ($len == 10)<br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $digit = 11 - isbn_sum($isbn, $len) % 11;</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($digit == 10)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $rc = 'X';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; else if ($digit == 11)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $rc = '0';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; else<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $rc = (string)$digit;<br>&#160;&#160;&#160; }<br>&#160;&#160;&#160; else if($len == 13)<br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $digit = 10 - isbn_sum($isbn, $len) % 10;</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($digit == 10)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $rc = '0';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; else<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $rc = (string)$digit;<br>&#160;&#160;&#160; }<br>&#160;&#160;&#160; return $rc;<br>}<br>function is_isbn($isbn)<br>{<br>/* <br>&#160;* 该函数用于判断是否为ISBN号 <br>&#160;* 参数说明:<br>&#160;*&#160;&#160;&#160; $isbn : isbn码<br>&#160;*/<br>&#160;&#160;&#160; $len = strlen($isbn);<br>&#160;&#160;&#160; if ($len!=10 &amp;&amp; $len!=13)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0;<br>&#160;&#160;&#160; $rc = isbn_compute($isbn, $len);<br>&#160;&#160;&#160; if ($isbn[$len-1] != $rc)&#160;&#160; /* ISBN尾数与计算出来的校验码不符 */<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0;<br>&#160;&#160;&#160; else<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 1;<br>}</p> </td> </tr></tbody></table> <p>函数写好后,就可以直接调用了,下面是调用示例:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb">&lt;?php echo is_isbn('9787507421781') ? '校验通过' : '校验失败'; ?&gt;</td> </tr></tbody></table> <p>原文:<font color="#000000">http://www.ludou.org/php-check-isbn.html</font></p>

Read more+

13

2019-04
PHP驱动MongoDB整数问题的BUG和策略

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">PHP驱动MongoDB整数问题的BUG和策略.</font> </td> </tr></tbody></table> <p>本文所说的<a href="http://jira.mongodb.org/browse/PHP-138" target="_blank"><font color="#0000ff">整数问题</font></a>,其实并不是MongoDB的问题,而是PHP驱动的问题:MongoDB本身有两种整数类型,分别是:32位整数和64位整数,但旧版的PHP驱动不管操作系统是32位还是64位,把所有整数都当做32位整数处理,结果导致64位整数被截断。为了在尽可能保持兼容性的前提下解决这个问题,新版PHP驱动加入了<a href="http://www.php.net/manual/en/mongo.configuration.php#ini.mongo.native-long" target="_blank"><font color="#0000ff">mongo.native-long</font></a>选项,以期在64位操作系统中把整数都当做64位来处理,有兴趣的可参考:<a href="http://derickrethans.nl/64bit-ints-in-mongodb.html" target="_blank"><font color="#0000ff">64-bit integers in MongoDB</font></a>。</p> <p>那么PHP驱动真的完全解决了整数问题么?NO!在处理group操作的时候还有<a href="http://jira.mongodb.org/browse/PHP-163" target="_blank"><font color="#0000ff">BUG</font></a>:</p> <p>为了说明问题,我们先来生成一些测试数据:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font face="NSimsun">&lt;?php<br><br>ini_set('mongo.native_long', 1);<br><br>$instance = new Mongo();<br><br>$instance = $instance-&gt;selectCollection('test', 'test');<br><br>for ($i = 0; $i &lt; 10; $i++) {<br>&#160;&#160;&#160; $instance-&gt;insert(array(<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 'group_id' =&gt; rand(1, 5),<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 'count'&#160;&#160;&#160; =&gt; rand(1, 5),<br>&#160;&#160;&#160; ));<br>}<br><br>?&gt;</font></code></p> </td> </tr></tbody></table> <p>下面让我们使用group操作,根据group_id分组,汇总计算count:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font size="2" face="新宋体">&lt;?php<br><br>ini_set('mongo.native_long', 1);<br><br>$instance = new Mongo();<br><br>$instance = $instance-&gt;selectCollection('test', 'test');<br><br>$keys = array('group_id' =&gt; 1);<br><br>$initial = array('count' =&gt; 0);<br><br>$reduce = '<br>&#160;&#160;&#160; function(obj, prev) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; prev.count += obj.count;<br>&#160;&#160;&#160; }<br>';<br><br>$result = $instance-&gt;group($keys, $initial, $reduce);<br><br>var_dump($result);<br><br>?&gt;</font></code></p> </td> </tr></tbody></table> <p>结果和预想的有出入,count没有实现累加,而是变成了[object Object],目前,如果必须使用group操作,那么有两种方法可以缓解这个问题:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font size="2" face="新宋体">ini_set('mongo.native_long', 0);</font></code></p> </td> </tr></tbody></table> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font size="2" face="新宋体">$initial = array('count' =&gt; (float)0);</font></code></p> </td> </tr></tbody></table> <p>这两种方法都是治标不治本的权宜之计,既然当前PHP驱动里group的实现有问题,那我们就绕开它,用其它的方式实现同样的功能,这个方式就是<a href="http://www.mongodb.org/display/DOCS/MapReduce" target="_blank"><font color="#0000ff">MapReduce</font></a>:</p> <p> </p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <p><code><font size="2" face="新宋体">&lt;?php<br><br>ini_set('mongo.native_long', 1);<br><br>$instance = new Mongo();<br><br>$instance = $instance-&gt;selectDB('test');<br><br>$map = '<br>&#160;&#160;&#160; function() {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; emit(this.group_id, this.count);<br>&#160;&#160;&#160; }<br>';<br><br>$reduce = '<br>&#160;&#160;&#160; function(key, values) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sum = 0;<br><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (var index in values) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sum += values[index];<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return sum;<br>&#160;&#160;&#160; }<br>';<br><br>$result = $instance-&gt;command(array(<br>&#160;&#160;&#160; 'mapreduce' =&gt; 'test',<br>&#160;&#160;&#160; 'map'&#160;&#160;&#160;&#160;&#160;&#160; =&gt; $map,<br>&#160;&#160;&#160; 'reduce'&#160;&#160;&#160; =&gt; $reduce<br>));<br><br>$result = iterator_to_array($instance-&gt;{$result['result']}-&gt;find());<br><br>var_dump($result);<br><br>?&gt;</font></code></p> </td> </tr></tbody></table> <p>把大象放冰箱里需要三步,而使用MapReduce仅仅需要Map和Reduce两步即可,这里有一个PDF文档生动的说明了MySQL中GROUP BY和MongoDB中MapReduce的对应关系:</p> <p align="center"><a href="http://www.chinaz.com/upimg/userup/1103/1409294BM3.jpg" target="_blank"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110324/1019180.jpg" width="570" height="441"></a>&#160;</p> <p align="center"><a href="http://rickosborne.org/blog/2010/02/infographic-migrating-from-sql-to-mapreduce-with-mongodb/" target="_blank"><font color="#0000ff">SQL to MongoDB</font></a></p> <p>此外,还有很多资料可供参考,如:<a href="http://kylebanker.com/blog/2009/12/mongodb-map-reduce-basics/" target="_blank"><font color="#0000ff">MongoDB Aggregation III: Map-Reduce Basics</font></a>。</p> <p>说明:软件版本为MongoDB(1.6.5),PECL Mongo(1.1.4)。不同版本结论可能不同。</p>

Read more+

13

2019-04
PHP技巧教程:PHP网站开发常用8个小技巧

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">本文总结了PHP日常开发中常用的8个小技巧。</font> </td> </tr></tbody></table> <p>本文总结了PHP日常开发中常用的8个小技巧。</p> <p>PHP批最取得checkbox的值<br><br>1、命名<br><br>&lt;input type='checkbox' name='checkbox[]' value=dwmyrow[banzhu] /&gt;<br><br>2、使用<br><br>当计划当作sql指令的一部分时:如果参与控制的字段是数值型的,则<br><br>if(! empty(_POST['checkbox'])) {<br>expr = join(",", _POST['checkbox']);<br>sql = "select * from tbl_name where field in (expr)";<br>}<br><br>如果参与控制的字段是数值型的,则<br><br>if(! empty(_POST['checkbox'])) {<br>expr = "'".join("','", _POST['checkbox']).".";<br>sql = "select * from tbl_name where field in (expr)";<br>}<br><br>PHP判断Form表单是否提交<br><br>action=HTTP_POST_VARS["Button1"];<br>if(action=="提交")<br>{<br>//执行表单操作<br>}<br>else<br>{<br>//读取默认值<br>}<br><br>PHP 获取字符串长度<br><br>strlen(myrow[1])<br><br>PHP Url转向<br><br>Header("Location: "._SERVER["HTTP_REFERER"]);<br><br>PHP超全局对象<br><br>&lt;?php<br>a = 1;<br>b = 2;<br>function Sum()<br>{<br>GLOBALS["b"] = GLOBALS["a"] + GLOBALS["b"];<br>}<br>Sum();<br>echo b;<br>?&gt;<br><br>PHP 表单取值<br><br>如果 mothod="get" 就用 _GET["test"] 代替test <br>如果 mothod="post" 就用 _POST["test"] 代替test<br><br>PHP取得当前IP<br><br>&lt;?=HTTP_SERVER_VARS["REMOTE_ADDR"]?&gt;<br><br>PHP 取得当前时间<br><br>&lt;?php<br>echo date("Y-m-d G:i:s");<br>?&gt;<br>date("Y年m月d日")<br>Date ("Y-n-j")</p>

Read more+

13

2019-04
PHP代码源有可能被污染 建议下载要小心

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">PHP官方称PHP代码源被污染 用户下载需谨慎.</font> </td> </tr></tbody></table> <p align="center"><img style="WIDTH: 511px; HEIGHT: 298px" border="0" alt="" src="http://www.webjx.com/files/allimg/110327/1141490.jpg" width="510" height="417"></p> <p align="center">PHP官方网站(<a href="http://www.php.net/" target="_blank"><font color="#000000">http://www.php.net/</font></a>)</p> <p>3月25日消息:据PHP官方网站发布新闻得知其wiki账号被盗,原因是wiki.php.net漏洞导致的,而wiki的账号和php代码源的SVN提交权限相关联,从而导致PHP代码受污染。</p> <p>据了解,PHP5.3.6以及其后续版本的代码已经被污染,目前只能把未受污染的代码版本确保到PHP5.3.5,下载PHP代码的用户,需谨慎。</p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <strong><font color="#ff0000">原文内容:</font><br></strong>The wiki.php.net box was compromised and the attackers were able to collect wiki account credentials. No other machines in the php.net infrastructure appear to have been affected. Our biggest concern is, of course, the integrity of our source code. We did an extensive code audit and looked at every commit since 5.3.5 to make sure that no stolen accounts were used to inject anything malicious. Nothing was found. The compromised machine has been wiped and we are forcing a password change for all svn accounts. <p>We are still investigating the details of the attack which combined a vulnerability in the Wiki software with a Linux root exploit.</p> </td> </tr></tbody></table> <p><strong>内容大致是:</strong></p> <p>由于wiki账号被盗,PHP的代码源极有可能被污染,当然,PHP团队已经做最大的努力以保证自PHP5.3.5版本的代码没有收到污染,并且强迫SVN修改现有的密码。</p> <p>而事件目前的状态是,他们仍然没法锁定漏洞所在,因为他们仍在排查。</p> <p>一个很明显的问题是,PHP5.3.6以及其后续版本的代码已经被污染,目前只能把未受污染的代码版本确保到PHP5.3.5,下载PHP代码的人,要小心了。</p> <p>而windows.php.net和wiki.php.net也已经暂停访问。</p>

Read more+

13

2019-04
PHP教程:PHP处理数组模式的以选未选input多选框

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">一般从数据循环出来的选框要处理是否被选中都是使用IF去判断,结果造成代码一堆,速度过慢。</font> </td> </tr></tbody></table> 一般从数据循环出来的选框要处理是否被选中都是使用IF去判断,结果造成代码一堆,速度过慢。<br><br>我做了一个闭包分享给大家,希望对大家有用。<br><br>代码: <div class="blockcode"> <div id="code1558_-1"> <ol> <li>function ifNumExists($numList,$key) {<br> </li> <li>$return = false;<br> </li> <li>$arraylist = split(",", $numList);<br> </li> <li>$Length = count($arraylist)-1; //最后一个数组结果为空,所以应当减去。<br> </li> <li>&#160; &#160; &#160; &#160; for ($i=0;$i&lt;$Length;$i++){<br> </li> <li>&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; if ($arraylist[$i] == $key) {<br> </li> <li>&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; $return = true;<br> </li> <li>&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }<br> </li> <li>&#160; &#160; &#160; &#160; }<br> </li> <li>&#160; &#160; &#160; &#160; return $return;<br> </li> <li>}<br> </li> </ol> </div> <br> </div> 使用方法: <div class="blockcode"> <div id="code1558_0"> <ol> <li>ifNumExists(数组,当前单选框对应ID)<br> </li> </ol> </div> <br> </div> <strong>表结构:</strong><br>单选框循环表(A):<br>id   class<br>1   类别1<br>2   类别2<br>3   类别3<br>4   类别4<br><br>单选值存放表(B):<br>id   classid<br>1   1,2,3,<br>2   2,3,4,<br>3   1,2,<br><br>当循环表A,判断是否当前input是否被选中,那么我们就可以使用<br>ifNumExists(classid,表Aid),返回的结果为true或者false,根据返回的结果我们给input增加或者不增加 checked="checked"。<br>如: <ol> <li>if (ifNumExists(classid,$value['id'])) {<br> </li> <li> $list = $list."&lt;input type=\"checkbox\" name=\"SendNums[]\" value=\"".$value['id']."\" checked=\"checked\" /&gt;".$value['class']."&lt;/li&gt;";<br> </li> <li>}else{<br> </li> <li> $list = $list."&lt;input type=\"checkbox\" name=\"SendNums[]\" value=\"".$value['id']."\" /&gt;".$value['class']."&lt;/li&gt;";<br> </li> <li>}<br> </li> <li>return $list; </li> </ol>

Read more+