前言
本文将就UCH二次开发这个核心主题,以各种实现的代码为主,辅助部分说明概略的讲解如何针对UCH进行二次开发。过段时间UCH就开源了,准备到时候再详细的写篇UCH机制分析。
顺便说下,这篇文件写在大约两周以前,但是一直没有时间整理发布,今天听说UCH会在最近一段时间开源,到时候再发反而对大家帮助不大,所以决定不再整理,虽然文中一些说明还不详细,但是已经基本成文。
数据调用
这里的数据调用是使用UCenter Home内置的数据调用,在后台的“高级应用”里有“数据调用”管理,以下代码都是在模板中添加,然后调用数据。
1.站内数据调用
2.站外JS调用
block的使用
这个block数据调用和前面的讲的数据调用,从数据来源和生成来说是基本类似的,。
<!--{block/sql/SELECT%20%2A%20FROM%20uchome_blog%20ORDER%20BY%20dateline%20DESC%20LIMIT%200%2C8/cachename/test/cachetime/0}-->
<!--{loop $_SBLOCK['test'] $value}-->
<li ><a href="/blog_article/space/uid/$value[uid]/amp;do/blog/amp;id/$value[blogid].html">$value[subject]</a></li>
<!--{/loop}-->
eval的使用
合理的使用Ucenter Home模板语法中的eval语法,会在一定程序上降低二次开发的难度。比如:
1.通过eval语法在模板内执行PHP语句
<!--{eval echo '<li ><a href="/blog_article/do/ac/demo.html"><strong>最新日志演示</strong></a>';}-->
2.通过eval语法引入一个外部PHP文件
引入外部文件
<!--{eval include 'demo.php'}-->
备注:通过在模板中引入外部文件,你可做任何你想做的事情。
直接外部文件
do.php的扩展
1.首先,在do.php文件中添加允许的新方法
即在
'sns', 'viewspace', 'relatekw', 'ajax', 'seccode');
之后添加
2.然后,在source目录下新建do_demo.php文件,调用地址就是do.php?ac=demo
虽然UCH发布的文件是加密信息,但是我们从其已经开源的文件中可以得出进行UCH二次开发宝贵的信息。
比如/source/cron这个目录下以及source/class_mysql.php文件都是开源的,我们可以从中找出,对UCH进行二次开发非常有用的一些信息,比如如何进行SQL查询,通过分析,我们可以写出以下文件。
!defined('IN_UCHOME') && exit('Access Denied');
$query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('blog').' ORDER BY dateline DESC LIMIT 10');
$bloglist = array();
while ($value = $_SGLOBAL['db']->fetch_array($query)) {
$bloglist[] = $value;
}
include template('do_demo');
?>
模板文件templates/default/do_demo.htm内容为
<div >
<div >
<div >
<ul>
<!--{loop $bloglist $value}-->
<li>
<div >
<h4><a href="/blog_article/space/uid/$value[uid]/amp;do/blog/amp;id/$value[blogid].html">$value[subject]</a></h4>
<a href="/blog_article/space/uid/$value[uid].html">$value[username]</a> <span ><!--{date('Y-m-d H:i',$value[dateline])}--></span>
</div>
<div >
<!--{if $value[viewnum]}--><a href="/blog_article/space/uid/$value[uid]/amp;do/blog/amp;id/$value[blogid].html">$value[viewnum] 次阅读</a><span >|</span><!--{/if}-->
<!--{if $value[replynum]}--><a href="/blog_article/space/uid/$value[uid]/amp;do/blog/amp;id/$value[blogid].html">$value[replynum] 个评论</a><!--{else}-->没有评论<!--{/if}-->
</div>
</li>
<!--{/loop}-->
</ul>
</div>
</div>
</div>
<!--{template footer}-->
总结
虽然当前的UCH尚未开源,但是在模板界面完全可修改,合理利用上述数据调用机制的情况下,鲜有我们不能实现的页面效果和数据调用要求。
2/配置文件现在需要绝密的短语密码(blowfish_secret);
3/#2003-服务器没有响应。
由于目前phpMyAdmin的最新版本已经更新到了2.11.5.1,网上流传的很多配置方法都是以前老版本的,已经不太适应新版本的配置要求;于是 flymorn顺便也把phpMyAdmin2.11.5.1的配置步骤也列在下面;为了切换及调试PHP方便,我采用的是windows系统,本地调试。
1、先下载phpMyAdmin安装包:
到国外官方网站http://www.phpmyadmin.net上,点击导航栏上的“DOWNLOADS”链接进入下载页面,选择“all-languages.zip”版本下载到本地,解压;把解压缩文件放到系统指定的虚拟根目录下的phpmyadmin文件夹里(可自定义文件夹名),如flymorn的本地存放位置是D:\www\phpmyadmin里。
2、找到phpmyadmin文件夹里的/libraries/config.default.php文件(旧版本是根目录下的config.inc.php文件),用支持UTF-8编码的写字板打开进行编辑。
3、查找 $cfg['PmaAbsoluteUri']
修改为你将上传到空间的phpMyAdmin的网址
如:$cfg['PmaAbsoluteUri'] = 'http://www.piaoyi.org/phpmyadmin/';
这里因为我是本地调试,我改为$cfg['PmaAbsoluteUri'] = 'http://localhost/phpmyadmin/';
注意:不要漏掉最后的反斜杠/和开头的http。
4、查找 $cfg['Servers'][$i]['host'] = 'localhost';(通常用默认,也有例外,可以不用修改)
5、查找 $cfg['Servers'][$i]['auth_type'] = 'config';
在自己的机子里调试用config;如果在网络上的空间用cookie,这里我们既然在前面已经添加了网址,就修改成cookie。
我个人建议:无论是本地还是网络上,都建议设置成cookie,安全第一。
同时,当auth_type这个值设置为cookie后,还有一个地方需要作出相应的修改:
$cfg['blowfish_secret'] = '';
改成:$cfg['blowfish_secret'] = 'www.blog.com;
这里的www.blog.com自己随便定义,不超过46个字符。如果这个地方留空,将会出现上文提到的第2个错误:“配置文件现在需要绝密的短语密码(blowfish_secret)”。
6、查找 $cfg['Servers'][$i]['user'] = 'root'; // MySQL user(用户名,自己机里用root;在网上一般为你的ftp用户名,虚拟主机提供商会告诉你的;一般不要修改)
7、查找 $cfg['Servers'][$i]['password'] = '123456'; // MySQL password (123456修改成连接你的MYSQL数据库的用户密码)
8、查找 $cfg['DefaultLang'] = 'zh'; (这里是选择语言,zh代表简体中文的意思) 还有 $cfg['DefaultCharset'] = 'gb2312';(修改默认编码为国标)
到这里,phpMyAdmin就已经配置完成OK;你可以打开http://localhost/phpmyadmin/访问方便快捷的图形化管理软件 phpMyAdmin了。关于本文没有提到的配置文件里的其他选项,大家可以不用关心了也不必修改。关于具体如何操作phpMyAdmin不在本文讨论的范围内,不过图形化界面,是通俗易懂,稍微看看就会用了
下面谈谈,flymorn在安装配置phpMyAdmin的过程中所遇到的3个问题。
第一个问题:“无法载入mcrypt扩展,请检查PHP配置”。
1、没有正确安装Mysql数据库,在系统服务中Mysql相关的服务没有启动。
2、在系统的 system32(C:\windows\system32) 目录下缺少 libmcrypt.dll文件,解决方法是找到php目录下的 libmcrypt.dll,并将libmcrypt.dll复制到C:\windows\system32目录中,然后重新启动Web服务。
3、在PHP目录下的php.ini文件中,没有将“;extension=php_mcrypt.dll”中的前面一个“;”去掉,所以不能使用相应功能,解决方法是打开php.ini文件,找到;extension=php_mcrypt.dll改成extension= php_mcrypt.dll //去掉前面的;使之生效
4、Mysql目录没有读取权限,正确的目录权限如下:
administrator 完全控制
system 完全控制
user 读取加运行
其他的用户权限全部删除(也可保留,但安全性不高,建议删除),然后重启MYsql服务和Web服务(建议修改此项后重启一下服务器)。
5、以上方法都不行的话,再用这个方法:桌面>我的电脑>右键属性>高级>环境变量>系统变量>新建
名:phpdir
值:C:\php(你的PHP在什么目录就是什么)
第二个问题:“配置文件现在需要绝密的短语密码(blowfish_secret)”
确保在config.default.php文件里面进行了正确的设置 :
$cfg['Servers'][$i]['auth_type']= 'cookie';
同时
$cfg['blowfish_secret'] = 'www.blog.com'; //(这个值随便写,就是不能留空)
其实这个问题,我碰到了确实很郁闷,如果按照我在上面提到的配置方法做了,应该不会提示这个错误。经过我2个多小时不停的修改config.default.php配置文件,始终提示这个错误,几乎达到了崩溃的边缘了。
然后就是灵光一现,突然发现:我把auth_type认证方式改为http,改为config时,打开页面始终出现这个错误,也就是说改变了认证模式,并没有对phpmyadmin起作用,难道是其他的配置文件在影响决定着phpmyadmin?
立马来到phpmyadmin根目录,赫然发现根目录下有一个config.sample.inc.php文件存在的同时,还有一个文件 config.inc.php也存在!!而这个是以前老版本的配置文件,原来是这个文件捣的鬼。马上删除config.inc.php,再进入调试页面,错误消失了!问题解决。
看来phpmyadmin根目录下的config.inc.php配置文件的优先级比 /libraries/config.default.php的配置文件高,系统是先调用根目录里的配置文件,然后才是libraries文件夹里的配置文件,这个问题,折腾了这么久,呜呼哀哉。总归解决了,舒一口气啊。
第三个问题:“#2003-服务器没有响应”。
遇到这个问题多半是MYSQL数据库没有启动,建议直接在在:控制面板-管理工具-服务里面把MYSQL启动。关于是否启动,你可以在任务管理器里查看是否有“mysqld-nt.exe”这样的进程,如有有,则说明mysql已经启动。
这些问题,不碰到便罢了。但是对于新手来说,比如象我,第一次碰到的话,自己查找解决方案的话一般都是到处查找,网上一大堆的方法都不适用的情况下,自己会感觉到多么的无奈了。我还是建议,遇到问题不要着急,仔细阅读文档,多参考下前辈们的解决方法,虽然不一定用,但对你会有一定的启发。多动手,多试验,没有任何问题可以难倒你,我看好你哟 ^__^
出现的问题:
Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
将php.ini中的session.auto_start的值改为1(启动),默认是0(禁用)
打开phpmyadmin出现如下错误:
Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
而且其他程序连接都正常,环境为2003 II6
在php的目录建立个文件夹tmp
在php.ini找到session.save_path 这一行,设成session.save_path = "C:/php/tmp"把分号弄掉。OK
在网上找的资料都不对头,那些人都以为是extension=php_mbstring.dll的问题!!!
<?
//很好用的PHP数据库类,三、四句代码搞定一个表的操作,无论这个表字段有多复杂。
//此类多次大量用在大型网站程序的开发上,效果特别的好。
//作者:快刀浪子++
define(\"_PHP_RECORD_\",\"exists\");
class TRecord
{
var $db;
var $rc;
var $name;
var $value;
var $num;
var $buffer; //查询结果 调用方法 $buffer[$i][\"fields\"];
var $seekstr; //保存查询条件用
function TRecord($host=\"localhost\",$user=\"root\",$passwd=\"\")
{global $HTTP_POST_VARS;
$this->num=0;
$this->host=$host;
$this->user=$user;
$this->passwd=$passwd;
if(($this->db=mysql_connect($host,$user,$passwd))==false)
exit(\"联结数据库出错!\");
while(list($this->name[$this->num],$this->value[$this->num])=each($HTTP_POST_VARS))
{$this->num++;
}
//////////////
for($i=0;$i<$this->num;$i++)
{$this->value[$i]=$this->SafeString($this->value[$i]);
}
//
}
function SafeString($message)
{$message=str_replace(\" \",\" \",$message);
$message=str_replace(\"<\",\"<\",$message);
$message=str_replace(\">\",\">\",$message);
//$message=str_replace(\"|\",\"|\",$message);
//$message=str_replace(\"\\"\",\""\",$message);
//$message=nl2br($message);
return $message;
}
//////
function reset()
{$this->num=0;
$this->name=array();
$this->value=array();
}
function add($name,$values)
{$this->name[$this->num]=$name;
$this->value[$this->num]=$values;
$this->num++;
}
function unadd($name)
{$j=0;
for($i=0;$i<$this->num;$i++)
{if($this->name[$i]!=$name)
{$aaa[$j]=$this->name[$i];
$bbb[$j]=$this->value[$i];
$j++;
}
}
$this->name=$aaa;
$this->value=$bbb;
$this->num=$j;
}
function InsertRecord($database,$table)
{mysql_select_db($database);
if($this->num==0)
exit(\"没有定义变量!\");
$field=implode(\",\",$this->name);
for($i=0;$i<$this->num;$i++)
{if(is_string($this->value[$i]))
$ls[$i]=\"\'\".$this->value[$i].\"\'\";
else
$ls[$i]=$this->value[$i];
$value=implode(\",\",$ls);
}
$sql=sprintf(\"insert into %s(%s) values(%s)\",$table,$field,$value);
if(mysql_query($sql,$this->db)==false)
{echo \"写数据到数据库时出错:\".$sql;
exit();
}
}
function SelectRecord($database,$table) //返回记录数,结果在缓冲区中
{mysql_select_db($database);
if($this->num==0)
$sql=sprintf(\"select * from %s\",$table);
else
{
for($i=0;$i<$this->num;$i++)
{if(is_string($this->value[$i]))
$ls[$i]=\"\'\".$this->value[$i].\"\'\";
else
$ls[$i]=$this->value[$i];
$str[$i]=sprintf(\"%s=%s\",$this->name[$i],$ls[$i]);
}
$string=implode(\" and \",$str);
$this->seekstr=$string;
$sql=sprintf(\"select * from %s where %s\",$table,$string);
}
if(($rc=mysql_query($sql,$this->db))==false)
{echo \"查询数据库时出错:\".$sql;
exit();
}
$i=0;
while($this->buffer[$i]=mysql_fetch_array($rc))
{
$i++;
}
mysql_free_result($rc);
return $i;
}
function UpdateRecord($database,$table,$limitstr)
{mysql_select_db($database);
if($this->num==0)
exit(\"没有定义变量!\");
for($i=0;$i<$this->num;$i++)
{if(is_string($this->value[$i]))
$ls[$i]=\"\'\".$this->value[$i].\"\'\";
else
$ls[$i]=$this->value[$i];
$upstr[$i]=$this->name[$i].\"=\".$ls[$i];
}
$str=implode(\",\",$upstr);
$sql=sprintf(\"update %s set %s where %s\",$table,$str,$limitstr);
if(mysql_query($sql,$this->db)==false)
{echo \"修改数据时出错:\".$sql;
exit();
}
}
function addtip($database,$table,$fileds,$limitstr=\"\")
{//必须为整型字段
mysql_select_db($database);
if($limitstr!=\"\")
$sql=sprintf(\"update %s set %s=%s+1 where %s\",$table,$fileds,$fileds,$limitstr);
else
$sql=sprintf(\"update %s set %s=%s+1\",$table,$fileds,$fileds);
if(mysql_query($sql,$this->db)==false)
{echo \"修改数据时出错:\".$sql;
exit();
}
}
function unaddtip($database,$table,$fileds,$limitstr=\"\")
{
mysql_select_db($database);
if($limitstr!=\"\")
$sql=sprintf(\"update %s set %s=%s-1 where %s\",$table,$fileds,$fileds,$limitstr);
else
$sql=sprintf(\"update %s set %s=%s-1\",$table,$fileds,$fileds);
if(mysql_query($sql,$this->db)==false)
{echo \"修改数据时出错:\".$sql;
exit();
}
}
function isempty($var,$china)
{if(trim($var)==\"\")
{
$reason=\"没有录入“\".$china.\"”!\";
exit($reason);
}
}
function GetResult()
{return $this->buffer;
}
function close()
{
mysql_close($this->db);
}
}
?>