2011年5月

mysql将一张表的查询结果存到另一张表中

网上说mysql不支持select into 找了两个方法 answer 01: create table dust select * from student;//用于复制前未创建新表dust的情况下 answer 02: insert into dust select * from student;//已经创建了新表dust的情况下 /来源 实际应用中:

INSERT INTO destTable( A )
SELECT a
FROM (
SELECT A AS a, COUNT( A ) AS c
FROM srcTable
WHERE C LIKE '%在线%'
GROUP BY a
ORDER BY c DESC
)t
WHERE t.c =3

写的过程中出现了两个问题,
  1. insert into 后面多写了一个table,结果老是syntax error
  2. subquery内部查询必须使用alias(上文中的t),不然也报syntax error
  3. 如果要存入文件使用into outfile '/tmp/xxfile.sql'

SyntaxHighlighter简介与使用

SyntaxHighlighter 是 Alex Gorbatchev 2004年开始开发的一个Javascript web客户端代码高亮库。

之前的主页在google code,现在已经转移到了alexgorbatchev.com。当前最新的版本是3.0.83,兼容的浏览器有:Internet Explorer 7.0  / Mozilla Firefox 3.0 /  Google Chrome 0.2  / Safari 3.1 /  Opera 9.6,IE6并不被支持。1.x的版本应该是支持的。

很多牛叉的站点在web中显示代码均使用SyntaxHighlighter,比如Apache, Aptana, Mozilla, Yahoo, Wordpress, Bug Labs, Freshbooks这里有详细列表。基本上所有的计算机编程语言都支持(通过Brush),参见这个列表。如果没有你需要的Brush,你可以自己写,写Brush JS也很简单。

使用SyntaxHighlighter也十分的简单,方法参见这里。有两种代码显示方式,第一种是使用<pre>标签,然后指定brush,比如:<code class="html color1">class</code><code class="html plain">=</code><code class="html string">"brush: js"</code>,方便在没开启js的浏览器中也能正常浏览代码,但是缺点是存在bug,所有的尖括号将会HTML转义(比如<专为<)。

另外是一个方式是

因为支持的语言有30多种,如果同时加载势必会占用过多的资源,所有syntaxhighlighter写了一个shAutoloader.js来自动加载所需要的js文件。

另外SyntaxHighlighter是可以通过切换主题来显示不同的效果的,主题文件有:

shCore.css  
shCoreDefault.css
shCoreDjango.css
shCoreEclipse.css
shCoreEmacs.css
shCoreFadeToGrey.css
shCoreMDUltra.css
shCoreMidnight.css
shCoreRDark.css
shThemeDefault.css
shThemeDjango.css
shThemeEclipse.css
shThemeEmacs.css
shThemeFadeToGrey.css
shThemeMDUltra.css
shThemeMidnight.css
shThemeRDark.css

shCore.css是最基本的CSS,可以和各种shTheme*.css一起使用,或者单独使用shCore*.css,也就是2中方案:

  1. shCore.css+shTheme*.css
  2. shCore*.css

就讲到这里了,其他的慢慢研究吧。

 

wordpress加入微博功能

目标:

  • 后台发布微博,只需填写内容,标题裁取内容的前200个字符,并自动过滤html标签(strip_tags()),并必须指定一个目录。比如:microblogging,并指定形式为:“ ”,因为wordpress的默认主题twentyten在主题模板loop.php文件中对aside短文章有特殊的展示方法,直接沿用。

步骤:

  1. 首先下载能满足我们打部分要求的wordpress插件:Alkivia SidePosts,

A simple widget to move posts from a category to the sidebar. Posts do not show on index, archives or feeds, and have its own feed.

