存档

2009年6月 的存档

如何在PHP下载文件名中解决乱码

2009年6月17日

通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来下载,相信这个大家都会。那么用Content-Disposition设置下载的文件名,这个也有不少人知道吧。基本上,下载程序都是这么写的:

<?php$filename = "document.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);

print "Hello!";?>

这样用浏览器打开之后,就可以下载document.txt。

但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。比如把上面那个程序稍稍改一下:

<?php$filename = "中文 文件名.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);

print "Hello!";?>

把程序保存成UTF-8编码再访问,IE6下载的文件名就会乱码。 FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。

阅读全文…

许石南 技术

PHP Content-type 的说明

2009年6月17日

<?php
$mimetypes = array(
‘ez’ => ‘application/andrew-inset’,
‘hqx’ => ‘application/mac-binhex40′,
‘cpt’ => ‘application/mac-compactpro’,
‘doc’ => ‘application/msword’,
‘bin’ => ‘application/octet-stream’,
‘dms’ => ‘application/octet-stream’,
‘lha’ => ‘application/octet-stream’,
‘lzh’ => ‘application/octet-stream’,
‘exe’ => ‘application/octet-stream’,
‘class’ => ‘application/octet-stream’,
’so’ => ‘application/octet-stream’, 阅读全文…

许石南 技术 ,

sqlplus常用命令使用

2009年6月15日

show和set命令是两条用于维护SQL*Plus系统变量的命令
     SQL> show all –查看所有68个系统变量值
     SQL> show user –显示当前连接用户
     SQL> show error –显示错误
     SQL> set heading off –禁止输出列标题,默认值为ON
     SQL> set feedback off –禁止显示最后一行的计数反馈信息,默认值为"对6个或更多的记录,回送ON"
     SQL> set timing on –默认为OFF,设置查询耗时,可用来估计SQL语句的执行时间,<nobr>测试</nobr>性能
     SQL> set sqlprompt "SQL> " –设置默认提示符,默认值就是"SQL> "
     SQL> set linesize 1000 –设置屏幕显示行宽,默认100
     SQL> set autocommit ON –设置是否自动提交,默认为OFF
     SQL> set pause on –默认为OFF,设置暂停,会使屏幕显示停止,等待按下ENTER键,再显示下一页
     SQL> set arraysize 1 –默认为15
     SQL> set long 1000 –默认为80

阅读全文…

许石南 技术 ,

Oracle远程连接配置

2009年6月10日

注: 本文讲述了oracle数据库实例连接的配置过程,三个重要的配置文件位于C:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN目录下

1. sqlplus sys/oracle@orcl

sqlnet.ora 文件格式NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)。客户端就会首先在tnsnames.ora文件中找

orcl的记录。如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的ip地址然后去连接这个ip上

GLOBAL_DBNAME=orcl这个实例。

2. 客户端。Tnsnames.ora

这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES时,才会尝试使用这个文件。
#你所要连接的时候输入得TNSNAME,如果listner启动失败尝试改IP地址
ora10gcsdl1 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = ora10gcsdl1)

)

)

ORCL =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = IBM-66336DAFE8F.cn.ibm.com)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)

3. 服务器端。listener.ora

listener监听器进程的配置文件,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。

#下面定义LISTENER进程为哪个实例提供服务

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = PLSExtProc)

(ORACLE_HOME = C:\oracle\product\10.1.0\Db_1)

(PROGRAM = extproc)

)

(SID_DESC =

(SID_NAME = ora10gcsdl1)

(ORACLE_HOME = C:\oracle\product\10.1.0\Db_1)

)

(SID_DESC =

(SID_NAME = ora10gcs)

(ORACLE_HOME = C:\oracle\product\10.1.0\Db_1)

)

)

#监听器的名字,一台数据库可以有不止一个监听器

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))

)

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

)

)

)

4.排错用到的指令:

lsnrctl > help

tnsping ora10gcsdl

许石南 技术 , ,

通过一个实际的例子学习Oracle存储过程

2009年6月9日

