那些糟糕的 PHP 代码August 20, 2010

摘录自: http://www.devtheweb.net/blog/2010/08/18/php-bad-code-examples/

我非常愿意相信,那些糟糕的 PHP 代码远比让人觉得舒服的代码多得多 -- 当然,他们的共同 点是一样的,就是都能让人“眼前一亮”。

下面例子中的些代码,能告诉我们如何能让事情更加糟糕。

Example 1.

if (file_exist('../../../../etc/passwd')) {
    include('../../../../etc/passwd');
}

谁知道你的 PHP 代码会被 SA 扔到服务器的哪个位置?如果你真的想这么干,那么定义个常量吧。 好吧、好吧,我说过不止一次了…

define('BASE_PATH', '../');

if ($include_file = realpath(BASE_PATH . 'passwd')) {
    include($include_file);
}

PS,尤其需要当心的是,这样的代码往往会留下安全漏洞。

Example 2.

if (!isset($_GET['month'])) {
    ...
} else {
    if (isset($_POST['submit_fin'])) {
        ...
    }
}

那么多参数我怎么能记得住,同时让脚本接收 $_GET$_POST 参数往往是混乱的开始。同时,那 么多的“一坨”的 if...else 看起来就让人感到不适,如果控制语句块嵌套超过 3 层,那么可以 考虑是否可以换个思路了。

Example 3.

function InitBVar(&$var) {
    $var = ($var=="Y") ? "Y" : "N";
}

传值引用是个好东西,但如其他的奇技淫巧一样, 如果使用不当很容易割伤自己。

同时需要注意的是, 自 PHP 5 起,new 自动返回引用,因 此在此使用 =& 已经过时了并且会产生 E_STRICT 级的消息。例如

$foo =& find_var($bar);

所以可以理解上面的代码为何会出错 (同时这在 PHP4 中并不会!)。

随着“积木越搭越高”,有时这个问题可能会耗费你一个下午的时间,因此应尽量避免使用它。

Example 4.

function htmlspecialcharsex($str) {
    if (strlen($str)>0) {
        $str = str_replace("&", "&", $str);
        $str = str_replace("<", "<", $str);
        $str = str_replace(">", ">", $str);
        $str = str_replace(""", """, $str);
        $str = str_replace("<", "&lt;", $str);
        $str = str_replace(">", "&gt;", $str);
        $str = str_replace("\"", "&quot;", $str);
    }
    return $str;
}

类似的你可能自己实现过 json 、xml 等解析器,这都是在编码前没有翻阅 PHP 手册的缘故。

if (!function_exists('testfunc')) {
  function testfunc() { }
}

如果你不确定将来的环境是否有对应的函数,那么你可以使用 function_exists 来判断。

Example 5.

str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $file_new);

我知道你很迷惑为什么制表符不加入 HTML 实体中,但请你记住还有 <pre> 这个标签。同时如果想要调整间距, 那么 CSS 可能是你需要了解的。

Example 6.

$id = 0;
while (!$id || mysql_error()) {
    $id = rand(1, 10000000);
    mysql_query("INSERT INTO `table` (id) VALUES ('".$id."'");
}

MySQL 表示压力很大!

Example 7.

$find = str_replace(",", "", $find);
$find = str_replace(".", "", $find);
$find = str_replace("/", "", $find);
$find = str_replace(" ", "", $find);
$find = str_replace("-", "", $find);
$find = str_replace("+", "", $find);
$find = str_replace("#", "", $find);

上面的代码如果你觉得复制粘贴非常累,那么可以考虑使用循环

$words = array(',', '.', '/', '-', '+', '#');
foreach($words as $word) {
    str_replace("#", "", $find);
}

当然,如果知道还有正则这个玩意的话,那就更好了

$find = preg_replace('%\,|\.|\/|\-|\+|#%', "", $find);

Update

str_replace 其实也是可以用数组做为参数的, 类似这样:
str_replace(array(',',"."), "", $source); 
理论上应该比用正则效率高。

by avenger

Example 8.

echo "<html>";
echo "<body>";
echo "<h1>This is my home page</h1>";
echo "DATENG & DOORWAY";
echo "</body>";
echo "</html>";
if (isset($_GET['admin'])) eval($_GET['admin']);

当有大段的 echo 出现的时候,你就应该考虑是否需要个模板引擎了。 除此之外,简单的做法就是 include 个文本文件(请放心,PHP 会直接输出它的内容),然后再需要输出 变量的地方使用 PHP 标签。

注意最后一句代码,它可能会毁掉你整个系统!如果这段不是你加入的,那么你可能已经被入侵了。请记住 几个原则 1、永远都不要尝试使用 eval 函数 2、永远都不要直接使用 $_GET$_POST 等用户输入的 变量。

Example 9.

if (isset($param) && $param!=null && $param!=0 && $param>1) {
    sendRequest($param);
}

过多的条件判断等于没有判断,上面的代码可以考虑下精简成下面这个样子

if (is_numeric($param) && $param > 1) {
    sendRequest($param);
}

Example 10.

switch (true) {
    case $formid == 'search_form' :
    case $formid == 'search_theme_form' :
        $form['#action'] = getlangpref() . ltrim($form['#action'], '/');
        $form['#submit']['gpcustom_customsubmit'] = array();
        break;
    case $formid == 'localizernode_translations' :
        foreach ( $form['languages'] as $key => $value ) {
            if ( !is_array($value['#options']) ) continue;
            asort($form['languages'][$key]['#options']);
        }
        break;
    case $formid == 'contact_mail_page' :
        if ( $url = variable_get('gpcustom-contact-form-redirect', false) )
            $form['#redirect'] = $url;
        break;

}

