看到一些网站的图片都是左上和右下都有水印,于是就想到修改discuz生成水印的函数来实现,具体操作步骤如下:
先打开include/image.class.php,修改水印位置相关的内容:
switch($watermarkstatus) {
case 1:
$x = +5;
$y = +5;
break;
case 2:
$x = ($img_w - $logo_w) / 2;
$y = +5;
break;
case 3:
$x = $img_w - $logo_w - 5;
$y = +5;
break;
case 4:
$x = +5;
$y = ($img_h - $logo_h) / 2;
break;
case 5:
$x = ($img_w - $logo_w) / 2;
$y = ($img_h - $logo_h) / 2;
break;
case 6:
$x = $img_w - $logo_w;
$y = ($img_h - $logo_h) / 2;
break;
case 7:
$x = +5;
$y = $img_h - $logo_h - 5;
break;
case 8:
$x = ($img_w - $logo_w) / 2;
$y = $img_h - $logo_h - 5;
break;
case 9:
$x = $img_w - $logo_w - 5;
$y = $img_h - $logo_h - 5;
break;
case 10://10为左上+右下双水印,这里是新增的
$x1 = +5;
$y1 = +5;
$x2 = $img_w - $logo_w - 5;
$y2 = $img_h - $logo_h - 5;
break;
} |
还有
if($watermarktype == 1) { ($watermarkstatus==10){//判断是否是双水印 @imageCopy($dst_photo, $watermark_logo, $x1, $y1, 0, 0, $logo_w, $logo_h); @imageCopy($dst_photo, $watermark_logo, $x2, $y2, 0, 0, $logo_w, $logo_h); } else{ @imageCopy($dst_photo, $watermark_logo, $x, $y, 0, 0, $logo_w, $logo_h); } } |
最后打开admin/setting.inc.php找到showsetting(‘settings_attach_image_watermarkstatus’,后面增加一行:
<input class="radio" type="radio" name="settingsnew[watermarkstatus]" value="10" '.$checkwm[10].'> #10 双水印 |
这样就可以再后台附件设置里看到。
BACKUP LOG db_name WITH NO_LOG --截断事务日志db_name是数据库名 GO DBCC SHRINKFILE(db_log) --收缩日志文件 ,db_log是日志名 GO |
最近公司网站访问速度老慢了,以为是网速和带宽的问题,后来无意中查看发现数据库日志文件达到快7g的大小,所以就去google搜压缩日志的方法,以上语句经过本地和远程测试都相当管用,压缩后的日志大小不到1m,网站访问速度明显改善,WIN2003+SQLSERVER2005下测试。
由于公司的项目都是用sql server 2005来开发的,所以最近的php项目为求简便都用了adodb库来操作数据库,鉴于有很多Ajax应用,所以所有编码都统一使用UTF8,连接数据库代码如下:
$db = &NewADOConnection('mssql'); $db->debug = 0; $ADODB_FETCH_MODE = ADODB_FETCH_BOTH; $db->Connect($db_host, $db_user, $db_pass, $db_name) or die("Connect database failed"); |
但实际使用中发现mssql读取数据无法设置字符集和编码,最后把所有adodb的驱动库搜索了一遍发现了2个解决方案,第一个方案是使用ado_mssql来连接数据库,这样就可以支持charPage参数了,连接数据库代码如下:
$db = &ADONewConnection('ado_mssql');//这里将mssql改成ado_mssql $ADODB_FETCH_MODE = ADODB_FETCH_BOTH; $db->charPage=CP_UTF8;//这里是关键 $myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};SERVER=$db_host;DATABASE=$db_name;UID=$db_user;PWD=$db_pass;"; $db->Connect($myDSN) or die("Connect database failed"); |
第二个方法是安装SQL Server Driver for PHP,早就知道微软除了这个驱动,一直么有尝试,这次在adodb类库里看到有mssqlnative的驱动,发现备注里说明要用到SQL Server Driver for PHP,下载地址:http://www.microsoft.com/Sqlserver/2005/en/us/php-driver.aspx。
这是微软提供一套操作mssql2005/2008的PHP函数库,要使用这套操作函数库请保证PHP版本在5.2以上,下载解压后会看到dll文件,根据自己的php版本及环境来选择正确的dll文件放到php/ext/下, 更多说明请参考文档。 然后在php.ini中添加一行“extension=xxx.dll”,重启IIS后phpinfo()如果现实有“sqlsrv”扩展就说明安装成功了。Unix下安装请参照:http://phpbuilder.com/columns/alberto20000919.php3。
接下来就可以使用新的驱动来操作数据库了,文档里有详细的操作方法,可以研究一下,总之就是操作数据库可以设置”CharacterSet” = “UTF-8″了,这里根据网上的方法把adodb库做简单的修改就可以了,adodb已经封装了大部分的操作方法,我们只需让adodb的mssqlnvtive支持设置Character就可以了,方法如下:打开adodb/driver/adodb-mssqlnative.inc.php,找到function _connect这个函数,在参数里添加CharacterSet,代码如下:
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$CharacterSet="UTF-8") { if (!function_exists('sqlsrv_connect')) return null; $connectionInfo = array("Database"=>$argDatabasename,'UID'=>$argUsername,'PWD'=>$argPassword,'CharacterSet'=>$CharacterSet); |
这样我们连接数据库是的代码对应修改为:
$db = &ADONewConnection('mssqlnative');//这里将mssql改成mssqlnative $ADODB_FETCH_MODE = ADODB_FETCH_BOTH; $db->Connect($db_host, $db_user, $db_pass, $db_name,$CharacterSet="UTF8") or die("Connect database failed"); //当然你也可以使用别的编码。 |
用adodb的好处就是不用去学习微软提供的操作函数。
Sqlserver虽然有rand()函数可以用,但单纯用rand()来获取随机数有很多限制,因为rand()生成的是类似0.747589267212168的随机小数,灵活处理一下就可以得到整数
1.select cast(ceiling(rand() * N) as int) //生成的数是N以内的证书
2.select cast(ceiling(rand(checksum(newid()))*N) as int) 这个同上,但在批量操作时往往这个会更有用,如
update table set field=cast(ceiling(rand() *5 ) as int) 和update table set field=cast(ceiling(rand(checksum(newid()))*N) as int)产生的效果就完全不同,前者虽然也是生成随机数了,但是所有table表里的field字段的数值都是一样的,而后者就各不相同,原理就是1是先生成随机数,然后再更新,2是更新每条记录前生成随机数。
3.将上面俩条语句中的ceiling换成floor就可以生成包含0的整数随机数。
4.随机查询得到N条记录用order by newid(),语句是select top N * from table order by newid()


不知WC大大怎么想的,帝国CMS无论是老版还是新版就是不在水印函数里加入png透明水印的支持,还以为多复杂呢,研究一下发现原来是如此的简单,解决方案如下:
找到e/class/db.php中的:
if($isWaterImage)//图片水印 { imagecopymerge($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h,$w_pct);//拷贝水印到目标文件 } |
将下面的代码改为下面的,原因是PNG类型水印本身具有真彩透明效果,所以水印融合度设置在这里是无效的:
阅读全部
需要做一个帝国调用discuz帖子的东西,想到了万能的灵动标签,以前一直知道有这么个东西,但一直没有用过,正好试试效果,研究一番发现还挺简单的:
[e:loop={栏目ID/专题ID,显示条数,操作类型,只显示有标题图片}]
模板内容
[/e:loop]
这里由于要调用非帝国栏目的内容,所以用sql语句来实现,操作类型就是24,截取字数也很简单,因为在灵动标签下市可以直接使用php函数的,所有可以用substr之类的函数,下面是最终的代码:
[e:loop={"select subject as title,author as username,authorid as userid,tid as id from cdb_threads where dateline>UNIX_TIMESTAMP(NOW())-604800 order by views desc limit 8",8,24,0}]
<li>·<a href=”http://bbs.xxx.com/thread-<?=$bqr[id]?>-1-1.html” target=”_blank”><?=esub($bqr[title],30)?>
</a><span><a href=”http://space.xxx.com/space.php?uid=<?=$bqr[userid]?>”><?=esub($bqr[username],8)?></a></span></li>
[/e:loop]
公司需要做一批充值卡,类似中国移动手机充值卡那样的,要求生成的密码还不能重复,用sqlserver来生成以下,语句如下:
set nocount on declare @tt table (id int) declare @i int select @i=1 while @i<=10000 begin insert into @tt values (@i) select @i=@i+1 end select right(cast(abs(checksum(newid())) as varchar)+cast(abs(checksum(newid())) as varchar),12) as card_pass into #temp from @tt select * from #temp |
许久没有用php4了,最近转移一个网站的时候出现了一些不兼容的现象,其中就有$_SERVER['REQUEST_URI']的问题,解决办法如下