nav-left cat-right
cat-right
PHP+ADODB+MSSQL支持UTF8的2种解决方案

由于公司的项目都是用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的好处就是不用去学习微软提供的操作函数。

10个在线文件管理软件PHP版
  1. Ajaxplorer (需翻墙着自行翻)
    AjaXplorer-screenshot
    AjaXplorer是一款通过本地实现远程端文件管理功能的软件。该软件提供了一个友好的可视化GUI界面方便用户的使用,502一直用的就是AjaXplorer,不知为何被墙奸了,不过还可以通过这个链接下载:http://sourceforge.net/project/showfiles.php?group_id=192639
    其主要特性有:
    可以对远程端文件进行全功能的操作,如上传、下载、删除、更名等
    提供了一个在线编辑器
    图片预览功能
    完备的书签系统
  2. eXtplorer
    extplorer
    eXtplorer是著名开源CMS程序Joomla的元件之一,支持中文,它是基于 PHP 和 ExtJS Javascript 库创建的。使用 eXtplorer 可以在线浏览文件和文件夹之外,我们甚至可以将 eXtplorer 作为 FTP 客户端去登录 FTP 服务器。。
  3. EpiwareEpiware是一个AJAX支持的项目与文档管理Web应用系统。它提供了一套完整的文件管理功能包括文档上传,下载,版本控制,审核,变化通知和访问历史列表等。Epiware还为开发团队创建一个安全的信息交流与相互协作平台。
  4. PHPCMS文件管理器 v4.03  本文中唯一一款国人开发的程序,功能一样灰常的强大
  5. PHP Navigator  Ajax文件管理,XP界面是这款软件的一个特点,很友好。
  6. WebShare 是一个采用Ajax+PHP技术开发的webFTP资源管理器。可以利用它来查看,复制,修改,新增和共享Web文档。
  7. osFileManager 
  8. Net2ftp 介个也很强大
  9. phpWebFtp
  10. CKFinder&CKEditor 源于FCKEditor,融入Ajax支持,并且扩展了很多功能,不过免费版会有很大缩水
帝国CMS Png透明水印解决方案

不知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>&#183;<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]

REQUEST_URI通用函数

许久没有用php4了,最近转移一个网站的时候出现了一些不兼容的现象,其中就有$_SERVER['REQUEST_URI']的问题,解决办法如下

function request_uri() {
     if (isset($_SERVER['REQUEST_URI'])) {
         $uri = $_SERVER['REQUEST_URI'];
         }
     else {
        if (isset($_SERVER['argv'])){
            $uri = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];
           }
        else {
             $uri = $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
             }
        }
     return $uri;
    }
adodb中qstr的妙处

使用adodb库的好处就在于里面会有很多好用的函数,今天说的就是qstr的用法,此函数会再提交到数据库之前将字符串里的引号转义,并用引号来包裹,比用addslashes要方便很多。
function qstr($s,$magic_quotes=false)
{
if (!$magic_quotes) {

if ($this->replaceQuote[0] == ‘\\’){
// only since php 4.0.5
$s = adodb_str_replace(array(‘\\’,”\0″),array(‘\\\\’,”\\\0″),$s);
//$s = str_replace(“\0″,”\\\0″, str_replace(‘\\’,'\\\\’,$s));
}
return “‘”.str_replace(“‘”,$this->replaceQuote,$s).”‘”;
}

// undo magic quotes for ”
$s = str_replace(‘\\”‘,’”‘,$s);

if ($this->replaceQuote == “\\’”) // ‘ already quoted, no need to change anything
return “‘$s’”;
else {// change \’ to ” for sybase/mssql
$s = str_replace(‘\\\\’,'\\’,$s);
return “‘”.str_replace(“\\’”,$this->replaceQuote,$s).”‘”;
}
}

phpCodeBeautifier与editplus结合美化php代码

最近接手一个php项目,代码乱的一塌糊涂,于是再继续修改开发前决定先美化一下代码,以前用过一个图形界面的软件,格式化各种程序代码的,后来记得一篇文章讲editplus的时候有讲过类似插件的东西,于是搜索了一下果然找到了phpcodebuautifier这个好东西,phpcb这个事一个命令行的工具,直接少用的话后面要跟一大段的参数而且只能一个一个的美化,于是又搜集了一些editplus相关的设置,总结合成步骤如下:

1.下载phpcb
2.设置editplus参数:工具->配置用户工具->添加工具
主要是这里了,菜单文本自己命名,命令即是你的phpcb.exe的路径,参数即是美化的设置,详细参数的说明可以参看下载下来的phpcb里的帮助文件,关键一点“已文本过滤器运行”一定要勾选。

参考参数设置:

–space-after-if –optimize-eol –space-after-switch –space-after-while –space-before-start-angle-bracket –space-after-end-angle-bracket –extra-padding-for-case-statement –glue-amperscore –change-shell-comment-to-double-slashes-comment –indent-with-tab –force-large-php-code-tag –force-true-false-null-contant-lowercase –comment-rendering-style PEAR –equal-align-position 50 –padding-char-count 1 “$(FilePath)”

编程的乐趣

今天公司财务要开一些发票,内容是纵贯线演唱会门票,但是要拆开来开,比如总价是13300,必须按380、580、800、1280、1680这五种形式的组合,起始就是通过这样的等式($a*380+$b*580+$c*800+$d*1280+$e*1680)==$total=13300来求出abcde的值,其中abcde必须是大于或者等于0的整数,他们在那用计算器算了半天没算出来问我,我想到用php的循环来算,结果就有了下面的这一段代码,还真好用 光是13300就有100多种组合方法,这还是怕脚本超市把循环限制了一下次数。忽然更加感觉到计算机的伟大,如果是人工来算,挨个循环试,找到一种方案也可能会好用半天时间。

<?php
$j=0;
$total=13300;
for($a=0;$a<40;$a++){
    for($b=0;$b<30;$b++){
        for($c=0;$c<20;$c++){
            for($d=0;$d<20;$d++){
                for($e=0;$e<20;$e++){
                    if(($a*380+$b*580+$c*800+$d*1280+$e*1680)==$total) {
                        echo $j+1;
                        echo '<font color=red>种方案 a'.$a.'-b'.$b.'-c'.$c.'-d'.$d.'-e'.$e.'</font><br />';
                        $j++;
                    }
                }
            }
        }
    }
}
?>
open flash chart应用-投票

先看演示:DEMO

闲来没事,用ofc搞了一个投票小程序,进一步巩固一下ofc和jquery,试验一下ofc里加入onclick时间的效果,果然很好用,而且调用js的功能函数相当方便,只需在json数据里加入“”on-click”,”myfunction(parm)””就可以,投票程序代码写的很简单,没有做什么优化。

废话少说,看代码:

阅读全部

open-flash-chart系列教程(7)–PHP类库的用法

例子如下:


require_once('includes/open-flash-chart2/php-ofc-library/open-flash-chart.php');
$tmpx = array();//x轴标签的数组
$tmpy = array();//从数据库查询得到y轴数据的数组
 $title = new title( '年销售统计图表' );
    $title->set_style("font-size:18px;");

    $bar = new bar();
    $bar->text= $city;
    $bar->set_values( $tmpy );

    $y = new y_axis();
    $y->set_range(0,ceil(max($tmpy)),20);

    $x = new x_axis();
    $x->set_labels_from_array( $tmpx );

    $yl =  new y_legend();
    $yl->y_legend( "chinaticket.com chart 1:10000" );
    $yl->set_style( "color:#736AEF; font-size:12px;" );

    $chart = new open_flash_chart();
    $chart->set_title( $title );

    $chart->set_y_axis( $y );
    $chart->set_x_axis( $x );
    $chart->set_y_legend($yl);

    $chart->add_element($bar);

$chart->toString();//生成json数据
$chart->toPrettyString();//生成适合阅读的数据格式

具体那一种图表格式可以打开相对应的class文件查询相关的参数、函数,用法都比较简单的。

1/3123»