PHP编程:高质量PHP代码的50个实用技巧必备(下)
《高质量PHP代码的50个实用技巧必备(下)》要点: 接着上篇《高质量PHP代码的50个实用技巧必备(上)》继续研究.PHP实例 26. 避免直接写SQL,抽象之 <span style="color:#333333;font-family:''Helvetica,Arial,sans-serif'';">$query = "INSERT INTO users(name,email,address,phone) VALUES('$name','$email','$address','$phone')"; $db->query($query); //call to mysqli_query()</span> 这不是个建壮的方案. 它有些缺点:
因此使用函数封装: <span style="color:#333333;font-family:''Helvetica,sans-serif'';">function insert_record($table_name,$data) { foreach($data as $key => $value) { //mysqli_real_escape_string $data[$key] = $db->mres($value); } $fields = implode(',',array_keys($data)); $values = "'" . implode("','",array_values($data)) . "'"; //Final query $query = "INSERT INTO {$table}($fields) VALUES($values)"; return $db->query($query); } $data = array('name' => $name,'email' => $email,'address' => $address,'phone' => $phone); insert_record('users',$data);</span> 看到了吗? 这样会更易读和扩展. record_data 函数小心的处理了转义.最大的优点是数据被预处理为一个数组,任何语法错误都会被捕获.该函数应该定义在某个database类中,你可以像 $db->insert_record这样调用.查看本文,看看怎样让你处理数据库更容易.类似的也可以编写update,select,delete办法. 试试吧.PHP实例 27. ⑹菘馍傻哪谌莼捍娴骄蔡募 28. 在数据库中保存session 29. 避免使用全局变量
30. 在head中使用base标签 <head> <base href="http://www.domain.com/store/"> </head> <body> <img src="happy.jpg" /> </body> </html> base 标签非常有用. 假设你的应用分成几个子目录,它们都要包含相同的导航菜单.PHP实例
在首页中,可以写:PHP实例 <a href="home.php">Home</a> <a href="products/ipad.php">Ipad</a> 但在你的ipad.php不得不写成:PHP实例 <span style="color:#333333;font-family:''Helvetica,sans-serif'';"><a href="../home.php">Home</a> <a href="ipad.php">Ipad</a></span> 因为目录不一样. 有这么多不同版本的导航菜单要维护,很糟糕啊.因此,请使用base标签. <span style="color:#333333;font-family:''Helvetica,sans-serif'';"><head> <base href="http://www.domain.com/store/"> </head> <body> <a href="home.php">Home</a> <a href="products/ipad.php">Ipad</a> </body> </html></span> 现在,这段代码放在应用的各个目录文件中行为都一致.PHP实例 31. 永远不要 error_reporting 设为 0 <span style="color:#333333;font-family:'Helvetica,sans-serif';">ini_set('display_errors',1); error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);</span> 32. 注意平台体系结构 <span style="color:#333333;font-family:''Helvetica,sans-serif'';">$ php -a Interactive shell php > echo strtotime("0000-00-00 00:00:00"); -62170005200 php > echo strtotime('1000-01-30'); -30607739600 php > echo strtotime('2100-01-30'); 4104930600</span> 但在32位机器中,它们⑹bool(false). 查看这里,了解更多.PHP实例 33. 不要过分依赖 set_time_limit <span style="color:#333333;font-family:''Helvetica,sans-serif'';">set_time_limit(30); //Rest of the code</span> 安枕无忧吗? 注意任何外部的执行,如系统调用,socket操作,数据库操作等,就不在set_time_limits的控制之下. 34. 使用扩展库
使用开源库完成复杂任务,如生成pdf,ms-excel文件,报表等.PHP实例 35. 使用MVC框架
36. 时常看看 phpbench 37. 如何正确的创建一个网站的Index页面 38. 使用Request Global Array抓取数据 $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 0; 39. 利用var_dump进行PHP代码调试 40. PHP处理代码逻辑,Smarty处理展现层 41. 的确需要使用全局数值时,创建一个Config文件 42. 如果未定义,禁止拜访! define('yourPage',1); 然后,其它页面应该包括:PHP实例 if (!defined('yourPage')) die('Access Denied'); 这么做的目的是防止直接拜访你的其它php页面.这样,任何试图不通过index.php拜访其它网页的人,将得到“拜访被拒绝”的消息.PHP实例 43. 创建一个数据库类 public function dbExec($query) { $result = $this->db->exec($query); if (PEAR::isError($result)) errorRedirect($result->getMessage(),true); else return $result; } 这个函数仅接收一个查询语句并对其执行.它还处理可能出现的任何错误.你还可以在这儿包括审核代码,不过我更喜欢使用一个类似的审核函数: // checks if arguments given are integer values not less than 0 - has multiple arguments function sanitizeInput() { $numargs = func_num_args(); $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) { if (!is_numeric($arg_list[$i]) || $arg_list[$i] < 0) errorRedirect("Unexpected variable value",true); } } 44. 一个php文件处理输入,一个class.php文件处理具体功能 require_once PROJECTROOT.'libs/messages.class.php'; $message = new Message(); switch ($action) { case 'display': $message->display(); break; ... 如上所示,我使用了一个消息类,然后开始进行switch检查.$message只是被类中的调用函数使用的一个对象.PHP实例 45. 了解你的SQL语句,并总是对其审查(Sanitize) private function getSentMessages($id) { $this->util->sanitizeInput($id); $pm_table = $GLOBALS['config']['privateMsg']; $users = $GLOBALS['config']['users']; $sql = "SELECT PM.*,USR.username as name_sender FROM $pm_table PM,$users USR WHERE id_sender = '$id' AND sender_purge = FALSE AND USR.id = PM.id_receiver AND is_read = TRUE ORDER BY date_sent DESC"; $result = $this->dbQueryAll($sql); return $result; } 首先,我们对用户输入进行检查(通过一个GET变量传递消息id),然后我们执行我们的SQL命令.注意这儿SQL的用法.你需要了解如何使用别名和关联表.PHP实例 46. 当你只需要一个对象时,使用单例模式 function smartyObject() { if ($GLOBALS['config']['SmartyObj'] == 0) { $smarty = new SmartyGame(); $GLOBALS['config']['SmartyObj'] = $smarty; } else $smarty = $GLOBALS['config']['SmartyObj']; return $smarty; } 注意,我们拥有一个全局smarty变量(该示例中它在config.php中被初始化),如果它的值为0,我们将创建一个新smarty对象.否则,它意味着该对象已经被创建,我们只需要返回它.PHP实例 47. 关于PHP重定向 48. 获取拜访者浏览器 functionbrowse_infor() { $browser="";$browserver=""; $Browsers=array("Lynx","MOSAIC","AOL","Opera","JAVA","MacWeb","WebExplorer","OmniWeb"); $Agent=$GLOBALS["HTTP_USER_AGENT"]; for($i=0;$i<=7;$i++) { if(strpos($Agent,$Browsers[$i])) { $browser=$Browsers[$i]; $browserver=""; } } if(ereg("Mozilla",$Agent)&&!ereg("MSIE",$Agent)) { $temp=explode("(",$Agent);$Part=$temp[0]; $temp=explode("/",$Part);$browserver=$temp[1]; $temp=explode("",$browserver);$browserver=$temp[0]; $browserver=preg_replace("/([d.]+)/","1",$browserver); $browserver="$browserver"; $browser="NetscapeNavigator"; } if(ereg("Mozilla",$Agent)&&ereg("Opera",$Agent);$Part=$temp[1]; $temp=explode(")",$browserver);$browserver=$temp[2]; $browserver=preg_replace("/([d.]+)/",$browserver); $browserver="$browserver"; $browser="Opera"; } if(ereg("Mozilla",$Agent)&&ereg("MSIE",$Agent);$Part=$temp[1]; $temp=explode(";",$Part);$Part=$temp[1]; $temp=explode("",$Part);$browserver=$temp[2]; $browserver=preg_replace("/([d.]+)/",$browserver); $browserver="$browserver"; $browser="InternetExplorer"; } if($browser!="") { $browseinfo="$browser$browserver"; } else { $browseinfo="Unknown"; } return$browseinfo; } //调用方法$browser=browseinfo();直接返回结果 49.获取拜访者操作系统 functionosinfo(){ $os=""; $Agent=$GLOBALS["HTTP_USER_AGENT"]; if(eregi('win',$Agent)&&strpos($Agent,'95')){ $os="Windows95"; } elseif(eregi('win9x','4.90')){ $os="WindowsME"; } elseif(eregi('win',$Agent)&&ereg('98',$Agent)){ $os="Windows98"; } elseif(eregi('win',$Agent)&&eregi('nt5.0',$Agent)){ $os="Windows2000"; } elseif(eregi('win',$Agent)&&eregi('nt',$Agent)){ $os="WindowsNT"; } elseif(eregi('win',$Agent)&&eregi('nt5.1',$Agent)){ $os="WindowsXP"; } elseif(eregi('win',$Agent)&&ereg('32',$Agent)){ $os="Windows32"; } elseif(eregi('linux',$Agent)){ $os="Linux"; } elseif(eregi('unix',$Agent)){ $os="Unix"; } elseif(eregi('sun',$Agent)&&eregi('os',$Agent)){ $os="SunOS"; } elseif(eregi('ibm',$Agent)){ $os="IBMOS/2"; } elseif(eregi('Mac',$Agent)&&eregi('PC',$Agent)){ $os="Macintosh"; } elseif(eregi('PowerPC',$Agent)){ $os="PowerPC"; } elseif(eregi('AIX',$Agent)){ $os="AIX"; } elseif(eregi('HPUX',$Agent)){ $os="HPUX"; } elseif(eregi('NetBSD',$Agent)){ $os="NetBSD"; } elseif(eregi('BSD',$Agent)){ $os="BSD"; } elseif(ereg('OSF1',$Agent)){ $os="OSF1"; } elseif(ereg('IRIX',$Agent)){ $os="IRIX"; } elseif(eregi('FreeBSD',$Agent)){ $os="FreeBSD"; } if($os=='')$os="Unknown"; return$os; } //调用办法$os=os_infor(); 50. 文件格式类 $mime_types=array( 'gif'=>'image/gif','jpg'=>'image/jpeg','jpeg'=>'image/jpeg','jpe'=>'image/jpeg','bmp'=>'image/bmp','png'=>'image/png','tif'=>'image/tiff','tiff'=>'image/tiff','pict'=>'image/x-pict','pic'=>'image/x-pict','pct'=>'image/x-pict','psd'=>'image/x-photoshop','swf'=>'application/x-shockwave-flash','js'=>'application/x-javascript','pdf'=>'application/pdf','ps'=>'application/postscript','eps'=>'application/postscript','ai'=>'application/postscript','wmf'=>'application/x-msmetafile','css'=>'text/css','htm'=>'text/html','html'=>'text/html','txt'=>'text/plain','xml'=>'text/xml','wml'=>'text/wml','wbmp'=>'image/vnd.wap.wbmp','mid'=>'audio/midi','wav'=>'audio/wav','mp3'=>'audio/mpeg','mp2'=>'audio/mpeg','avi'=>'video/x-msvideo','mpeg'=>'video/mpeg','mpg'=>'video/mpeg','qt'=>'video/quicktime','mov'=>'video/quicktime','lha'=>'application/x-lha','lzh'=>'application/x-lha','z'=>'application/x-compress','gtar'=>'application/x-gtar','gz'=>'application/x-gzip','gzip'=>'application/x-gzip','tgz'=>'application/x-gzip','tar'=>'application/x-tar','bz2'=>'application/bzip2','zip'=>'application/zip','arj'=>'application/x-arj','rar'=>'application/x-rar-compressed','hqx'=>'application/mac-binhex40','sit'=>'application/x-stuffit','bin'=>'application/x-macbinary','uu'=>'text/x-uuencode','uue'=>'text/x-uuencode','latex'=>'application/x-latex','ltx'=>'application/x-latex','tcl'=>'application/x-tcl','pgp'=>'application/pgp','asc'=>'application/pgp','exe'=>'application/x-msdownload','doc'=>'application/msword','rtf'=>'application/rtf','xls'=>'application/vnd.ms-excel','ppt'=>'application/vnd.ms-powerpoint','mdb'=>'application/x-msaccess','wri'=>'application/x-mswrite',); 5、php生成excel文档 <? header("Content-type:application/vnd.ms-excel"); header("Content-Disposition:filename=test.xls"); echo"test1t"; echo"test2tn"; echo"test1t"; echo"test2tn"; echo"test1t"; echo"test2tn"; echo"test1t"; echo"test2tn"; echo"test1t"; echo"test2tn"; echo"test1t"; echo"test2tn"; ?> //改动相应文件头就可以输出.doc.xls等文件格式了 以上就是本文的全部内容,大家结合前一篇进行深入学习,必定会有所收获.PHP实例 《高质量PHP代码的50个实用技巧必备(下)》是否对您有启发,欢迎查看更多与《高质量PHP代码的50个实用技巧必备(下)》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |