Emlog调用附件第一张图片和正文第一张图片的方法 emlog
现在制作主题,喜欢在首页放上图片展示或图文形式,在emlog主题制作中要如何才能实现这种效果?
下面介绍了几种常用的方法,抛砖引玉,大家一起共同探导一下。
1、直接读取附件图片
原理:这种方法就是直接判断附件的类型,并获取第一张图片的信息;如果没有图片附件,则显示默认图片或随机图片。
方法:先将获取附件图片的方法定义成一个函数,放在模板文件module.php中(代码如下),位置随便。
<?php //获取文章缩略图,先是自定义指定,然后是查找附件图片,最后是随机图片 function mrxn_fjimg($logid){ $db = MySql::getInstance(); $thum_pic = EMLOG_ROOT.'/thumpic/'.$logid.'.jpg'; if (is_file($thum_pic)) { $thum_url = BLOG_URL.'thumpic/'.$logid.'.jpg'; }else{ $sqlimg = "SELECT * FROM ".DB_PREFIX."attachment WHERE blogid=".$logid." AND (`filepath` LIKE '%jpg' OR `filepath` LIKE '%gif' OR `filepath` LIKE '%png') ORDER BY `aid` ASC LIMIT 0,1"; // die($sql); $img = $db->query($sqlimg); while($roww = $db->fetch_array($img)){ $thum_url=BLOG_URL.substr($roww['filepath'],3,strlen($roww['filepath'])); }if (empty($thum_url)) { srand((double)microtime()*1000000); $randval = rand(0,9); $thum_url = BLOG_URL.'content/templates/mrxn/images/mrxn_net/'.$randval.'.jpg';} //随机图片路径 }echo $thum_url;} ?>
然后在你需要的地方,emlog一般是在log_list.php(当然也可以在你自己的文件)相应的地方插入下面代码:
<img src="<?php mrxn_fjimg($value['logid']); ?>" >
优缺点:优点:上传图片无论是否插入了正文,都可以读取第一张显示。
缺点:一是只能读取上传的第一张图片。
2.读取正文的第一张图片
原理:直接从正文代码——包括注释代码——中获取第一张图片的信息;如果正文中没有图片,则显示默认图片或者随机图片。
方法:先将获取附件图片的方法定义成一个函数,放在模板文件module.php中(代码如下),位置随便。
<?php //获取文章中第一张图片,如果没有就调用随机图片 function mrxn_zwimg($str){ preg_match_all("/\<img.*?src\=\"(.*?)\"[^>]*>/i", $str, $match); if(!empty($match[1])){echo $match[1][0];}else{ echo TEMPLATE_URL . 'images/mrxn_net_wzimg/'.rand(1,20).'.jpg'; //随机图片路径及图片命名1.jpg……20.jpg }} ?> 在你需要的地方,emlog一般是在log_list.php(当然也可以在你自己的文件)相应的地方插入下面代码: <img src="<?php mrxn_zwimg($value['content']); ?>"
以下代码为调用正文第一张图片,没有图片则自定义,也可以空白,直接放在你要log_list.php对应位置即可。
<?php $imgsrc = preg_match_all("|<img[^>]+src=\"([^>\"]+)\"?[^>]*>|is", $value['content'], $img);$imgsrc = !empty($img[1]) ? $img[1][0] : ''; ?><?php if($imgsrc): ?><img src="<?php echo $imgsrc; ?>"><?php else: ?><img src="<?php echo TEMPLATE_URL;?>images/news.jpg" alt="暂无图片" /><?php endif; ?>
VB程序的破解思路总结、编译方式vs破解工具 比较(确实不错) 破解软件
WARNING:
此文章非常长,如果你感兴趣但是没耐心看完,可以做个标记然后按浏览器的关闭按钮,等到下次有兴趣了再看。这里我尽量多和详细地解释了VB程序的破解(其
实也可看到反破解)的相关东西,把一个简单的VB计时器程序研究透了,对于VB破解应有较大帮助,如果觉得无用的不要喷,谢谢!可能包含错误认识,如有错
误欢迎指出。
VB程序也是一个非常有趣的东西,你去看VB的主程序,是用Microsoft Visual C++
5.0编写的,也就是说,其实里面调用的各种命令和控件,都是一段VC++的代码。还有VB运行时必须的“库”(虚拟机):msvbvm50,
msvbvm60, 都是Microsoft Visual C++
DLL,所以非常明显的,只要研究透了VB的这个VM虚拟机DLL,完全可以反编译出P-code的程序的源码。著名的程序就有比如VB
Decompiler,它对于P-code的效果大家可以在下面的分析中看得出来,当然它对于编译成Native
Code的程序效果也不错,只不过名称什么的都不太清楚。所以说,VB的P-code程序(其实Native
Code程序也差不了多少,只不过虚拟机里的代码一部分都插入了程序里而已)和Flash的SWF还是有异曲同工之妙的:都可以反编译(可能可以得到源
码),原因都在于它们用了比较“通用”的虚拟机。vb的就是vbvmXX.dll,flash的就是Flash Player XX。
为了更好地研究VB程序的破解,我特意使用了一个小程序来做演示。
另外,由于正向和逆向是有联系的,所以我这里写正向的时候可以类推到逆向,写逆向的时候可以类推到正向。
这个程序是某个同学给我的,听说我学破解,就想让我来看看他的程序编译到底是编译成P-code好还是编译成native code好,如果编译成native code又要不要优化一下呢?
我打算顺便骗到源码,但是居然不给我!不过他倒是送我一对注册名和注册码。拿到程序一看关于窗口还写着“演示版”,不就是传说中的Demo吗!算了,不管这些细节了。
我拿到的程序有以下几个:Timer_nc_speed.exe(256KB)[Native-Code并进行代码速度优化]、Timer_p-
code.exe(80KB)[P-code程序]、Timer_nc_length.exe(240KB)[Native-Code并进行代码长度优
化]、Timer_nc_none.exe(240KB)[Native-code无优化]。可以看到,P-code程序非常小,但是它运行必须要VB的
VM DLL。
首先来看看这个程序是如何进行授权及验证的:
打开后主窗口:
上面有一个注册按钮正好遮掉计时器的“分”的十位(也就是说你计时不能超过10分钟,否则你自己都不知道过了多久),然后会过随机的时间跳出“请尽快注
册”的窗口,输入了注册码之后会提示“注册码已存储,请立即重启程序,如果正确下次将不再有限制。”看来是纯重启验证类型的。不过貌似还有个突破点,就是
按“倒”按钮(即倒计时)会提示“未注册版本不支持倒计时,是否立即注册?y/n”。也许可以从这个对话框入手哦!
另外,这个软件还有个版本更新历史(我去,都更新到构造23了),里面有一句话引起我的注意:
更改 VB 内部 MSGBOX 成为 user32.dll 的 API 里的 "MessageBoxA".
额,这么说,所有对话框在入口点前的API表(后面会提到)里下断点都是无效的了。
现在,拿出几个神器(网上有提到的): SMARTCHECK,WKTVBDebugger,VB Decompiler。当然OD也用来看看效果。
首先是P-code程序载入OD:入口点的特征就是push XXXXXXXX,Call XXXXXXXX。入口点上方是各种VB虚拟机DLL里面的API,下面就是各种OD识别不出的东西。(不是汇编代码当然识别不出啦)
然后是Native-code程序载入OD:其实做各种优化的都差不多,首先入口点特征与P-code的差不多,上方也是一张表(不过好像更大?),下方也有一段数据,但是再往下拉会发现:
00408C60 > \55 push ebp 00408C61 . 8BEC mov ebp,esp 00408C63 . 83EC 18 sub esp,18 00408C66 . 68 26314000 push <jmp.&MSVBVM60.__vbaExceptHandler> ; SE 句柄安装 00408C6B . 64:A1 0000000>mov eax,dword ptr fs:[0] 00408C71 . 50 push eax 00408C72 . 64:8925 00000>mov dword ptr fs:[0],esp 00408C79 . B8 D0010000 mov eax,1D0 00408C7E . E8 9DA4FFFF call <jmp.&MSVBVM60.__vbaChkstk> 00408C83 . 53 push ebx 00408C84 . 56 push esi 00408C85 . 57 push edi 00408C86 . 8965 E8 mov dword ptr ss:[ebp-18],esp 00408C89 . C745 EC B8114>mov dword ptr ss:[ebp-14],Timer_nc.0040> 00408C90 . 8B45 08 mov eax,dword ptr ss:[ebp+8] 00408C93 . 83E0 01 and eax,1 00408C96 . 8945 F0 mov dword ptr ss:[ebp-10],eax 00408C99 . 8B4D 08 mov ecx,dword ptr ss:[ebp+8] 00408C9C . 83E1 FE and ecx,FFFFFFFE
这不是我们熟悉的汇编代码了嘛呵呵。
所以说,到目前为止,P-code的防破解作用远远大于Native-code的。
<破解思路1>在API上面下断点跟踪......
这个对于P-code程序是完全无效的了,但是对于Native Code的可以一试。
首先,以他的水平来说,比较注册码肯定是明码比较,但是我没那么无聊去做内存 ,来爆破试试看。
打开Timer_nc_XXX.exe,在入口点前面的大表这里下断:
004032E2 $- FF25 B0104000 jmp dword ptr ds:[<&MSVBVM60.__vbaStrCmp>] ; MSVBVM60.__vbaStrCmp运行程序,第一次断下先放行,结果窗口就出来了,说明第一次断下就已经到了关键.
重载程序,断下后F8,来到这里:
734793DA > FF7424 08 push dword ptr ss:[esp+8] 734793DE FF7424 08 push dword ptr ss:[esp+8] 734793E2 6A 00 push 0 734793E4 E8 44E6FFFF call MSVBVM60.__vbaStrComp 734793E9 C2 0800 retn 8 再按Alt+F9来到这里:00414BAE . 50 push eax 00414BAF . 68 78734000 push Timer_nc.00407378 00414BB4 . E8 29E7FEFF call <jmp.&MSVBVM60.__vbaStrCmp> 00414BB9 . F7D8 neg eax ; here 00414BBB . 1BC0 sbb eax,eax 00414BBD . F7D8 neg eax 00414BBF . F7D8 neg eax 这里已经是程序的代码段了,可以更改代码了,继续跟踪看看。00414BC1 . 66:8985 68FEF>mov word ptr ss:[ebp-198],ax 00414BC8 . 8D4D D8 lea ecx,dword ptr ss:[ebp-28] 00414BCB . E8 60E7FEFF call <jmp.&MSVBVM60.__vbaFreeStr> 00414BD0 . 8D4D B4 lea ecx,dword ptr ss:[ebp-4C] 00414BD3 . E8 B6E6FEFF call <jmp.&MSVBVM60.__vbaFreeVar> 00414BD8 . 0FBF85 68FEFF>movsx eax,word ptr ss:[ebp-198] 00414BDF . 85C0 test eax,eax 00414BE1 . 0F84 E60B0000 je Timer_nc.004157CD ;这里跳了 00414BE7 . C745 FC 1F000>mov dword ptr ss:[ebp-4],1F 00414BEE . 66:8365 DC 00 and word ptr ss:[ebp-24],0 00414BF3 . C745 FC 20000>mov dword ptr ss:[ebp-4],20 00414BFA . 68 7C744000 push Timer_nc.0040747C ; UNICODE "Timer_Regcode.inf" 00414BFF . 6A 01 push 1 00414C01 . 6A FF push -1可以看到,00414BE1这里跳转跳了,但是应该是不要跳的,因为下面的代码才开始读取注册码. 于是NOP。00414C03 . 6A 01 push 1 00414C05 . E8 78E6FEFF call <jmp.&MSVBVM60.__vbaFileOpen> 00414C0A > C745 FC 21000>mov dword ptr ss:[ebp-4],21 00414C11 . 6A 01 push 1 00414C13 . E8 64E6FEFF call <jmp.&MSVBVM60.#571> 00414C18 . 0FBFC0 movsx eax,ax 00414C1B . 85C0 test eax,eax 00414C1D . 0F85 8E000000 jnz Timer_nc.00414CB1 00414C23 . C745 FC 22000>mov dword ptr ss:[ebp-4],22但是接下来问题也随之出现,就是说这个文件不存在,却要被打开(00414C05处),会出现异常的,所以这句代码也得NOP。不过这个程序令我惊讶的 是,居然自带了异常处理程序!现在不能观摩,否则异常不断产生会导致程序卡死,先要把所有异常都处理好,不过那时候也不能再观摩了.
所以还要NOP:
00414C05 . E8 78E6FEFF call <jmp.&MSVBVM60.__vbaFileOpen> 00414C13 . E8 64E6FEFF call <jmp.&MSVBVM60.#571>另外,为了不浪费程序的感情不断读取文件,我们把00414C1D的jnz改为jmp跳过读取阶段. 然后就到了这里:
00414CB1 > \C745 FC 2B000>mov dword ptr ss:[ebp-4],2B 00414CB8 . 6A 01 push 1 00414CBA . E8 ABE5FEFF call <jmp.&MSVBVM60.__vbaFileClose> 00414CBF . C745 FC 2C000>mov dword ptr ss:[ebp-4],2C 00414CC6 . C785 ECFEFFFF>mov dword ptr ss:[ebp-114],Timer_nc.004> 00414CD0 . C785 E4FEFFFF>mov dword ptr ss:[ebp-11C],8008 00414CDA . C785 DCFEFFFF>mov dword ptr ss:[ebp-124],Timer_nc.004> 00414CE4 . C785 D4FEFFFF>mov dword ptr ss:[ebp-12C],8008 00414CEE . 8B45 08 mov eax,dword ptr ss:[ebp+8] 00414CF1 . 05 A4000000 add eax,0A4 00414CF6 . 50 push eax 00414CF7 . 8D85 E4FEFFFF lea eax,dword ptr ss:[ebp-11C] 00414CFD . 50 push eax 00414CFE . 8D45 B4 lea eax,dword ptr ss:[ebp-4C] 00414D01 . 50 push eax 00414D02 . E8 57E5FEFF call <jmp.&MSVBVM60.__vbaVarCmpNe> 00414D07 . 50 push eax 00414D08 . 8B45 08 mov eax,dword ptr ss:[ebp+8] 00414D0B . 05 B4000000 add eax,0B4 00414D10 . 50 push eax 00414D11 . 8D85 D4FEFFFF lea eax,dword ptr ss:[ebp-12C] 00414D17 . 50 push eax 00414D18 . 8D45 A4 lea eax,dword ptr ss:[ebp-5C] 00414D1B . 50 push eax 00414D1C . E8 3DE5FEFF call <jmp.&MSVBVM60.__vbaVarCmpNe> 00414D21 . 50 push eax 00414D22 . 8D45 94 lea eax,dword ptr ss:[ebp-6C] 00414D25 . 50 push eax 00414D26 . E8 39E5FEFF call <jmp.&MSVBVM60.__vbaVarOr> 00414D2B . 50 push eax 00414D2C . E8 6FE5FEFF call <jmp.&MSVBVM60.__vbaBoolVarNull> 00414D31 . 0FBFC0 movsx eax,ax 00414D34 . 85C0 test eax,eax 00414D36 . 0F84 6D090000 je Timer_nc.004156A9文章太长了,文档和软件下载:
软件下载:链接:http://pan.baidu.com/s/1eQARBME 密码:f28c
文档:http://pan.baidu.com/s/1hqERqVM 备用连接:链接:http://pan.baidu.com/s/1hqIpg9Y 密码:4p8u
注:原文出自吾爱,我觉得写的很好故转载,一边日后学习研究使用.如有问题,请联系我.admin#mrxn.net
修改emlog后台登录路径的方法 emlog
emlog后台登录地址的目录名称默认为admin,并且官方没有提供自定义后台登录入口名字的功能,这多少让我们觉得有些不安全,毕竟暴露一个网站的后台不是一件安全的事,今天就给您说下修改方法,增加一下网站的安全性。
虽然我们进入后台的地址是/admin,但其实真实的地址还是/admin/index.php。那么就先从这个文件开始下手,打开这/admin
/index.php这个文件后,看到第7行require_once
'globals.php';这一句,也就是说在index.php运行之前会先加载globals.php这个文件,由文件路径可以看出这个文件是处于
当前文件夹中,找到并打开它。发现它又加载了一文件,是根目录的init.php。先不管它,先来看下面的,第9行
define('TEMPLATE_PATH', EMLOG_ROOT.'/admin/views/');
定义了一个后台模板路径的常量,这个路径经过登录接口目录,所以我们把它修改成你想要的名称,比如修改成我的ID,即
define('TEMPLATE_PATH', EMLOG_ROOT.'/mrxn/views/');
现在先不预览,因为可能还有没有修改的地方,免得会报错。继续往下看。
登录验证,没什么问题。退出,这个让我想到了平时点退出的时候,地址是/admin?action=logout,这里可以看到,它是在admin上加了一个logout的动作,所以我仔细看了一下它,但是没看出可以修改的地方。
那么我们开始看刚才引入的那个文件:init.php。打开这个文件。
由这个文件开头的注释:全局项加载,我们了解到,从现在开始,要开始大规模加载东西了,我想,如果下面还有需要修改的地方的,那修改会变得很麻烦,所以我
就此先打住,先测试一下,以现在的修改,有没有成功的可能性。我先是把后台登录的文件夹名称改成admin1,然后打开浏览器输入
http://localhost/admin1,打开后台入口,没有任何错误,接着输入账号密码登录,没有报错,我试着进行了各项操作,包括写日志等
等,没有出现异常,也就是说后台登录入口的修改至此成功。
总结一下,其实就两步:
1、修改根目录下admin的名称
2、admin/globals.php这个文件的第9行后面admin/views/中的admin改成你要的名称。
3、千万不要用记事本来修改核心文件,否则后果很严重。
修改Emlog后台默认列表显示条数
在include/model/log_model.php文件中找到
$limit = "LIMIT $start_limit, " . $perpage_num;
大概在147行的样子,改为
$limit = "LIMIT $start_limit, " . 1000;
其中1000表示现在所显示的条数
emlog文章浏览数在规定的时间内算一次修改方法 emlog
文章浏览数在规定的时间内算一次修改方法(感谢EM开发QQ群@土著人宁巴)
找到include/controller/log_controller.php 大概102中
$Log_Model->updateViewCount($logid);
改为(其中86400为时间,单位为秒)就可以搞定了。
if(time()-intval($COOKIE['viewtime'.$logid])>86400){
$LogModel->updateViewCount($logid);
setcookie('viewtime'.$logid,time());
}
另外附上按点击数排列文章的方法
找到include/controller/log_controller.php 大概19中
$sqlSegment ='ORDER BY top DESC ,date DESC';
top改为views即可。。
本人把方法分享给大家,希望对大家所帮助。
让MySQL缺失的ID值自动恢复增长和补全缺失的ID 代码人生
话说,百度知道很强大,自己很弱小呀......才疏学浅.
如下图所示:
想要 cate_id 字段的值 从1开始往下增长 1 2 3 4 5 6 7 8 ....,而不是2 3 4 5 6 7 8 ....
一共有3种修复方法:
第一种手先动修复成1 2 3 4 5 6 7
操作MySQL:输入ALTER TABLE tdb_goods_cates AUTO_INCREMENT = 8
这样往后的资料会从8开始(对于数据量小的可以这么做)
第二种重置表方法
首先--no-create-info,-t仅输出资料
然后把表tdb_goods_cates所有资料使用delete tdb_goods_cates删除
然后输入ALTER TABLE tdb_goods_cates AUTO_INCREMENT = 1
再把输出资料的.sql文件导入就可以了
第三种mysql语法(推荐使用)
UPDATE tdb_goods_cates set cate_id = cate_id-1
然后输入ALTER TABLE tdb_goods_cates AUTO_INCREMENT = 8
这样就可以解决这个问题了.话说,百度知道很强大,自己很弱小呀......才疏学浅.
css自适应宽度滑动门菜单 PHP
html css width 自适应
什么是CSS自适应宽度滑动门菜单?
CSS自适应宽度菜单指菜单的宽度可以随着内容的增加而变宽,就拿下边的实例来说,是按4个字的宽度来设计的,如果其中一项为5个字或更多,就放不下了。那么我们就需要让它的宽度可以随着内容的增减而变化,这就是css自适应宽度菜单。
自适应宽度按钮的效果是怎样的呢?
那么,自适应宽度按钮,是怎么实现的呢?
要想实现自适应宽度,需要在文字上增加一个辅助标签,如span,分别在a上和span上设置背景,一个左侧对齐,一个右侧对齐
绿色部分为span,然后定义它的背景图片靠右侧对齐,而左侧的部分为a的背景图片,定义靠左侧对齐。当文字多时,会把span撑开,这实现了自适应宽度的按钮了。这里需要一张如下的图片,它的宽度要宽于你所应用的最宽宽度,这样才能显示正常,同时根据以前学习的css Sprites技术,把背景图片和鼠标经过图片放到一张图片上。
EMLOG实现图片防盗链的方法(伪静态实现) emlog
用于防范emlog附件图片被其它网站盗链,本代码来源于em论坛,由qiukong编辑撰写,测试可正常运行,现再次分享给大伙,代码如下:
RewriteEngine on RewriteBase /content RewriteCond %{HTTP_REFERER} !^$ [NC] RewriteCond %{HTTP_REFERER} !mrxn.net [NC] RewriteCond %{HTTP_REFERER} !so.com [NC] RewriteCond %{HTTP_REFERER} !soso.com [NC] RewriteCond %{HTTP_REFERER} !sogou.com [NC] RewriteCond %{HTTP_REFERER} !baidu.com [NC] RewriteCond %{HTTP_REFERER} !bing.com [NC] RewriteCond %{HTTP_REFERER} !google.com [NC] RewriteRule .*\.(jpg|jpeg|png|bmp|gif)$ https://mrxn.net/daotu.gif [R,NC,L]
在你的主机根目录新建文件.htaccess,加入上面的内容。(如果开启了伪静态已经有.htaccess,就把2~4行粘贴到</ifmodule>前面即可)
然后代码要进行一些修改,其中“mrxn.net”改为你的网站域名,“https://mrxn.net/daotu.gif”改成盗链网站显示的图片。
该代码可防止content目录一切图片被盗链,如模板、附件等等。当然,你也可以增加可以使用图片的站,比如,你增加一个emlog.net 就是论坛.
RewriteCond %{HTTP_REFERER} !emlog.net [NC] 即可让图片在emlog论坛正确显示.
Emlog实现最新头条文章标题加摘要显示代码 emlog
最新置顶头条文章标题加摘要显示的效果,把以下代码复制到module.php里面,如需调用分类置顶文章请把top='y'改为sortop='y'即可
<?php //首页置顶头条,不带图片 function sheli_zdLog() { $db = MySql::getInstance(); $sql = "SELECT gid,title,content,date FROM ".DB_PREFIX."blog WHERE type='blog' and top='y' ORDER BY `top` DESC ,`date` DESC LIMIT 0,1"; $list = $db->query($sql); while($row = $db->fetch_array($list)){ //$row['content'] = htmlspecialchars($row['content']); $row['content'] = strip_tags($row['content']);?> <h1><a href="<?php echo Url::log($row['gid']); ?>" title="<?php echo $row['title']; ?>" target="_blank"><?php echo $row['title']; ?></a></h1> <span class="note"><?php echo mb_substr($row['content'],0,85,'utf-8'); ?>...</span><a href="<?php echo Url::log($row['gid']); ?>" target="_blank">阅读全文>></a> <?php } ?> <?php } ?>
如果需要带图片请使用下面代码放入module.php中,如需调用首页置顶文章请把sortop='y'改为top='y'即可
<?php //分类置顶头条,带图片 function sheli_zdLog(){ $db = MySql::getInstance(); $sql = $db->query ("SELECT * FROM ".DB_PREFIX."blog inner join ".DB_PREFIX."sort WHERE hide='n' AND type='blog' AND sortop='y' AND sortid=sid order by date DESC limit 0,5"); while($row = $db->fetch_array($sql)){ if (!empty($row['excerpt'])){ preg_match_all("/\<img.*?src\=\"(.*?)\"[^>]*>/i", $row['excerpt'], $match); if(empty($match[0][0])) { preg_match_all("/\<img.*?src\=\"(.*?)\"[^>]*>/i", $row['content'], $match); } }else{ preg_match_all("/\<img.*?src\=\"(.*?)\"[^>]*>/i", $row['content'], $match); } $logpost = !empty($row['excerpt']) ? $row['excerpt'] : ''.$row['content'].''; $num = rand(1,3); $img = isset($match[0][0]) ? $match[0][0] : '<img src="'.TEMPLATE_URL.'images/shuyong_net/'.$num.'.jpg">'; $date = gmdate('Y年m月d日', $row['date']); $content = strip_tags($logpost,''); $content = mb_substr($content,0,250,'utf-8');$comment = ($row['comnum'] != 0) ? '被吐槽<span>'.$row['comnum'].'</span>次' : '暂无吐槽'; $gid = $row['gid']; $tag = $db -> query("SELECT * FROM ".DB_PREFIX."tag WHERE gid LIKE '%,$gid,%'"); $out .=' <div class="flash_img2"> <div class="hdp_img"><a href="'.Url::log($row['gid']).'" title="'.$row['title'].'" >'.$img.'</a></div> <div class="hdp"><h4><a href="'.Url::log($row['gid']).'" title="'.$row['title'].'">'.$row['title'].'</a></h4> <h5>日期:'.$date.' 分类:<a href="'.Url::sort($row['sortid']).'" title="查看 '.$row['sortname'].' 中的全部文章" rel="category tag">'.$row['sortname'].'</a> 共被围观 '.$row['views'].' 次 '.$comment.'</h5> <h6>'.$content.'...</h6></div></div> '; } echo $out; }?>
以上未提供css代码,请自行折腾
在 WampServer 上手工安装 PHP 的多个版本 PHP
手工安装新版本的PHP,只需以下步骤:
下载要安装的PHP版本。既然是用WampServer,那当然是下载Window版本的ZIP包啦:http://windows.php.net。解压到 Wamp的安装目录in\php\php5.2.17。这里以5.2.17为例。
进入 Wamp的安装目录in\php\php5.2.17 目录,从 php.ini-dist 或者 php.ini-recommended 复制一份,重命名为php.ini,适应修改php.ini配置(如extension_dir),再从php.ini复制一分,重命名为 phpForApache.ini。
从已有的版本目录中复制一份 wampserver.conf。比如我安装WampServer的时候已经有php5.3.0,在 Wamp的安装目录in\php\php5.3.0 目录下复制 wampserver.conf 到 Wamp的安装目录in\php\php5.2.17。
修改Wamp配置文件:进入 Wamp的安装目录,用IDE或记事本(最好使用行号定位的记事本,如EditPlus等)打开 wampmanager.ini,定位到 335 行,通常在这一行就是[phpVersion],如果不是,则在附近找找。复制下面一行:
Type: item; Caption: "5.3.0"; Action: multi; Actions:switchPhp5.3.0
插入到这一行前面,并修改为
Type: item; Caption: "5.2.17"; Action: multi; Actions:switchPhp5.2.17
再复制
[switchPhp5.3.0]
Action: service; Service: wampapache; ServiceAction: stop; Flags: ignoreerrors waituntilterminated
Action: run; FileName: "Wamp的安装目录/bin/php/php5.3.0/php-win.exe";Parameters: "switchPhpVersion.php 5.3.0";WorkingDir: "Wamp的安装目录/scripts"; Flags: waituntilterminated
Action: run; FileName: "Wamp的安装目录/bin/php/php5.3.0/php-win.exe";Parameters: "-c . refresh.php";WorkingDir: "Wamp的安装目录/scripts"; Flags: waituntilterminated
Action: run; FileName: "net"; Parameters: "start wampapache"; ShowCmd: hidden; Flags: waituntilterminated
Action: resetservices
Action: readconfig;
插入这一段之前,并修改为
[switchPhp5.2.17]
Action: service; Service: wampapache; ServiceAction: stop; Flags: ignoreerrors waituntilterminated
Action: run; FileName: "Wamp的安装目录/bin/php/php5.3.0/php-win.exe";Parameters: "switchPhpVersion.php 5.2.17";WorkingDir: "Wamp的安装目录/scripts"; Flags: waituntilterminated
Action: run; FileName: "Wamp的安装目录/bin/php/php5.3.0/php-win.exe";Parameters: "-c . refresh.php";WorkingDir: "Wamp的安装目录/scripts"; Flags: waituntilterminated
Action: run; FileName: "net"; Parameters: "start wampapache"; ShowCmd: hidden; Flags: waituntilterminated
Action: resetservices
Action: readconfig;
退出WampServer,再重启。完成。
通过这5步,即可完成PHP任意版本的安装。
Emlog按天数时间调用热门文章列表 emlog
Emlog按天数时间调用随机热门文章列表
把以下代码复制到模板目录下的module.php里面,其中30*24*60*60中的30为天数,可自行修改
<?php //30天按点击率排行文章 function sheli_hotlog($log_num) { $db = MySql::getInstance(); $time = time(); $sql = "SELECT gid,title FROM ".DB_PREFIX."blog WHERE type='blog' AND date > $time - 30*24*60*60 ORDER BY `views` DESC LIMIT 0,$log_num"; $list = $db->query($sql); while($row = $db->fetch_array($list)){ ?> <li><a href="<?php echo Url::log($row['gid']); ?>" title="<?php echo $row['title']; ?>"><?php echo $row['title']; ?></a></li> <?php } ?> <?php } ?>
在需要的调用的地方输入<?php sheli_hotlog(10);?>调用,其中10为调用的数量。