<p class="active second plugin-version-author-uri">
3.0.2 版本 | 作者为 <a href="http://alkivia.org/" title="访问作者主页">Jordi Canals</a> | <a href="http://alkivia.org/wordpress/sideposts" title="访问插件主页">访问插件主页</a> <p>
这个插件可以将某个目录的所有posts移动到sidebar,posts并不在首页,存档页,feeds中出现,它有自己单独的feed地址。下载后启用,进入“主题”->"小工具",将SidePosts这个Widget拖入第一工具栏就可以了。
</p>
</p>
  1. 我的博客中已经存在了大量的微博文章,具有一个共同的特点就是tag都是microblogging,操作mysql数据库,在wp_terms表中查找name='microblogging'的记录,然后记住该记录的term_id,比如为733,进wp_term_taxonomy表,搜索term_id=733的记录,这样就查找到了tag为microblogging的记录,查看它的taxonomy为'post_tag',表示是一个tag,修改为‘category’,就这样将所有tag为microblogging的文章转成了目录在microblogging下的文章。这样做的目的是因为Alkivia SidePosts只能通过目录来区分,而不能是tag,更不能是post_format。

    就这样轻松的可以在post_tag和category之间轻松的转换,主要得益于wordpress数据库设计得很抽象。

    wp_terms
    term_id     name                slug
    733     mb              mb
    1063        post-format-aside           post-format-aside
    wp_term_relationships
    object_id   term_taxonomy_id    term_order
    4000        770(目录:mb)      0
    4000        1213(aside)
    文章(1)   ->   taxonomy(多)
    wp_term_taxonomy
    term_taxonomy_id    term_id     taxonomy        count
    770         733     category        2582
    1213            1063        post_format     1
    

然后编写一个简单的php脚本,将所有category为microblogging的posts有standard修改为aside短文章形式,aside的原理也是在新的taxonomy,可以做到不修改data schema的前提下扩展wordpress的功能。

< ?php
$link_id = mysql_connect("localhost", "user", "pass") or
        die("Could not connect: " . mysql_error());
mysql_select_db('tunpscom_wp');
$result=mysql_query("select object_id from wp_term_relationships where term_taxonomy_id=770");
while($row=mysql_fetch_assoc($result))
{
    //print_r($row['object_id']."
");

    $sql="insert into wp_term_relationships(object_id,term_taxonomy_id,term_order) values(".$row['object_id'].",1213,0)";
    echo $sql."
"
;
    mysql_query($sql);
}

//770是microblogging,1213是post-format-aside

  • 然后写一个wordpress插件,作用当发表aside文章的时候,标题裁取内容的前200个字符,slug保存为unixtime,上传,启动!

    < ?php
    /*
    Plugin Name:    slug
    Plugin URI:        http://tunps.com
    Description:    当发表aside文章的时候,标题裁取内容的前200个字符,slug保存为unixtime
    Version:        1.0
    Author:            tun
    Author URI:        http://tunps.com
    */
    function append_slug($data) {
        global $post_ID;
        if($_POST['post_format'] == 'aside')
        {
            $data['post_title'] = mb_substr(strip_tags($data['post_content']),0,140);
            if(!is_valid_unixtime($data['post_name']))
                $data['post_name'] = time();
        }
        return $data;
    }
    /*
    *    check the time ,disable update post_name where it is already unix time
    */
    function is_valid_unixtime($timestamp)
    {
        return preg_match('/^[0-9]+$/',$timestamp) && strlen($timestamp)>=10 && strlen($timestamp)< =13;
    }

    add_filter('wp_insert_post_data', 'append_slug', 10);

在“外观”->“菜单”中加入微博地址 http://tunps.com/category/microblogging

  • 修改WP-PostURL插件的wp-posturl.php 61行代码,
    if ((is_single() && $posturl_options['add_to_single'])
    修改为
    if ((is_single() && $posturl_options['add_to_single'] && !in_category('microblogging'))
    目的是让微博条目的前后都不显示自定义文字。

wp-content/themes/twentyten/loop-single.php页面 the_title()的展示加入条件判断:
                   < ?php if(!in_category('microblogging')) {  ?>
                    

< ?php the_title(); ?>



                    < ?php } ?>

<li>
<p class="active second plugin-version-author-uri">
wp-content/themes/twentyten/loop.php页面 111行,显示excerpt的地方直接显示content,所以将 <strong><?php the_excerpt(); ?></strong>修改为

<strong><?php the_content(); ?></strong>
</p>
</li></ol>