本帖最后由 default7 于 2010-07-06 15:00:45 编辑

解决方案 »

  1.   


    谢谢前辈,其实在发这个贴之前心里有点紧张,有点担忧大家笑话了。
    我打算用拿这个一方面作为面试作品,另外一方面挂广告,比如google广告,赚点小外快~~~现在这个平台其实还不完善,导航不太好,会一步步完善。
    现在正在采集数据~~~~~~,后台有一个自动采集器。
    内容和网页布局会一点点完善。
      

  2.   

    不错!
    拿出去面试需要在改改bug,比如http://www.pjob.info/del.php?id=597是空白
      

  3.   


    这个现在已经处理了,原先的是没弄,所以显示一片空白。
    不会图片处理,也没有找到合适的网站来仿,所以就这样列出记录。
    是copy 前程无忧的~~~~~~~~~~~~~~
      

  4.   

    两个,一个英文的,一个翻译的
    http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
    http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
      

  5.   

    果然bug多多,招聘,搜索都没用。单纯的数据库分页应用而已。。
      

  6.   


    发布地址在 www.pjob.info/post.php ,是免费发布的。是有搜索功能的啊,在 www.pjob.info/search.php 这个里面啊。
    可能您没注意到,因为那个表单不太明显。连电脑都没,学起来肯定会比较难的啊,因为练习比较重要~~界面是比较丑,但是个人美工水平实在是太差了,基本的图片处理也不会,所以只能这样了~~
      

  7.   

    美工PS学了,但没学会,感觉要记忆的太多了。PS还没入门……
      

  8.   

    有,自己做的采集器,不过需要手动粘贴搜索结果的HTML,然后他自动采集。
    提取的内容比较粗糙~~~~~~~~~~
      

  9.   

    <?php/*
      本文件编码ANSI/ASCII 网页编码GB2312*/
    require_once '../common.php';
    AdminIsLogin();
    //ajax完成
    if($_GET['formhash'] == formhash()){
      @header("content-type:text/html;charset=gb2312");
      $id = intval($_GET['id']);
      $setarr = array();  $setarr['fromurl'] = 'http://search.51job.com/job/'.$id.',c.html';
      $sql = "select 1 from @#__thread where fromurl='$setarr[fromurl]' limit 1 ";
      if($db->result_first($sql) == 1) exit('已经存在了'); //已经存在了
      $html = gethttpcnt($setarr['fromurl']);  //获取标题
      $regx_title = '/<title>【(.+),(.+)】([^】]*)<\/title>/';
      if(preg_match($regx_title,$html,$out)){
        $setarr['title'] = $out[1];
        $setarr['author'] = $out[2];
        }else{
          exit('匹配标题失败');
        }  //提取工作地点
      $regx_workplace = '/<td class="txt_1">工作地点:<\/td><td class="txt_2">([^<]+)<\/td>/';
      if(preg_match($regx_workplace,$html,$out_workplace)){
          $setarr['cityname'] = $out_workplace[1];
        }else{
          exit('匹配工作地点失败');
        }    $html2 = str_replace(array("\n","\r","\s","\t","  "),' ', nl2br( strip_tags($html)) );    $regx_cnt = '/查看公司简介&gt;&gt;(.*)网站导航/';
        if(preg_match($regx_cnt,$html2,$out2)){
          $setarr['cnt'] = preg_replace('/(比比你的竞争力.*打印&nbsp;』)|(具体位置.*发送到手机)/','<br />',$out2[1]);
          $setarr['cnt'] = preg_replace('/(公司性质|公司规模|联&nbsp;系&nbsp;人|地址|邮政编码|公司网站)/','<br />\\1',$setarr['cnt']);
          }else{
            exit('内容匹配失败!');
          }
          //swritefile('93.html',$setarr['cnt']);
          $setarr['cnt'] = preg_replace('/(<br \/>\s*<br \/>)|(&nbsp;\s*&nbsp;)/','',$setarr['cnt']);
          $setarr['cnt'] = str_replace('\'','&#39;',$setarr['cnt']); //单引号的过滤
          $setarr['date'] = $_SG['timestamp'];
          $setarr['authortype'] = 'co';
          $setarr['md5'] = md5($_SG['timestamp'].random(8));      //重设编码,写入数据
          $db->query("set names gb2312 ");
          $data = affectrow('thread',$setarr);
          $msg = '<b>'.$setarr['title'].'-'.$setarr['author'].'</b>';
          echo $msg.($data ? '成功':'<span style="font-weight:bold;color:red">失败</span>');
          exit();
      }
    admheader('gb2312');
    ?>
    <h2>工作导入</h2>
    <form id="form1" name="form1" method="post" action="">
      <table width="100%" border="0">
        <tr>
          <th>数据内容</th>
          <td><label>
            <textarea name="htmldata" cols="80" rows="30" id="htmldata"></textarea>
          (提交的内容来自于搜索之后的粘贴内容)</label></td>
        </tr>
        <tr>
          <th>&nbsp;</th>
          <td><label>
            <input type="submit" name="submit" value="提交" />
            <input name="formhash" type="hidden" id="formhash" value="<?php echo formhash()?>" />
          </label></td>
        </tr>
        <tr>
          <th>--</th><td id="apireturn"></td>
          </tr>
      </table>
    </form>
    <div id="hiddendiv" style="display:none"></div>
    <script language="javascript" type="text/javascript">
    <!--var i = 0;
    var idsArr = [];function check(){
      var apiurl = '?formhash='+ $('#formhash').val()+'&'+(new Date()).valueOf();
      apiurl += '&id='+idsArr[i].substr('selectJobid'.length);  $.get(apiurl,function(data){
        i++;
        $('#apireturn').html( $('#apireturn').html() + i + '/' + idsArr.length + ':' + data + ' ◆ <strong title="'+ apiurl + '">Ajax发送网址<\/strong><br \/>');
        if(i == idsArr.length) return;
        check();
        });
      }$(document).ready(function(){
      $(":text,textarea,:file,:password").each(function(){
        $(this).width(550);
        $(this).focus(function(){$(this).addClass("foc");});
        $(this).blur(function(){$(this).removeClass("foc");});
      });
      $("td div").css({'padding-left':'10px','text-align':'right'});
      $('#form1').submit(function(){
        i = 0;
        $('#apireturn').html( $('#apireturn').html() + '<hr \/>');
        //$('#hiddendiv').html( $.trim($('#htmldata').val()) );
        var regexp_ids = /selectJobid([0-9]+)/gi;
        idsArr = $('#htmldata').val().match(regexp_ids);
        check();
        return false;
        });
    });-->
    </script>
    <?php admfooter(); ?>该采集文件所有代码在这个文件里面(大家顺便评价我的写法格式~~~~~~~):
      

  10.   

    因为批量采集不行,在本地试了和购买的虚拟主机上面试都没有反应,所以最后只有一条条采集了~~~~~~~~~
    用了ajax(jQuery)。
      

  11.   

    很不错 界面就是要丑陋 或者说就是要简洁 豆瓣要是也跟着sina 腾讯学习 就一定火不起来 你加强一下采集功能 另外界面如果能做成EXTJS的CURD同步就已经很完美了  上这种站的人要的就是数据 如果能在MySQL的数据挖掘上下下功夫 把相关度做密集一点 绝对有人收购你的站 
    这站 不错 说真的 国内的站 大都比较垃圾 主页全市广告和一些有噱头没信息的垃圾头条  就是ecshop这些网店系统 也是华而不实 跟zencart magento这些国外人写的 在推广上就是不一样 我们公司用国外人的CMS 一个月节约很多推广费 
    智者务其实 愚者争虚名 顶你一个 来PHP一个月 总算看到点有价值的帖子了 
      

  12.   

    我觉得你的js写的不错啊。   我想问下你的js 脚本中。$表示什么意思啊。
      [code]$(":text,textarea,:file,:password").each(function(){
        $(this).width(550);
        $(this).focus(function(){$(this).addClass("foc");});
        $(th[/code]
      

  13.   

    那个是jQuery的,“$” 即 “$.jQuery();”
    其实我也解释不清楚,但是知道这样用~~~~
      

  14.   


    昨天晚上弄了下后台,增加了个缓存管理的。
    现在缓存就两个,一个index.php生成index.html,另外一个sitemap.php生成的sitemap.xml文件。
    然后增加了一个数据表的优化检查工具。
    另外也加了一个回帖的功能,这个不知道大家觉得有没有必要啊,招聘回帖,其实是从咨询考虑的~~首页的缓存,是index.html每次点开都会 $.get(site.rooturi + 'index.php?checkCacheExist=yes&'+(new Date()).valueOf()); (可以打开index.html文件看源码底部Line 553 ) 。
    然后index.php文件就会检查缓存生成时间,如果超过 18000 秒就会重新生成./index.html缓存。
    这个是我想的方法,不知道大家还有没有更好的方法。
    因为index.php里面的查询比较多而且又是首页,所以需要缓存。首页的代码(希望大家点评下~~~~):
    文件./index.php<?php
    define('CURPHP','index');
    require_once './common.php';$cachefile = './index.html';
    if(file_exists($cachefile) && $_SG['timestamp'] - filemtime($cachefile) < 18000){  if($_GET['checkCacheExist'] == 'yes') exit('OK');  //假如有首页文件,那么跳转
      header("HTTP/1.1 301 Moved Permanently");
      header("Location: ./index.html ");
      exit();}else{  foreach($titleArr as $key){
        $sql = "select t.*,count(p.pid) as postnum  from @#__thread t  left join @#__post p on p.tid=t.tid
        where t.`title` like '%$key%'
        group by t.tid order by t.`date` desc limit 30 ";
        $key .= 'Arr';
        $$key = array();
        $query = $db->query($sql);
        while($rs = $db->fetch_array($query)){
          ${$key}[] = $rs;
          }
        }
      include_once template('index');
      swritefile($cachefile,ob_get_contents());
    }
    ?>
    这是首页的源码,里面的函数库在./common.php 里面引入了 ./source/function_common.php ,其实这个函数库是来自discuz的,然后我自己修改了下,去掉了不用的函数,然后修改了一些拿来自己用的。
    也算是一个框架吧,站点布局是和uchome一样的布局。希望大家多写下自己的看法,不知道大家的写法是怎么样的啊?希望看看大家的index.php写法~~~~~
      

  15.   

    模板文件index.php的源码内容:<?phpif(!defined('IN_PJOB')) die('Access die!');
    include_once template('header');
    ?><?php foreach($titleArr as $key){ ?>
    <div class="cntpart">
    <h2><?=$key?>招聘:</h2>
    <ul>
    <?php foreach(${$key.'Arr'} as $rs){ ?>
      <li><a href="<?=durl($rs['md5'])?>"><strong>[<?=$rs['cityname']?>]</strong>招聘<?=$rs['title']?></a><span class="count hide">(<?=$rs['postnum']?>/<?=$rs['hit']?>)</span> </li>
    <?php } ?>
      <li><a href="sotitle_<?=urlencode($key)?>/">更多&raquo;</a></li>
    </ul>
    </div>
    <?php } ?><script language="javascript" type="text/javascript">
    <!--
    $(function(){
      $.get(site.rooturi + 'index.php?checkCacheExist=yes&'+(new Date()).valueOf());
      $('.cntpart li a').each(function(){
        $(this).attr('title',$(this).text());
        });
      });
    -->
    </script><?php include_once template('footer'); ?>首页程序文件的那个$titleArr 变量其实是放在 ./common.php 里面的一个变量,这个是临时放的(未存入数据库,修改需要手动修改)。变量是这几个:
    $threadFnArr = array('title'=> '工作名称','cityname'=> '工作城市');
    $titleArr = array('Java','PHP','C','.NET','软件程序员','ASP','JSP','Windows','Delphi','Linux','美工','电子商务');
    $citynameArr = array('北京','上海','深圳','无锡','杭州','广州','南京','武汉','天津','杭州','宁波','青岛','大连','成都','重庆','苏州','佛山');
     (很惊讶,发现中文竟然可以作为PHP变量名~~~)
    希望大家多多点评下,我想知道下大家是怎么做的,因为我一直都是自己一个人做,没人教~~~~
      

  16.   

    基础可以了,试试用一些框架,如yii,zend。js也是,可以试试jquery或dojo。另外面向对象方面加强一下
      

  17.   

    不错哦~ 页面简洁~ 竟然就只有底部两张图,还是w3c的。。js合下就更好了。。
      

  18.   

    其实那两张图是多余的,目的是为了说明网页全部都能够通过W3C 的XHTML 和CSS验证的,是标准合格的~~~~~
      

  19.   


    3q~~又修改了下了
    ● 修改采集程序,使得原先的段落能够保留下来,不过还是有些不足,不太完美。
    ● 首页每个项显示 15 条,原先显示 30 条,非常长,不太好。
    ● 增加了一个sitemap.php ,主要是为了SEO。((*^__^*) 嘻嘻……,今天发现百度收录了首页了,Google收录了 8 页)。网站已经提交到了Google网站管理员中心了。
    ● 后台管理的都加上去了。
    ● 搜索,如果有IP记录的,那么字体加粗~~~~,发现已经有人发布招聘信息了,有点雀跃啊~~~~,是对我的鼓舞,,增加字体加粗的是那些非管理员采集的信息,管理员发布信息的时候不会记录IP的。
    ● 增加了一个status.php文件,其实是记录最新搜索的,按照那个最新搜索排在前面,www.pjob.info/status.php
    ● 标题改了,自动获取标题,其实数据库里面没有记录描述和关键字的,详细页和其他页面的标题都是直接使用 $_TPL['title']来设置的,然后 模板文件里面的header.php这个会显示 出来,如果没有标题,就默认的网站的标题,在后台可以设置。接下来只有等待了~~~~
    推广其实不太会,到处发链接帖,会很累啊~~~也希望大家多帮帮我推广下啊,遇到了合适的机会把链接粘贴过去吧~~~ 链接 www.pjob.info没啥经验,大家多指点指点,如何推广。
    其实我的这个网站还是有一定的优势的,不过是针对IT人才,心中需要勇气啊~~在一堆高手面前献丑啊~~~~~有新的更新会继续发在这个帖子里面~~~
      

  20.   

    发现问题了啊。文件:http://www.pjob.info/search.php
    状况:在搜索表单的“标题框”里面只输入英文状态下的逗号的结果,HTML里面的这个框的value值是“\&#39;”,但是按照我以前的思路应该是直接一个“&#39;”(即这一句的HTML代码应该是“value="&#039;"”),但是现在的结果却是“\&#039;”了,多了一个斜杠,而且“<”和“>”以及“"”都签名多了一个斜杠的。搜索表单传递的参数就这几个的 
    Array ( [title] => [cityname] => [cnt] => [author] => [Submit] => 提交 ) 
    ,form的method是GET。其实这个是很久以前一个没有解决的问题,在后台数据修改的时候碰到过(就是填写框中有英文状态下的分“"”“'”“<”“>”“&”这些符号的时候,就会出错。然后每次都进行htmlspecialchars,然后到了最后就变成一大堆&amp;了)文件里面获取网址参数的部分的源码:$where = " where 1 ";
    $fnArr = array('title','cityname','cnt','author','type');
    foreach($fnArr as $key){
      $$key = shtmlspecialchars( urldecode( trim($_GET[$key]) ) );
      if(!empty($$key)){
        $_TPL['title'] .= ' '.$$key;
        $where .= $key == 'type' ? " and `$key`='".$$key."' " : " and t.`$key` like '%".str_replace(' ','%',$$key)."%' ";
        $sql = "update @#__search set `hit`=`hit`+1,`date`=".$_SG['timestamp']." where `fn`='$key' and `vl`='".$$key."' limit 1 ";
        $db->query($sql);
        if(!$db->affected_rows()){
          $setarr = array(
                    'fn'=> $key,
                    'vl'=> $$key,
                    'date'=> $_SG['timestamp'],
                    );
          affectrow('search',$setarr);
          }
        }
      }使用测试,去掉反斜杠发现一切正常:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head><body>
    <form id="form1" name="form1" method="post" action="">
      <label>
      <input name="textfield" type="text" size="68" value="&#39; &amp; &nbsp; &quot;" />
      </label>
      <p>
        <label>
        <textarea name="textarea" cols="68" rows="30"> &#39; &amp; &nbsp; &quot; </textarea>
        </label>
      </p>
      <p>
        <label>
        <input type="submit" name="Submit" value="提交 &#39; &amp; &nbsp; &quot; " />
        </label>
      </p>
    </form>
    </body>
    </html>
    如何才可以去掉那个反斜杠呢?
    直接print_r($_GET)是没有变的。
    应该是。./common.php文件的问题,应该是,不过还是没有头绪。因为./common.php 文件里面并没处理$_GET的函数。
    输入“&”和“>”是正常的,没有反斜杠,但是“<”和“'”却又有,而有的时候似乎“&”和“>”也会有。好怪啊。

      

  21.   

    我不太懂网站优化,怎么做可以使google,百度收录到哈
      

  22.   

    刚刚在网上看到有关采集的文章。
    今天又采集了几百条了,不知到会不会被K啊~~~
    是被搜索引擎K还是被空间商K~~~~~~~
    有点可怕,不敢采了~~~~~~~~~~
      

  23.   

    通过标题在google里面搜索了下,好像不止我一个人在采啊~~~~~~~~
      

  24.   

    感觉更像站长,而不是PHPer了~~~~~~~~~~~~~~~~~~~~~~~~
      

  25.   


    优化我现在主要针对Google,百度说实话很难掌握它的规律。
    Google网站管理员工具,很好用。上面会有优化提示。
    我的网页是符合W3C 标准的。对搜索引擎比较友好。
    网址MD5加密主要是增加他人的自动采集难度,不过如果别人要采集还是拦不住的,比如手动复制粘贴。
      

  26.   

    有个问题我一直没弄明白, 关于缓存的。
    比如首页缓存,5分钟更新一次,就是用楼主的方法,更新缓存时需要替换掉index.html。
    假如现在5分钟到了,有一个人调用index.php了,发现需要更新缓存,于是到数据库取数,再写入index.html,再看到结果。
    如果访问网站的人稍多,在前面那个人生成缓存的过程中(还没有写入index.html),这时又有人访问网站(index.php),又会发现需要更新缓存,因为他判断的依据还是旧的index.html。这岂不是有些冲突?不知道如何解决。
      

  27.   


    呵呵。
    首先,
    第一点,访问优先权的排序,/ → index.html → index.php → ……( Linux Apache 的或者WIN IIS 的服务器都是这样的优先权),第二点,如果最好这个时候发生了index.html过期了。如果他访问者正好处在了 /index.html 这个URL上面,而不是 / 这URL上面,那么提示的会是 404 页面没有找到(我在htaccess立马设置了会自动跳转到上一页或者首页,假如没有http_reffer)
    当一个用户访问 网站 www.pjob.info,他打开的应该是 / 而不是 /index.html 也不是/index.php(一般情况下是这样的),而这个时候正好 /index.html 过期了(通过ajax检测到过期,那么 /index.php 这个程序会自动删除 /index.html ,可是这个时候 /index.html 已经下载到了这个访问者的电脑里面了,否则他无法执行ajax的检测 ,因为我将那个ajax的GET检测放在了HTML的最底部,而且是在问文档加载完成后执行力高的)。
    步骤就是这样的,这个方法目前没有出现过差错。我觉得是最佳方法,不知道有否更好的方法呢?
    首页生成缓存主要是因为首页的查询太多了,很耗时间也占CPU(为空间商着想啊~~~~~~~~)。
      

  28.   


    没读明白,是往标题框里输入数据时,结果用post或get得到时会 多一个 反斜杠“\”么
     
      

  29.   


    其实后来我发现了,是在 ./common.php里面有代码处理了的。//GPC过滤
    $magic_quote = get_magic_quotes_gpc();
    if(empty($magic_quote))
    {
    $_GET = saddslashes($_GET);
    $_POST = saddslashes($_POST);
    }if($_SERVER['REQUEST_URI'])
    {
    $temp = urldecode($_SERVER['REQUEST_URI']);
    if(strexists($temp, '<') || strexists($temp, '"'))
    {
    $_GET = shtmlspecialchars($_GET);//XSS
    }
    }所以多了一个 斜杠了。
    但是如果我把这个saddslashes 函数去掉会怎么样呢?
    没人知道,很不想要那个斜杠,很别扭。而且 输入 < 竟然被过滤了两次了,变成了 “&amp;&amp;&gt;”,
    问题其实还没有解决~~~
      

  30.   

    给你点建议:
    既然是要拿去面试的作品,就尽量多的去用一些技术来丰富你的作品。系统架构上,使用MVC分层。
    数据方面,使他各种缓存,如文本缓存,memcache。
    前端多用js,UI一定要过关,不要觉得自己是做PHP的就可以不管UI,实际上现在很多公司对PHP程序员的要求很高,都要求JS。
    另外在给这个系统写一份详细的文档,包括你数据表是怎么设计的,索引怎么建立的。系统的整体结构什么的。以后拿着这个再去面试,将非常有帮助。
      

  31.   

    我觉得可以用javascript写出一些动态的效果,
    比如说把类似的条目折叠起来等
    能令画面漂亮一点
      

  32.   

    在发布信息页应该加验证码,否则遇上个使坏的,不到一个小时就可以让你的站瘫痪。另外,依靠md5文件名来防采集是没有作用的。 防采集最有效的方法是采用多套不同的模板+IP来路分析。关于敏感文字过滤,敏感文字库用base64加密就可以避免主机商或搜索引擎发现。