linux是什么
如何学习
选择发行版
安装,虚拟机环境,硬盘、光盘、U盘
目录结构,挂载
认识终端命令行,基本命令:cd, ls, mkdir, cat, less
yum
三板斧:yum update, yum install, yum erase
yum进阶:yum provides, yum list, yum grouplist(groupinstall)
vim生存技能:模式,移动光标,保存搜索
bash进阶:多任务,jobs, &, bg, fg, kill
linux是什么
如何学习
选择发行版
安装,虚拟机环境,硬盘、光盘、U盘
目录结构,挂载
认识终端命令行,基本命令:cd, ls, mkdir, cat, less
yum
三板斧:yum update, yum install, yum erase
yum进阶:yum provides, yum list, yum grouplist(groupinstall)
vim生存技能:模式,移动光标,保存搜索
bash进阶:多任务,jobs, &, bg, fg, kill
这是对旧文中提到的wordpress访客记录的一次升级版,照样很简陋,算作给自己玩的吧;谁需要的话,也可以拿去玩。
源码
<?php /* Plugin Name: fs trace Plugin URI: https://blog.path8.net/ Description: This plugin will trace all visitor's visit action. Version: 0.0.2 Author: fengyqf Author URI: https://blog.path8.net/ */ /* Copyright 2008 fengyqf (email : fengyqf@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ function fstrace_by_fengyqf(){ global $wpdb; $url=mysql_escape_string(substr($_SERVER["REQUEST_URI"],0,200)); $referer=mysql_escape_string(substr($_SERVER["HTTP_REFERER"],0,200)); $cookie=mysql_escape_string(substr($_SERVER["HTTP_COOKIE"],0,250)); $client=mysql_escape_string(substr($_SERVER["HTTP_USER_AGENT"],0,200)); if(getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR')) { $ip = getenv('REMOTE_ADDR'); } else { $ip = $HTTP_SERVER_VARS['REMOTE_ADDR']; } $ip=mysql_escape_string(substr($ip,0,16)); $sql="insert into `log`.`wp_trace_{$wpdb->prefix}`(`referer`,`url`,`unixtime`,`ip`,`client`,`cookie`) values('{$referer}','{$url}',".time().",'{$ip}','{$client}','{$cookie}')"; $wpdb->query($sql); if($wpdb->last_error){ echo "<script type=\"text/javascript\">alert('Something Wrong! get messages at page bottom. | 出错了,到页底查看详细');</script><h1>fs trace message</h1><p>You Need to Create a table for <strong>fs trace</strong>, to log your visitor active. this table was in database <i>log</i>, you can change the wp-plugin <strong>fs trace</strong> file, in wp pannel - plugins - edit - fs trace, find the line \" \$sql=\"insert into `log`.`wp_trace_{$wpdb->prefix}`... \", and change it to <pre>\$sql=\"insert into `wp_trace_{$wpdb->prefix}`...</pre> (yes, delete <i>`log`.</i>),and sava it </p> <p>您需要创建一个表,用于 <strong>fs trace</strong>存储wordpress的将追踪记录. 该表默认位于数据库 log 中。如果您不方便创建一个名为log的数据库,可以将该表放在当前数据库中,只是要修改一下<strong>fs trace</strong>源码了,到wordpress仪表盘 - 插件 - 编辑 - fs trace, 找到这样一行 \" \$sql=\"insert into `log`.`wp_trace_{$wpdb->prefix}`... \", 改成 <pre>\"insert into `wp_trace_{$wpdb->prefix}`...</pre> (就是删除 <i>`log`.</i>),保存。 </p> <p>create the table as below/建表语句如下</p> <pre>use `log`; CREATE TABLE `wp_trace_{$wpdb->prefix}` ( `id` int(11) NOT NULL AUTO_INCREMENT, `referer` varchar(200) NOT NULL DEFAULT '', `url` varchar(200) NOT NULL DEFAULT '', `unixtime` int(10) unsigned NOT NULL DEFAULT '0', `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `ip` varchar(16) NOT NULL DEFAULT '', `client` varchar(200) NOT NULL DEFAULT '', `cookie` varchar(250) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;</pre> <p>grant the mysql user INSERT privileges at least;In fact, INSERT is enough. </p> <p>为 mysql 用户赋权限,至少需要对该表的INSERT权限;事实上只需要insert权限即可. </p> <p> Alert by the plugin <strong>fs trace</strong> </p>"; // var_dump($wpdb); } } add_action('wp_footer','fstrace_by_fengyqf'); ?>
wordpress后台,通过上传zip文件方式上传该插件,(或解压后,连目录上传到wordpress下 wp-content/plugins/ 目录),启用插件,然后到打开前台任意页面,照错误提示操作。消息提示有中英两种语言。提示文字可能因为您的模板关系而排版错乱,看起来有些费力。
本插件不会自己创建数据表,需要您按消息提示手工创建。
本表默认在一个名为log的数据库里,因为追踪表通常会比较大,可以减少wordpress主数据库体积,主要是方便备份。单独。如果不方便创建这个数据库(如在虚拟主机上,主机商通常只给一个数据库),可以修改本插件源码,上述错误消息里也有提示。
实例:一个mssql 2008的数据库备份,要还原到2005上,本来以为备份时把数据库兼容级别为2005或2000、再备份,就可以还原到2005上,但事实上不行。
通过google找到了一个办法,有点麻烦,但还是可以比较完美还原的。
高版本上导出兼容在低版本上的创建数据库结构的的sql脚本,拿到低版本上执行,创建数据库及表结构,然后使用导入数据功能,从高版本上导入到低版本上。导入时,要对每个表勾选“启用标识插入”。
具体来说:
mssql manger studio 打开"对象资源管理器"(没有的话按F8), 连接到待备份的数据库,在待备份的数据库上点右键 - 任务 -生成脚本
在"脚本向导"的"选择数据库"中, 勾选"为所选数据库中的所有对象编写脚本"
下一步的"设置脚本选项"中, 找到"为服务器版本编写脚本"项, 选择合适的低版本("SQL Server 2005"或2000 )(这步很重要!!)
继续完成向导过程,最后把脚本保存到一个 .sql 脚本文件
拿这个sql脚本文件到目标数据库(低版本mssql)上,执行。
然后使用mssql的导入导出功能,勾选需要的表(通常是“全选”),然后点选所有的表,点“编辑映射”,启用标识插入。然后继续即可。
php的iconv函数只支持对字符串的转换编码,如果是数组,就要自己遍历转换了,因此写如上的函数,对任意维数组进行转换,同时转换下标(索引)及值。
注意:不转对象。
function mult_iconv($in_charset,$out_charset,$data) { if(substr($out_charset,-8)=='//IGNORE'){ $out_charset=substr($out_charset,0,-8); } if(is_array($data)){ foreach($data as $key => $value){ if(is_array($value)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); $rtn[$key]=mult_iconv($in_charset,$out_charset,$value); }elseif(is_string($key) || is_string($value)){ if(is_string($key)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); } if(is_string($value)){ $value=iconv($in_charset,$out_charset.'//IGNORE',$value); } $rtn[$key]=$value; }else{ $rtn[$key]=$value; } } }elseif(is_string($data)){ $rtn=iconv($in_charset,$out_charset.'//IGNORE',$data); }else{ $rtn=$data; } return $rtn; }
调用示例:
$foobar=mult_iconv('gbk','utf-8','一个数组、字符串或其它类型数据');
一个复杂一点的测试示例(不转对象)
// ******* 一个复杂一点的测试示例 ******************** class MyClass { public $v1='不转对象,恭喜发财'; public $v2='skipped object'; public function f() { return true; } } $obj=new MyClass(); $foo=array('abcd','随便写点文字' ,array('中文下标'=> 789,'天地玄黄' =>array('宇宙洪荒'=>'赵钱孙李',300=>'恭喜发财,不转对象' ,array('更深的数组'=>'照样可以转换') ) ) ,'恭喜发财,不转对象' => $obj ,'如需转对象'=>'Do It Yourself!' ,'作者很懒'=>'用不到就不写了' ); $bar=mult_iconv('gbk','utf-8//IGNORE',$foo); var_dump($bar);
很自虐的搭配php+MSSQL,太多的坑,就不说text型被截断了。
受限于现有的asp+mssql应用,新增的部分功能使用php开发。对一个表的读写,后台使用asp,读写都很正常。前台一个调用是php写的,但就是遇到一个诡异的问题,要对数据做一个很复杂的解析处理,结果是数据丢失一部分。一层一层的输出,最后才发现是从数据库读出来了数据就不完整,这可奇怪了。又不是text型的数据,加了ini_set()修正text型默认长度限制,也不行。
但被截断长度很奇怪,恰恰是254个字节,似乎正好是较老的mssql里varchar()的默认最大长度;而该字段的实际是varchar(1000);
难道是字段类型问题?
于是修改该字段为text型,再执行,全好了,没有一点异常。
看来php+mssql实在是个自虐的搭配,不知道还有多少坑....
不过限于老的程序架构,也是个没办法的,人总是要吃饭的....
这些坑还是有解决方案的,先留着,以后补充
1 text/ntext型字段长度被截断
2 php下mssql 库不支持ntext类型的数据
3 “varchar(n) 其中n>254 ”类型数据被截断
4 php5.3以后的win32 官方二进制版不支持mssql库