使用WordPress搭建的博客,安装此插件后,可以在文章或页面中分享作者喜爱的歌曲。
该插件提供搜索功能,作者输入关键字,即可搜索出希望分享的歌曲。分享后页面中自动出现亦歌迷你播放器,播放分享的歌曲。
在管理平台的“插件”->“添加新插件”中,搜索“1g music share”,即可找到此插件,轻松安装。
安装WordPress分享插件
使用WordPress搭建的博客,安装此插件后,可以在文章或页面中分享作者喜爱的歌曲。
该插件提供搜索功能,作者输入关键字,即可搜索出希望分享的歌曲。分享后页面中自动出现亦歌迷你播放器,播放分享的歌曲。
在管理平台的“插件”->“添加新插件”中,搜索“1g music share”,即可找到此插件,轻松安装。
安装WordPress分享插件
107 个机器人
Yahoo Slurp
Unknown robot (identified by ‘crawl’)
Googlebot
Yahoo! Slurp China
GouGou
OutfoxBot
GigaBot
Lilina
MSNBot
Java (Often spam bot)
NewsGator Online
BaiDuSpider
Sina Iask Spider
Bloglines
MagpieRSS
Alexa (IA Archiver)
Feedfetcher-Google
MT::Telegraph::Agent
Feedburner (更多…)
email输入类型
<INPUT type=email name=email>
此类型要求输入格式正确的email地址,否则浏览器是不允许提交的,并会有一个错误信息提示.此类型必须指定name值,否则无效果.
url输入类型
<INPUT type=url>
上面代码展示的文本域要求输入格式正确的URL地址,Opera中会自动在开始处添加http://.
日期时间相关输入类型(这些个很牛X的)
<INPUT type=date>
<INPUT type=time>
<INPUT type=month>
<INPUT type=week>
这一系列是很酷的一个类型,完全解决了烦琐的JS日历控件问题.但目前MS只有Opera/Chrome新版本支持,且展示效果也不一样.
number输入类型(这些个很牛X的)
<INPUT type=number>
这个不用多解释了,要求输入一个数字字符,若未输入则会抛出一个错误.
range输入类型
<INPUT type=range>
此类型将显示一个可拖动的滑块条,并可通过设定max/min/step值限定拖动范围.拖动时会反馈给value一个值.
search输入类型
<INPUT type=search>
此类型表示输入的将是一个搜索关键字,通过results=s可显示一个搜索小图标.
tel输入类型
<INPUT type=tel>
此类型要求输入一个电话号码,但实际上它并没有特殊的验证,与text类型没什么区别.
color输入类型
<INPUT type=color>
此类型表单,可让用户通过颜色选择器选择一个颜色值,并反馈到value中.
三、新增的表单属性
placeholder属性
<INPUT id=placeholder placeholder=”点击我会以清除”>
这是一个很实用的属性,免去了用JS去实现点击清除表单初始值.浏览器支持也还不错,MS除了Firefox,其他标准浏览器都能很好的支持.
require/pattern属性
<INPUT id=placeholder name=require required>
<INPUT id=placeholder name=require1 required=”required”>
<INPUT name=require2 pattern=”^[1-9]\d{5}$”>
表单验证属性,require类型时,若输入值为空,则拒绝提交,并会有一个提示。上面两种写法都对,这个很有用。并且可以用于textarea以及hidden/image/submit类型.pattern类型为正则验证,可以完成各种复杂的验证。这两种类型必须指定name值,否则无效果。
autofocus属性
<INPUT autofocus=”true”>
默认聚焦属性,可在页面加载时聚焦到一个表单控件,类似于JS的focus().
list属性
<INPUT id=list list=”ilist”>
<DATALIST id=ilist>
<OPTION value=”a” label=”a”>
<OPTION value=”b” label=”b”>
<OPTION value=”c” label=”c”>
</DATALIST>
该属性需要与datalist属性共用,datalist是对选择框的记忆,而list属性可以为选择框自定义记忆的内容。
max/min/step属性
<INPUT type=range step=”20″ min=”1″ max=”100″>
限制值的输入范围,以及值的输入渐进程度,比如可在number设定输入最大值最小值,或者在range中设定拖动阶梯。
autocomplete属性
<INPUT id=autocomplete autocomplete=”on”>
此属性是为表单提供自动完成功能。如果该属性为打开状态可很好地自动完成。一般来说,此属性必须启动浏览器的自动完成功能。
一、什么时候应用系统会从缓存中获取数据?
数据库从服务器上读取数据时,可以从硬盘的数据文件中获取数据,也可以从数据库缓存中读取数据。现在数据库管理员需要搞清楚的是,在什么样的情况下,系统是从缓存中读取数据,而不是从硬盘的数据文件中读取数据?
简单的说,数据缓存就是内存中的一块存储区域,其存储了用户的SQL文本以及相关的查询结果。通常情况下,用户下次查询时,如果所使用的SQL文本是相同的,并且自从上次查询后,相关的纪录没有被更新过,此时数据库就直接采用缓存中的内容。从这个原则中,可以看到如果要直接使用缓存中的数据,至少要满足以下几个条件。
一是所采用的SQL文本是相同的。当前后两次用户使用了相同的SQL语句(假设不考虑其他条件),则服务器会从缓存中读取结果,而不需要再去解析和执行SQL语句。这里需要注意的是,这里的SQL文本必须一次不差的完全相同。如果前后两次查询,使用了不同的查询条件。如第一次查询时没有输入Where条件语句。后来发现数据量过多,利用了Where条件了过滤查询的结果。此时即使最后的查询结果是相同的,系统仍然是从数据文件中获取数据,而不是从数据缓存中。再如,Select后面所使用的字段名称也必须是相同的。如果有一个字段名称不同或者前后两次查询所使用的字段数量不同,则系统都会认为是不同的SQL语句,而重新解析并查询。
二是从数据缓存的角度考虑,大小写是不敏感的。如前后两次查询时,采用的字段名称可能只有大小写的差异。如第一次使用的是大小,第二次使用的是小写,这系统认为仍然是相同的SQL语句。或者说关键字大小写等等这都是不敏感的。
三是要满足二次查询之间,数据记录包括表结构都没有被更改过。如果记录所在的标更改了,如增加了一个字段等等,此时使用这个表的所有缓冲数据系统将自动清空。这里需要注意,这里指的更改是一个广义的更改,包括表中任何数据或者结果的改变。举一个简单的例子,第一次查询时用户需要查询2010年的出货数据。查询后有用户在这个表中插入了一条2011年1月份的出货信息。然后又有用户需要查询2010年的出货信息。使用的SQL语句与第一次查询时完全相同。在这种情况下,数据库系统会使用缓存中的数据吗?答案是否定的。因为当中间用户插入一条记录时,系统会自动清空跟这个表相关的所有缓存记录。当第二次查询时,缓存中已经没有这张表对应的缓存信息。此时就需要重新解析并查询。
四是需要注意,默认字符集对缓存命中率的影响。通常情况下,如果客户端与服务器之间所采用的默认字符集不同,则即使查询语句相同、在两次查询之间记录与表结构也没有被更改,系统仍然认为是不同的查询。对于这一点需要特别的注意,大家比较容易忽视。
二、提高缓存命中率的建议。
从上面的条件分析中可以看出,利用缓存中的数据具有比较严格的条件。其实这些条件也是合情合理的。主要是为了保障数据的一致性。对以上这些条件有深入的认识之后,现在数据库管理员需要考虑的是,如何来提高这个缓存的命中率?对此笔者有如下几个建议。
一是在配置时,客户端与服务器端要使用相同的字符集。如果客户端(或者说第三方工具)与服务器端使用的字符集不同,那么任何情况下都不会使用缓存功能。特别在国内,需要用到中文的字符集。此时特别需要注意,客户端默认字符集要与服务器端的默认字符集相同。注意,这里是相同,而不是兼容。有时候即使采用了不同的字符集,客户端上仍然可以正常显示。这主要是因为有些字符集虽然不相同,但是是相互兼容的。在缓存管理上,需要相同,光兼容还不行。
二是在客户端上,要固化查询的语句。如现在有财务人员和采购人员同时从系统中查询11月份的出货数据。显然他们岗位职责不同,所需要字段的内容是不同的。此时在客户端出,可以允许用户设置自己所需要的表单格式。但是笔者建议,后台所采用的SQL语句最好是相同的。这里数据会经过三个渠道:后台数据库、客户端、用户。笔者的意识时,后台数据库与客户端之间的交互采用相同的SQL语句。然后客户端与用户之间进行交互时,根据用户定义的格式(包括字段前后的排列、不包括查询条件语句的差异)向用户显示数据。此时由于采用了相同的SQL语句(只是用户对于显示格式的要求不同),从而可以提高应用系统的查询效率。
三是提高内存中缓存的配置,来提高命中率。一般在服务器启动时,操作系统会跟数据库软件协商缓存空间的大小。当缓存工作不足时,缓存中最旧的缓存记录会被最新的消息所覆盖。可见,如果能够提高缓存空间,就可以提高命中率。这就好像打靶,目标多了,命中的几率也会高许多。不过用户的并发数越多,这个设置的效果会越不明显。
四是通过分区表可以提高缓存的命中率。在上面的条件分析中,大家可以看到,只要所查询的表中插入了一条记录,系统就会清空缓存记录。现在以查询出货记录为例。出货记录表每天都在更新,而用户在年初时,会经常需要查询上一年的出货记录。此时由于这个表中的数据每个小时都在更新,那么缓存中的信息会不断的被情况。此时缓存的命中率显然不会很高。针对这种情况,笔者建议可以采用分区表。如可以通过系统设置,将2010年的出货记录单独存放在一个出货的分区表中。即每一个年度都使用一张单独的分区表。此时2011年的纪录,就不会影响到2010年的分区表。此时如果用户重复查询2010年的出货信息,只要其使用的SQL语句相同(没有采用不同的查询条件),那么就可以享受缓存机制所带来的效益,提高应用系统的查询效果。。
三、多个应用对缓存的影响。
通常情况下,MySQL数据库的缓存是根据服务器内存的大小自动分配的。如果一台服务器上只有一个MySQL应用,那么固然最好。不过在实际工作中,为了降低信息化投资的成本,往往会在同一台服务器上布置多个信息化应用。由于其他信息化应用也需要使用内存的空间作为缓存,那么MySQL数据库中缓存空间就可能变小。如果遇到这种情况下,数据库管理员需要跟系统工程师进行协商,为各种不同的应用根据性能要求的不同,手工设置不同的缓存空间。如此的话,就可以避免同一台服务器上不同信息化应用对缓存的冲突。
方法一:
<?php
function extend_1($file_name)
{
$retval=””;
$pt=strrpos($file_name, “.”);
if ($pt) $retval=substr($file_name, $pt+1, strlen($file_name) – $pt);
return ($retval);
}
?>
方法二:
function extend_2($file_name)
{
$extend = pathinfo($file_name);
$extend = strtolower($extend[“extension”]);
return $extend;
}
方法三:
function extend_3($file_name)
{
$extend =explode(“.” , $file_name);
$va=count($extend)-1;
return $extend[$va];
}
将以下代码加入到您的网页中,放置在</body>标签前,即可使用百度在线拼音输入法。
简单方式:
<script type=”text/javascript” src=”http://www.baidu.com/olime/bdime_open.js”></script>
说明:采用简单方式的接口使用百度在线输入法时,所有设置将使用默认状态,如需要自定义各设置项,请使用高级方式。
高级方式:
<script type=”text/javascript”>
var bdime_option = {
ch : true,
bc : true,
pt : true,
on : true,
domain : “”,
username : “”,
targets : []
}
</script>
<script type=”text/javascript” src=”http://www.baidu.com/olime/bdime_open.js”></script>
参数说明:
ch
中/英文开关,true表示中文、false表示英文,可缺省,默认中文;
bc
全/半角开关,true表示半角、false表示全角,可缺省,默认半角;
pt
中/英文标点开关,true表示中文标点、false表示英文标点,可缺省,默认中文标点;
on
休眠开关,true表示开启、false表示休眠,可缺省,默认开启;
domain
cookie作用域(用于记录休眠、中/英文、全/半角、中/英文标点开关的状态),可缺省,默认不记录状态,cookie对应的key是bdime;
username
百度账号,可缺省,无默认值;
用户词库接口,指定相同的值将获得相同的用户词库用于存放用户自造词。站长也可以通过制定此值使得网站上所有用户获得相同的用户词库。(未开放)
targets
指定哪些输入框可以使用百度在线拼音输入法(输入框对象或id,多个输入框以”,”分隔),可缺省,默认自动识别页面中的输入框;
其他接口:
bdime.close()
当百度在线拼音输入法加载并初始化成功之后,可通过此方法关闭百度在线拼音输入法;
bdime.open()
当百度在线拼音输入法处于休眠状态或通过bdime.close()关闭之后,可通过此方法重新开启百度在线拼音输入法;
首先把以下函数放在 WordPress 主题文件夹里的 functions.php 中:
function filter_where($where = ”) {
$where .= ” AND post_date > ‘” . date(‘Y-m-d’, strtotime(‘-30 days’)) . “‘”;
return $where;
}
function some_posts($orderby = ”, $plusmsg = ”,$limit = 10) {
add_filter(‘posts_where’, ‘filter_where’);
$some_posts = query_posts(‘posts_per_page=’.$limit.’&caller_get_posts=1&orderby=’.$orderby);
foreach ($some_posts as $some_post) {
$output = ”;
$post_date = mysql2date(‘y年m月d日’, $some_post->post_date);
$commentcount = ‘(‘.$some_post->comment_count.’ 条评论)’;
$post_title = htmlspecialchars(stripslashes($some_post->post_title));
$permalink = get_permalink($some_post->ID);
$output .= ‘
‘;
echo $output;
}
wp_reset_query();
}
可以看到第二行中的 30 就是指最近 30 天,也可以根据你自己的需要修改这个时间。至于调用则和升级版之前的一样,下面只是比上次多加了一个 $limit 参数:
< ?php
//最新日志
some_posts( $orderby = ‘date’, $plusmsg = ‘post_date’, 10 );
//热评日志
some_posts( $orderby = ‘comment_count’, $plusmsg = ‘commentcount’, 10 );
//随机日志
some_posts( $orderby = ‘rand’, $plusmsg = ‘post_date’, 10 );
?>
location / {
# if the requested file exists, return it immediately
if (-f $request_filename) {
break;
}
set $supercache_file ”;
set $supercache_uri $request_uri;
if ($request_method = POST) {
set $supercache_uri ”;
}
# Using pretty permalinks, so bypass the cache for any query string
if ($query_string) {
set $supercache_uri ”;
}
if ($http_cookie ~* “comment_author_|wordpress|wp-postpass_” ) {
set $supercache_uri ”;
}
# if we haven’t bypassed the cache, specify our supercache file
if ($supercache_uri ~ ^(.+)$) {
set $supercache_file /wp-content/cache/supercache/$http_host/
$1index.html;
}
# only rewrite to the supercache file if it actually exists
if (-f $document_root$supercache_file) {
rewrite ^(.*)$ $supercache_file break;
}
# all other requests go to WordPress
if (!-e $request_filename) {
rewrite . /index.php last;
}
MySQL左连接查询是联合查询中的一种方式,就是说把两个相关的表通过这种方式联合在一起查询,从而更加方便调用数据,避免多层循环嵌套。
左连接查询所用关键字 left join
,书面解释如下:
左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。
下面我解释一下,也就是说左链接查询的返回结果既包含了left join关键字左边表的全部资料,同时也包含了与左表匹配的右表中的符合条件的资源。 简单的说就是以左表为中心,连带右表中的符合条件的资源。
Sql语句的写法:
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
相信大家看完之后一定很晕把,没关系,我解释一下大家就都明白了,看似复杂,其实条理很清楚。它的意思是:
一
select a.a , a.b
中
a.a 就是a表中的a字段的意思。
二
Select与from之间放的就是a表 b表中的相关要查询的字段。
三
from a LEFT OUT JOIN b
就是 从以a表为主左链接上右表b ,
匹配条件是 a表的a字段等于b表的c字段。
通过这几点解释相信大家也都明白百分之八十了,下面我们通过实例的演示再给大家说一下:
首先建立两个表
表pic
用于存放图片名字的表
CREATE TABLE `image`.`pic` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`pname` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE = InnoDB
表二 用于存放图片评论的
CREATE TABLE `image`.`comment` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`pid` INT( 10 ) NOT NULL ,
`content` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE = InnoDB
下面我要联合查询这两个表通过一条sql语句,注意以前咱们查询两个表肯定是先写一个表的sql然后在根据条件循环查询另一个表,现在不用了,通过这种查询,把返回结果放到一个数组中,
Sql语句写法:select
pic.*,comment.*
from
pic left join comment
on
pic.id=comment.pid
代码如下:
$conn = mysql_connect(“localhost”,”root”,””);
if(!$conn){
die(‘连接MySQL数据库失败: ‘ . mysql_error());
}
mysql_select_db(‘image’);
$sql=”select
pic.*,comment.*
from
pic left join comment
on
pic.id=comment.pid”;
$re=mysql_query($sql);
while($re1=mysql_fetch_array($re))
{
$arr[]=$re1;
}
print_r($arr);
打印结果如下:
Array
(
[0] => Array
(
[0] => 1
[id] => 1
[1] => aaaaaaaaa
[pname] => aaaaaaaaa
[2] => 1
[3] => 1
[pid] => 1
[4] => ccccccc
[content] => ccccccc
)
[1] => Array
(
[0] => 2
[id] => 2
[1] => bbbbbbbbbbb
[pname] => bbbbbbbbbbb
[2] => 2
[3] => 2
[pid] => 2
[4] => vvvvvvv
[content] => vvvvvvv
)
)
Ok
<?php
class word
{
function start()
{
ob_start();
print'<html xmlns:o=”urn:schemas-microsoft-com:office:office”
xmlns:w=”urn:schemas-microsoft-com:office:word”
xmlns=”http://www.w3.org/TR/REC-html40″>’;
}
function save($path)
{
print “</html>”;
$data = ob_get_contents();
ob_end_clean();
$this->wirtefile ($path,$data);
}
function wirtefile ($fn,$data)
{
$fp=fopen($fn,”wb”);
fwrite($fp,$data);
fclose($fp);
}
}
?>
插入数据
include ‘pdbm.php’;
$timestart = explode(‘ ‘, microtime());
$timestart = $timestart[0] + $timestart[1];
$pdbm = new Pdbm(‘test’);
$pdbm->open(PDBM_CREAT | PDBM_REWD);
for ($i = 0; $i < 100000; $i++) {
$pdbm->insert(“key{$i}”, “value{$i}”);
}
$timetime = explode(‘ ‘, microtime());
$timetime = $timetime[0] + $timetime[1];
echo $timetime – $timestart;
//*/
获取数据
include ‘pdbm.php’;
$timestart = explode(‘ ‘, microtime());
$timestart = $timestart[0] + $timestart[1];
$pdbm = new Pdbm(‘test’);
$pdbm->open(PDBM_REWD);
$val = $pdbm->fetch(‘key9999’);
if ($val == NULL) {
echo ‘Not found</br>’;
} else {
echo $val.”<br/>”;
}
//$pdbm->delete(‘key100’); //delete data
$val = $pdbm->fetch(‘key100’);
if ($val == NULL) {
echo ‘Not found</br>’;
} else {
echo $val.”<br/>”;
}
$timetime = explode(‘ ‘, microtime());
$timetime = $timetime[0] + $timetime[1];
echo $timetime – $timestart;
//*/
之前写过一篇这个插件的文章WP Cleaner 删除wordpress不再需要的修订版,但是自从某次升级以后变无法使用这款插件了,我一直以为是插件的问题,并且作者也发出了一个修正版本,但是情况依然没有改变,我还是无法使用。
这两天找了找其他的清理插件,效果没有这个理想还是想用这款插件,于是耐下心来看了看插件的代码,结果发现并不是大问题,因为我的空间不在支持短标签了,而插件是使用的短标签“<? ”我只需要改成“<?php ”即可了,粗略看了下代码使用了三次替换来处理这块。
第一,把代码里的“<?=”替换为“<?php echo ”
第二,把“<?”替换为“<?php”
第三,把“<?phpphp”替换为“<?php”
完成这三次替换保存代码即可在关闭短标签的状态下使用了。
插件官方地址:http://www.jiangmiao.org/blog/138.html
本站提供修改版下载地址:http://www.box.net/shared/sarkgk9ma2
PS:其实这个只是代码写作习惯问题,建议插件作者也处理下这块,毕竟运行环境有时候不用用户能够操作的,而且一个良好的习惯也是有必要的。
网上目前能找到两种方法:
1、找到wp-admin/includes/post.php里边的get_default_post_to_edit这个函数,
$post = get_post( wp_insert_post( array( ‘post_title’ => __( ‘Auto Draft’ ), ‘post_type’ => $post_type, ‘post_status’ => ‘auto-draft’ ) ) );
把这一句修改成如下:
$post_auto_draft = $wpdb->get_row( “SELECT * FROM $wpdb->posts WHERE post_type = ‘$post_type’ AND post_status = ‘auto-draft’ LIMIT 1” );
if ( $post_auto_draft ) {
$post = $post_auto_draft;
} else {
$post = get_post( wp_insert_post( array( ‘post_title’ => __( ‘Auto Draft’ ), ‘post_type’ => $post_type, ‘post_status’ => ‘auto-draft’ ) ) );
}
意思就是: 如果有自动保存的auto-draft就使用以前的auto-draft的ID来写文章,如果没有就插入一条auto-draft, 最后,数据库中总有一条auto-draft… 虽然数据库会多一条数据,但ID还是可以保持连续.
2、找到wp-admin\includes\post.php文件,在if ( $create_in_db ) {前面加上这句代码就可以了:
$create_in_db = false;
1. 新的Doctype声明
XHTML的声明太长了,我相信很少会有前端开发人员能手写出这个Doctype声明。
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
HTML5的Doctype声明很短,看到这个声明相信你马上就能记住,不用浪费脑细胞去记那长的有点变态的XHTML的Doctype声明了。
<!DOCTYPE html>
HTML5的简短的DOCTYPE声明是让Firefox、Chrome等现代浏览器和IE6/7/8等浏览器都进入(准)标准模式,你可能会奇怪IE6/7居然也可以支持HTML5 Doctype,事实上,IE是只要doctype符合 这种格式,都会进入标准模式。
2. <figure>标签
看看下面一段简单的代码:
<img alt=”About image” src=”path/to/image”>
<h6>image of Mars.</h6>
遗憾的是,这里的h6标签和img标签好像没有什么关系,语义不够明确。HTML5意识到了这一点,于是就采用了<figure>标签。当<figure>结合<figcaption>标签的使用,可以让h6标签和img标签组合起来,代码就更具语义化了。
<figure>
<img alt=”about image” src=”path/to/image”>
<figcaption>
<h6>This is an image of something interesting. </h6>
</figcaption>
</figure>
3. 重新定义<small>
不久前,我使用了<small>标签来创建与logo相关的副标题。但是在HTML5中重新定义了<small>标签,使之更能表现语义化,在<small>的字号都会变小,想想如果这个标签用于网站的底部的版权信息还是个不错的做法。
4. 去掉了Javascript和CSS标签的type属性
通常你会在<link>和<script>加上type属性:
<link rel=”stylesheet” type=text/css href=”path/to/stylesheet.css”>
<script type=”text/javascript” src=”path/to/script.js”></script>
在HTML5中,不再需要type属性了,因为这显得有点多余,去掉之后可以让代码更为简洁。
<link href=”path/to/stylesheet.css”>
<script src=”path/to/script.js”></script>
5. 是否使用双引号
这有点让人纠结,HTML5并不是XTHML,你可以省去标签中的双引号。相信大多数同志也包括我都习惯了加上双引号,因为这让代码看起来会更标准。不过,这可以根据你的个人喜好来确定是到底要不要双引号。
<h6 id=”someid”> start the reactor. </h6>
(更多…)
<html>
<head>
<title>javascript读取RSS数据</title>
<META content=”text/html; charset=utf-8″ http-equiv=Content-Type />
</head>
<body leftmargin=”0″ topmargin=”0″>
<font><h3 align=”center”>javascript读取RSS数据</h3></font>
<br>
<table width=”90%” align=”center” border=”0″ cellpadding=0 cellspacing=0>
<tr>
<td bgcolor=White><b>新闻中心</b><font size=”-1″>(摘自新浪网)</font><hr></td>
</tr>
<tr>
<td bgcolor=White>
<div id=”container” >News Loading…</div>
</td>
</tr>
</table>
<script language=”JavaScript1.2″>
//Container for ticker. Modify its STYLE attribute to customize style:
var tickercontainer=”
var xmlsource=”http://rss.sina.com.cn/news/marquee/ddt.xml”;
var root;
var title;
var link;
var items;
var item;
var images;
var image;
var description;
if (window.ActiveXObject)
{
//document.write(“Microsoft.XMLDOM”);
var xmlDoc = new ActiveXObject(“Microsoft.XMLDOM”);
}
else if (document.implementation && document.implementation.createDocument)
{
//document.write(“document.implementation.createDocument”);
var xmlDoc= document.implementation.createDocument(“”,”doc”,null);
}
if (typeof xmlDoc!=”undefined”)
{
//document.write(tickercontainer)
xmlDoc.load(xmlsource)
}
function fetchxml()
{
if (xmlDoc.readyState==4)
output()
else
setTimeout(“fetchxml()”,10)
}
function output()
{
var temp=””;
root = xmlDoc.getElementsByTagName(“channel”)[0];
title =root.getElementsByTagName(“title”)[0];
//temp = title.firstChild.nodeValue +”<br>”;
items=root.getElementsByTagName(“item”);
for(i=0;i<=items.length-1;i++)
{
item=items[i];
title=item.getElementsByTagName(“title”)[0];
link=item.getElementsByTagName(“link”)[0];
description=item.getElementsByTagName(“description”)[0];
temp = temp + “<font size=-1><a href=” + link.firstChild.nodeValue+ ” target=’_bank’>” +
title.firstChild.nodeValue +”</a></font><br><br>”;
//temp = temp +”<font size=-1>” + description.firstChild.nodeValue + “</font><br><br>”;
document.getElementById(“container”).innerHTML = temp;
}
}
if (window.ActiveXObject)
fetchxml()
else if (typeof xmlDoc!=”undefined”)
xmlDoc.onload=output
</script>
</body>
</html>
Directadmin控制面板,支持用户自定义404、403、401、500错误页面。
具体操作步骤如下:
1、进入主机控制面板,点击“自定义错误页面”;
2、点击“401.shtml ”、“403.shtml”、“404.shtml”、“500.shtml”即可以进入编辑相关设置页面;
3、编辑完成后,可点击“预览html”进行预览,如不需要修改,则直接点击“保存为”按钮即可成功设置相应错误页面。(注意:错误页面内容必须大于或等于512个字节,不然会自动使用系统内置错误页面)
首先,我们得先要确定我们的PHP是否开启了这个库,你可以通过使用php_info()函数来得到这一信息。
<?php
phpinfo();
?>
如果你可以在网页上看到下面的输出,那么表示cURL库已被开启。
如果你看到的话,那么你需要设置你的PHP并开启这个库。如果你是在Windows平台下,那么非常简单,你需要改一改你的php.ini文件的设置,找到php_curl.dll,并取消前面的分号注释就行了。如下所示:
//取消下在的注释
extension=php_curl.dll
如果你是在Linux下面,那么,你需要重新编译你的PHP了,编辑时,你需要打开编译参数——在configure命令上加上“–with-curl” 参数。
一个小示例
如果一切就绪,下面是一个小例程:
<?php
// 初始化一个 cURL 对象
$curl = curl_init();
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, ‘http://pzg.me’);
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 运行cURL,请求网页
$data = curl_exec($curl);
// 关闭URL请求
curl_close($curl);
// 显示获得的数据
var_dump($data);
?>
如何POST数据
上面是抓取网页的代码,下面则是向某个网页POST数据。假设我们有一个处理表单的网址http://www.example.com/sendSMS.php,其可以接受两个表单域,一个是电话号码,一个是短信内容。
<?php
$phoneNumber = ‘13912345678’;
$message = ‘This message was generated by curl and php’;
$curlPost = ‘pNUMBER=’ . urlencode($phoneNumber) . ‘&MESSAGE=’ . urlencode($message) . ‘&SUBMIT=Send’;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ‘http://www.example.com/sendSMS.php’);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec();curl_close($ch);
?>
从上面的程序我们可以看到,使用CURLOPT_POST设置HTTP协议的POST方法,而不是GET方法,然后以CURLOPT_POSTFIELDS设置POST的数据。
关于代理服务器
下面是一个如何使用代理服务器的示例。请注意其中高亮的代码,代码很简单,我就不用多说了。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ‘http://www.example.com’);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, ‘fakeproxy.com:1080’);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, ‘user:password’);
$data = curl_exec();curl_close($ch);
?>
关于SSL和Cookie
关于SSL也就是HTTPS协议,你只需要把CURLOPT_URL连接中的http://变成https://就可以了。当然,还有一个参数叫CURLOPT_SSL_VERIFYHOST可以设置为验证站点。
关于Cookie,你需要了解下面三个参数:
CURLOPT_COOKIE,在当面的会话中设置一个cookie
CURLOPT_COOKIEJAR,当会话结束的时候保存一个Cookie
CURLOPT_COOKIEFILE,Cookie的文件。
HTTP服务器认证
最后,我们来看一看HTTP服务器认证的情况。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ‘http://www.example.com’);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt(CURLOPT_USERPWD, ‘[username]:[password]’)
$data = curl_exec();
curl_close($ch);
?>
关于其它更多的内容,请参看相关的cURL手册。