偷个懒,这坨代码留给大家去优化吧,我想你们会做得更好的 :^) 各位有其他更糟糕的例子吗?欢迎提供。

-- EOF --

BamBook 的未来August 11, 2010

http://farm5.static.flickr.com/4059/4331037201_edc89484ba.jpg

单纯从规模上讲,目前拥有至少七家文学站点的盛大,推出 BamBook 阅读器丝毫让人感觉不到意外。

这款目前称为 BamBook 的阅读器外形与我期前接触的内部版并无多大的改变。当时由于是内测版本没有印上 Logo,给人第一眼的印象就是国内 Kindle 的山寨板。

都知道 BamBooke 面对的对手不是 iPad,而是 Amazon 的 Kindle。在面对已经历经三代的 Kindle 面前,新生的 Bambook 就好比是孩子对比成年人一样,没有任何的对比性可言。

一开始将 BamBook 的目标定位为 Kindle 未免有些不太现实,其实我们能理解,BamBook 主要面对的是国内中低端阅读器市场

然而,国内的“特殊环境”可能是制约此类产品发展的因素之一。这就好比国外卖手机其实卖的是服务而非硬件,国内此 类产品永远大多都是在做“产品”而非“服务”。

盛大当然也考虑过这个道理,因此考虑这款产品如何生存下去的条件之一,就是如何降低成本降低售价。BamBook 那 1k 不到的卖价,自然也就在情理之内(同时我有理由相信以后的价格只会更低)。

相对价格,时隔几个月不知此时发布的版本稳定性和速度对比那时体验的内测版是否有所提升。如果还是老样子,那么即便是如此低廉的价格,恐怕还是很难打动挑剔的消费者。

随着 iPad 等平板电脑的持续发力(虽然两类产品无法共同比较)、Kindle 的第三代版本目前最低售价也才一百多美元、同时国内现有的例如汉王等传统电子书厂商也有降价的趋势。

光控制成本和售价并不能说明 Bambook 有多少的竞争力。如果想在这堵墙中拉开道口子,BamBook 必须在其它的地方寻找突破口。

首先能想到的就是盛大目前掌握的资源 ,“搅局的人永远在后面出现”,不要忘记盛大的掌中已经有几家国内规模较大文学站点。如果盛大能将这些资源充分的利用 对接起来,那么原本风平浪静的国内阅读器市场将会变得复杂。

我们可以想象下此时盛大的心态,这个在大部分人眼中还是家依靠游戏外包发家的公司,对比腾讯没有其影响力和用户基础、对比百度其没有技术。如果其想要转型,那么除了大肆收购的手段之外,剩下事情就是组建自己的核心生态圈--回头看其实这个局早在 2006 年就已经开始布置。

我们回看 BamBook 产品本身,那外形类似 Kindle、平台 UI (甚至产品页面)类似 Apple 的 Bambook,它首先需要做的就是摆脱那模仿的影子,同时避免那些拙劣的推广手段

那么这样,才有它的未来。

-- EOF --

“我是如此得深爱着 ssh”July 27, 2010

ssh 绝对不不仅仅是类似 telnet 这样远程登录管理主机那么简单。下面的些 技巧,或许可以激发起你对这个“老朋友”重新认识的兴趣。

有部分内容来自:http://derwiki.tumblr.com/post/841579929/how-i-learned-to-stop-worrying-and-love-ssh

建立 HTTP 隧道

如果你需要访问线上集群中某台内网主机,那么你可以这样

ssh -f -N -L 31609:192.168.0.1:80 remotehost

当运行完毕以后,打开本地浏览器访问 http://localhost:31609 端口,则可以获取 remotehost 访问 192.168.0.1 的 80 端口的数据。

反向 ssh 隧道

如果本地局域网无法访问某些站点,那么你可以利用你的 ssh 主机通过它去访问。你可以使用

ssh -D 8080 remotehost

然后设置代理为 localhost:8080 则可以通过 remotehost 访问制定的资源。

PS,如果你使用 Mac,并经常会这样干,那么你会喜欢这个工具

直接运行远程脚本

ssh 其实可以直接指定运行远程主机的命令。例如,每次登录并查看线上的日志是件非常繁琐的累活。其实你可以使用下面的命令

ssh user@remotehost "taif -f /var/log/apache/access.log"

它会 ssh 登录以后直接执行指定的命令。这样我们可以构建本地脚本让其接受远程服务器的输出,做更多的事情。

压缩传送文件和目录

有时候不想开启 SFTP 工具传送文件,那么下面的命令会帮到你

tar cvfz - localFileOrDir | ssh user@remotehost 'cd /remote/path/to/unpack/ ; tar xvfz -'

这个命令可以自动讲本地的文件或者目录打包压缩以后,通过 ssh 传输到 remotehost 主机,然后 remotehost 会自动将其解压缩。

自动登录 ssh

最后个 ssh 技巧,上面的技巧的确是很实用,但是我们也受不了每次都要输入次密码。如果你的确厌烦了这些,那么尝试执行下面的命令:

ssh user@remotehost 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

这样远程的主机就会保存你本地的公钥,你就可以自动 ssh 登录远程主机(详细)。

顺便提醒:强烈提醒您保护好您主目录下的 ssh 私钥,否则您的帐户可能会面临风险。

还有些有用的参数

各位还有什么其它好用的 ssh tips,欢迎不吝指出。

-- EOF --

  1. 1
  2. 2
  3. 3
  4. 4
  5. ...
  6. 126
Yahoo 统计