–创建存储过程
CREATE OR REPLACE PROCEDURE xxxxxxxxxxx_p
(
–参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
is_ym  IN CHAR
)
AS
–定义变量
vs_msg   VARCHAR2(4000);   –错误信息变量
vs_ym_beg  CHAR(6);      –起始月份
vs_ym_end  CHAR(6);      –终止月份
vs_ym_sn_beg CHAR(6);     –同期起始月份
vs_ym_sn_end CHAR(6);     –同期终止月份
–定义游标(简单的说就是一个可以遍历的结果集)
CURSOR cur_1 IS
SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn
FROM BGD_AREA_CM_M_BASE_T
  WHERE ym >= vs_ym_sn_beg
  AND ym <= vs_ym_sn_end
GROUP BY area_code,CMCODE;

BEGIN
–用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,’yyyymm’), -12),’yyyymm’);
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,’yyyymm’), -12),’yyyymm’);
–先删除表中特定条件的数据。
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym;
  –然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line(‘del上月记录=’||SQL%rowcount||’条’);
INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
  WHERE ym >= vs_ym_beg
  AND ym <= vs_ym_end
GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line(‘ins当月记录=’||SQL%rowcount||’条’);
–遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOP
  UPDATE xxxxxxxxxxx_T
  SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
   WHERE area_code = rec.area_code
   AND CMCODE = rec.CMCODE
   AND ym = is_ym;
END LOOP;
COMMIT;
–错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
   WHEN OTHERS THEN
      vs_msg := ‘ERROR IN xxxxxxxxxxx_p(‘||is_ym||’):’||SUBSTR(SQLERRM,1,500);
   ROLLBACK;
   –把当前错误记录进日志表。
   INSERT INTO LOG_INFO(proc_name,error_info,op_date)
   VALUES(‘xxxxxxxxxxx_p’,vs_msg,SYSDATE);
   COMMIT;
   RETURN;
END;

许石南 技术 ,

硬盘安装Vista或Windows 7

2009年6月4日
对于不想浪费一张DVD用于刻盘并且想要在干净分区中安装Vista或Windows 7的朋友,不妨试一下下面的方法。

对于不想浪费一张DVD用于刻盘并且想要在干净分区中安装Vista或Windows 7的朋友,不妨试一下下面的方法:

1.下载安装虚拟光驱,推荐Daemon Tools,Winmount

2.用虚拟光驱加载Vista或Windows 7 ISO镜像文件

3.打开加载后的Vista或Windows 7文件夹,复制所有文件到非系统盘。比如,你想安装Vista或Windows 7到C盘,那么就复制到D:\Windows 7或E:\Windows 7。下面以E:\Windows 7为例。

4.将虚拟光驱内的bootmgr和boot文件夹复制到系统盘路径下,一般为C:\

注意:对于Vista用户,可能还需做如下操作:

*复制bootmgr文件夹到C:\

*复制E:\Windows7\boot\boot.sdi到C:\boot文件夹下

*复制E:\Windows7\boot\bootsect.exe到C:\drive

5.取消文件夹隐藏。在C:\root文件夹内新建一个文件夹命名为sources

6.复制E:\Windows7\sources\boot.win到C:\root\sources

7.右键命令提示符-以管理员身份运行:

8.输入:

C:\boot\bootsect.exe /nt60 C:

Vista用户输入:

C:\bootsect.exe /nt60 C:

会有成功提示信息。

9.重命名C盘为BDCP或任何容易记住的名字。

10.重启

11.此时系统会自动安装Windows。选择语言,时间与区以及键盘等。

12.此时,系统会弹出Windows安装界面,不要点“安装Windows”按钮。点击“修复计算机”按钮。

13.在Windows恢复环境中,点击命令提示符进入DOS。

14.运行如下命令:

format c: /q

如果分区为Fat32格式,输入c: /q /fs:ntfs,以转换为NTFS格式。

在格式化开始前,系统可能会要求输入分区标签,此时输入上面的容易记住的名字,比如:BDCP。

15.格式化完成0后运行E:\Windows7\sources\setup.exe

16.继续完成安装。

许石南 技术 ,

关于php中各种数据库连接接口性能测试报告(mysql)

2009年6月3日

测试环境:

    软件:windows xp sp3,IIS6.0,php5.2.5,mysql 5.0.22-community-nt;

    硬件:dell 745商务机.

php的一大优势就是可以连接各种数据库,所以它提供的数据库接口也是比较多的,如果再算上中间层,更是数不胜数.我测试了3种使用比较多的接口,分别是直接连接数据库接口(libmysql.dll),pdo(php5以后提供的新接口,未来php6会取代各种各样的数据库接口),以及中间层mdb2(pear提供的).

主要测试批量插入数据的执行时间.这个时间包括数据库连接时间,执行sql时间.测试内容为向同一个表插入10000条数据.(表包括2个字段,其中一个是主键(int),逐渐增加).由于php没有并发机制,所以采用循环执行

其中直接连接数据库效果如下:

script execute 112.74195194244 seconds.

而pdo效果为:

script execute 99.059583902359 seconds.

mdb2的效率稍微低点:

script execute 118.64230298996 seconds.

其中mdb2是采用可移植的写法,即mdb2进行是sql重写.如果采用不重写方式(不重写的话如果移植数据库的时候需要程序重写sql语句).效率如下:

    script execute 104.3069460392 seconds.

以上为直接执行的效果,其中pdo和mdb2包含有事务功能,所以如果是这样的情况的话,采用事务处理机制,效率可以分别提高8倍左右.如果我们需要考虑移植数据库的话,建议采用mdb2可以减轻工作量,但是如果我们有更好的机制,可以自己写一个中间层,使用pdo连接,这样效率上会更高.

 

附程序代码:

直接连接数据库:

<?php
$time_start = microtime_float();

$db = mysql_connect("localhost","root","woaikenan") or die("connect to db fault!!!");
mysql_select_db("test", $db) or die("select db fault!!!");
$sql = "insert into test set name=’test’";
for($i = 0;$i < 10000; ++$i)
{
    mysql_query($sql);
}

$time_end = microtime_float();
$time = $time_end – $time_start;

echo "script execute $time seconds\n";

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

?>

 

使用pdo:

<?php
$time_start = microtime_float();
try {
  $dbh = new PDO(‘mysql:host=localhost;dbname=test’, ‘root’, ‘woaikenan’,
      array(PDO::ATTR_PERSISTENT => true));
  echo "Connected\n";
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  //$dbh->beginTransaction();
  for($i = 0;$i < 10000; ++$i)
  {
    //$dbh->exec("insert into test set name=’test’");
    $dbh->exec("insert into test set name=’test’");
  }
  //$dbh->commit();
} catch (Exception $e) {
  //$dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}

$time_end = microtime_float();
$time = $time_end – $time_start;

echo "script execute $time seconds\n";

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
?>

 

使用mdb2:

<?php
// Create a valid MDB2 object named $mdb2
// at the beginning of your program…
require_once ‘MDB2.php’;

$time_start = microtime_float();
$mdb2 =& MDB2::connect(‘mysql://root:woaikenan@localhost/test’);
if (PEAR::isError($mdb2)) {
    die($mdb2->getMessage());
}

for($i = 0;$i < 10000; ++$i)
{
    /*$types = array(‘integer’, ‘text’);
    $sth = $mdb2->prepare(‘INSERT INTO test VALUES (?, ?)’, $types, MDB2_PREPARE_MANIP);

    $data = array("", ‘test’);
    $affectedRows = $sth->execute($data);*/
    $mdb2->exec(‘insert into test set name="test"’);
}

$time_end = microtime_float();
$time = $time_end – $time_start;

echo "script execute $time seconds\n";

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
?>

许石南 技术 , , , , ,

© 2008-2009 cloved.cn, Power By WordPress, Design By sheath, WordPress Themes by mg12.

Full RSS - Comments RSS - 粤ICP备09006273号

免责声明:本站所有内容均来源于互联网,若侵犯您的权利,请来信告知,本站会第一时间处理.