2012-1-30 17:50 Monday  

1) 笨方法:重新安装

2) 修改注册表
McAfee 8.0
HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion
UIP就是MD5加密过的密码.
直接清除掉,再回到卖咖啡那里重新设置密码就OK了.

其实控制台的密码设置相关信息就保存在
HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion下的UIP、UIPMode、UIPpages这三个子键里

UIP为具体的密码内文
mode为加密状况,0为锁定、1则相反
pages就对应的是相关的页面锁定范围


McAfee 8.5
注册表位置改在:HKEY_LOCAL_MACHINE\SOFTWARE\McAfee\DesktopProtection

2012-1-30 17:49 Monday  

利用Javascript取和设FCKeditor值也是非常容易的,如下:

// 获取编辑器中HTML内容
function getEditorHTMLContents(EditorName) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName);
    return(oEditor.GetXHTML(true));
}

// 获取编辑器中文字内容
function getEditorTextContents(EditorName) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName);
    return(oEditor.EditorDocument.body.innerText);
}

// 设置编辑器中内容
function SetEditorContents(EditorName, ContentStr) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName) ;
    oEditor.SetHTML(ContentStr) ;
}

FCKeditorAPI是FCKeditor加载后注册的一个全局对象,利用它我们就可以完成对编辑器的各种操作。

在当前页获得 FCK 编辑器实例:
var Editor = FCKeditorAPI.GetInstance('InstanceName');

从 FCK 编辑器的弹出窗口中获得 FCK 编辑器实例:
var Editor = window.parent.InnerDialogLoaded().FCK;

从框架页面的子框架中获得其它子框架的 FCK 编辑器实例:
var Editor = window.FrameName.FCKeditorAPI.GetInstance('InstanceName');

从页面弹出窗口中获得父窗口的 FCK 编辑器实例:
var Editor = opener.FCKeditorAPI.GetInstance('InstanceName');

获得 FCK 编辑器的内容:
oEditor.GetXHTML(formatted); // formatted 为:true|false,表示是否按HTML格式取出
也可用:
oEditor.GetXHTML();

设置 FCK 编辑器的内容:
oEditor.SetHTML("content", false); // 第二个参数为:true|false,是否以所见即所得方式设置其内容。此方法常用于"设置初始值"或"表单重置"哦作。

插入内容到 FCK 编辑器:
oEditor.InsertHtml("html"); // "html"为HTML文本

检查 FCK 编辑器内容是否发生变化:
oEditor.IsDirty();

在 FCK 编辑器之外调用 FCK 编辑器工具条命令:
命令列表如下:
DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo

使用方法如下:
oEditor.Commands.GetCommand('FitWindow').Execute();

= FCKConfig.BasePath + 'plugins/'  
// FCKConfig.Plugins.Add( 'placeholder', 'en,it' ) ;


去掉//后,就相当于把placeholder这个插件功能加上了,fckeditor的插件文件都在/editor/plugins/文件夹下分类按文 件夹放置的,对于fckeditor2.0来说,里面有两个文件夹,也就是有两个官方插件,placeholder这个文件夹就是我们刚才加上去的,主要 用于多参数或单参数自定义标签的匹配,这个在制作编辑模板时非常管用,要想看具体实例的话,大家可以去下载acms 这个系统查看学习,另一个文件夹tablecommands就是编辑器里的表格编辑用到的了。当然,如果你想制作自己其它用途的插件,那就只要按照 fckeidtor插件的制作规则制作完放置在/editor/plugins/下就行,然后再在fckeidtor.js里再添加 FCKConfig.Plugins.Add('Plugin Name',',lang,lang');就可以了。

第二部分 ,如何让编辑器一打开的时候,编辑工具条不出现,等点“展开工具栏”时才出现?Easy,FCKeditor本身提供了这个功能啦,打开fckconfig.js,找到

FCKConfig.ToolbarStartExpanded = true ;
改成
FCKConfig.ToolbarStartExpanded = false ;
就可以啦!

第三部分,使用自己的表情图标,同样打开fckcofnig.js到最底部那一段


FCKConfig.SmileyPath = FCKConfig.BasePath + 'images/smiley/msn/' ;
FCKConfig.SmileyImages = ['regular_smile.gif','sad_smile.gif','wink_smile.gif'] ;
FCKConfig.SmileyColumns = 8 ;
FCKConfig.SmileyWindowWidth    = 320 ;
FCKConfig.SmileyWindowHeight = 240 ;

上面这段已经是我修改过的了,为了我发表此文的版面不会被撑得太开,我把FCKConfig.SmileyImages那一行改得只有三个表情图了。

第一行,当然是表情图标路径的设置,第二行是相关表情图标文件名的一个List,第三行是指弹出的表情添加窗口最每行的表情数,下面两个参数是弹出的模态窗口的宽和高喽。

第四部分,文件上传管理部分

此部分可能是大家最为关心的,上一篇文章简单的讲了如何修改来上传文件以及使用fckeidtor2.0才提供的快速上传功能。再我们继续再深层次的讲解上传功能

FCKConfig.LinkBrowser = true ;
FCKConfig.ImageBrowser = true ;
FCKConfig.FlashBrowser = true ;在fckconfig.js找到这三句,这三句不是连着的哦,只是我把他们集中到这儿来了,设置为true的意思就是允许使用fckeditor来浏览 服务器端的文件图像以及flash等,这个功能是你插入图片时弹出的窗口上那个“浏览服务器”按钮可以体现出来,如果你的编辑器只用来自己用或是只在后台 管理用,这个功能无疑很好用,因为他让你很直观地对服务器的文件进行上传操作。但是如果你的系统要面向前台用户或是像blog这样的系统要用的话,这个安 全隐患可就大了哦。于是我们把其一律设置为false;如下

FCKConfig.LinkBrowser = false ;
FCKConfig.ImageBrowser = false ;
FCKConfig.FlashBrowser = false ;

Aboc的话:我自己是弄PHP的,文件上传部分(PHP)有修改成自己需要的,且有加上水印功能,至于下下面这部分,对我来说是没什么用的,不删除是为了保留转载此文的完整性


这样一来,我们就只有快速上传可用了啊,好!接下来就来修改,同样以asp为范例进行,进入/editor/filemanager/upload/asp/打开config.asp,修改
ConfigUserFilesPath = "/UserFiles/"这个设置是上传文件的总目录,我这里就不动了,你想改自己改了

好,再打开此目录下的upload.asp文件,找到下面这一段


Dim resourceType
If ( Request.QueryString("Type") <> "" ) Then
resourceType = Request.QueryString("Type")
Else
resourceType = "File"
End If
然后再在其后面添加


ConfigUserFilesPath = ConfigUserFilesPath & resourceType &"/"& Year(Date()) &"/"& Month(Date()) &"/"
这样的话,上传的文件就进入“/userfiles/文件类型(如image或file或flash)/年/月/”这样的文件夹下了,这个设置对单用户来用已经足够了,如果你想给多用户系统用,那就这样来改


ConfigUserFilesPath = ConfigUserFilesPath & Session("username") & resourceType &"/"& Year(Date()) &"/"& Month(Date()) &"/"
这样上传的文件就进入“/userfiles/用户目录/文件类型/年/月/”下了,当然如果你不想这么安排也可以修改成别的,比如说用户目录再深一层等,这里的Session("username")请根据自己的需要进行修改或换掉。

上传的目录设置完了,但是上传程序还不会自己创建这些文件夹,如果不存在的话,上传不会成功的,那么我们就得根据上面的上传路径的要求进行递归来生成目录了。

找到这一段


Dim sServerDir
sServerDir = Server.MapPath( ConfigUserFilesPath )
If ( Right( sServerDir, 1 ) <> "\" ) Then
    sServerDir = sServerDir & "\"
End If

把它下面的这两行


Dim oFSO
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
用下面这一段代码来替换


dim arrPath,strTmpPath,intRow
strTmpPath = ""
arrPath = Split(sServerDir, "\")
Dim oFSO
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
for intRow = 0 to Ubound(arrPath)
    strTmpPath = strTmpPath & arrPath(intRow) & "\"
    if oFSO.folderExists(strTmpPath)=false then
     oFSO.CreateFolder(strTmpPath)
    end if
next
用这段代码就可以生成你想要的文件夹了,在上传的时候自动生成。

好了,上传文件的修改到现在可以暂时告一段落了,但是,对于中文用户还存在这么个问题,就是fckeditor的文件上传默认是不改名的,同时还不支持中 文文件名,这样一来是上传的文件会变成“.jpg”这样的无法读的文件,再就是会有重名文件,当然重名这点倒没什么,因为fckeditor会自动改名, 会在文件名后加(1)这样来进行标识。但是,我们通常的习惯是让程序自动生成不重复的文件名

在刚才那一段代码的下面紧接着就是
' Get the uploaded file name.
sFileName = oUploader.File( "NewFile" ).Name
看清楚了,这个就是文件名啦,我们来把它改掉,当然得有个生成文件名的函数才行,改成下面这样

'//取得一个不重复的序号
Public Function GetNewID()
dim ranNum
dim dtNow
randomize
dtNow=Now()
ranNum=int(90000*rnd)+10000
GetNewID=year(dtNow) & right("0" & month(dtNow),2) & right("0" & day(dtNow),2) & right("0" & hour(dtNow),2) & right("0" & minute(dtNow),2) & right("0" & second(dtNow),2) & ranNum
End Function

' Get the uploaded file name.
sFileName = GetNewID() &"."& split(oUploader.File( "NewFile" ).Name,".")(1)

这样一来,上传的文件就自动改名生成如20050802122536365.jpg这样的文件名了,是由年月日时分秒以及三位随机数组成的文件名了

<select name='Grade' class='s8'>
<option value=''>— 请选择 —</option>
<optgroup label='学期教育'></optgroup><option value='18'>&nbsp;&nbsp;学期教育</option>
<optgroup label='小学'></optgroup><option value='5'>&nbsp;&nbsp;1年级</option>
<option value='6'>&nbsp;&nbsp;2年级</option>
<option value='7'>&nbsp;&nbsp;3年级</option>
<option value='8'>&nbsp;&nbsp;4年级</option>
<option value='9'>&nbsp;&nbsp;5年级</option>
<option value='10'>&nbsp;&nbsp;6年级</option>
<optgroup label='初中'></optgroup><option value='11'>&nbsp;&nbsp;7年级</option>
<option value='12'>&nbsp;&nbsp;8年级</option>
<option value='13'>&nbsp;&nbsp;9年级</option>
<optgroup label='高中'></optgroup><option value='14'>&nbsp;&nbsp;10年级</option>
<option value='15'>&nbsp;&nbsp;11年级</option>
<option value='16'>&nbsp;&nbsp;12年级</option>
</select>
2012-1-30 17:48 Monday  

JSON基 于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表 (hash table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

PHPserialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,
说起来两者都是以一种字符串的方式来体现一种数据结构,那它们之间有什么区别呢。

先从JSON说起,看一个简单的实例

例一:

  1. var test = {"Name":"Peter","Age":20};
  2. document.write(test.Name + ": " + test.Age);

显示结果:

Peter: 20

变量test中{"Name":"Peter","Age":20}为一个有2个元素的对象(感觉就像PHP的数组):
Name为Peter,Age为20。

当然也可以变得复杂些。

例二:

  1. var test = {"User":{"Name":"Peter","Age":20},"Company":"FORD"};
  2. document.write(test.User.Name + ": " + test.Company);

显示结果:

Peter: FORD这个例子中User元素中包含了Name和Age。

如果要体现多个User,则需要使用数组,区别于对象的"{}",数组使用"[]"。

JSON解析例三:

  1. var test = [
  2.                   {"User":{"Name":"Peter","Age":20},"Company":"FORD"},
  3.                   {"User":{"Name":"Li Ming","Age":20},"Company":"Benz"}
  4.                ];
  5. document.write(test[1].User.Name + ": " + test[1].Company);
  6. //或者使用:document.write(test[1]["User"]["Name"] + ": " + test[1]["Company"]);

JSON解析显示结果:

Li Ming: Benz

通过以上简单实例就能将一些复杂数据通过一个字符串来进行传递,再配合上Ajax的确是方便很多。
下面再来看看PHP的serialize函数的作用。

JSON解析例四:

  1. $arr = array
  2.         (
  3.            'Peter'=> array
  4.            (
  5.              'Country'=>'USA',
  6.              'Age'=>20
  7.            ),
  8.            'Li Ming'=> array
  9.            (
  10.               'Country'=>'CHINA',
  11.               'Age'=>21
  12.            )
  13.          );
  14. $serializeserialize_var = serialize($arr);
  15. echo $serialize_var;

JSON解析显示结果:

  1. a:2:{s:5:"Peter";a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}s:7:"Li Ming";a:2:{s:7:"Country";s:5:"CHINA";s:3:"Age";i:21;}}

这个结果看上去比JSON要复杂一些,其实也很简单,它说明的就是一些数据类型和结构。
以a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}为例:

a:2说明这是个有两个元素的数组(array),s:7:"Country";s:3:"USA";为第一个元素,s:7说明这是有7个字符的字符串(string),后面i:20;也应该猜得到是整数(integer)20。

再来看一下这个例子,

例五:

  1. class test
  2. {
  3.     var $var = 0;
  4.     function add(){
  5.       echo $var+10;
  6.      }
  7. }
  8. $unserialize_var = new test;
  9. $serialize_var = serialize($unserialize_var);
  10. echo $serialize_var;
  11. $unserialize_var = null;
  12. $unserialize_var = unserialize($serialize_var);
  13. $unserialize_var->add();

显示结果:

O:4:"test":1:{s:3:"var";i:0;}

10

从这个例子中可以看出来,serialize对数据的类型和结构都进行的保存,
unserialize后的变量仍然可以使用add()方法

那么PHP和JSON有没有联系呢,熟悉PHP的朋友应该了解PHP5.2.0已经将JSON extension设置为默认组件,也就是说我们可以在PHP中进行JSON操作,其函数为json_encode和json_decode。

例六:

  1. $arr = array
  2.         (
  3.           'Name'=>'Peter',
  4.           'Age'=>20
  5.         );
  6. $jsonencode = json_encode($arr);
  7. echo $jsonencode;


显示结果:

{"Name":"Peter","Age":20}

这个结果和例一中test值是一样的,通过json_encode将PHP中的变量转换为JSON字符出表达式。
再来看看json_decode的用法。

例七:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var);
  3. print_r($jsondecode);

显示结果:

  1. stdClass Object ( [Name] => Peter [Age] => 20 )

这的确验证了,在JSON中{"Name":"Peter","Age":20}是一个对象,但是在PHP中也可以将其转为数组,在json_decode中将ASSOC参数设置为True即可。
例八:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var,true);
  3. print_r($jsondecode);

显示结果:

  1. Array ( [Name] => Peter [Age] => 20 )

另,需要注意的是JSON是基于Unicode格式,所以要进行中文操作要将其转化为UTF-8格式。通过上面这些例子相信大家对于JSON和 PHP的serialize、json_encode都有了初步了解,结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互 功能。

2012-1-30 17:47 Monday  
xdebug的性能测试输出文件名是可以配置的。
默认是 xdebug.profiler_output_name = cachegrind.out.%p
那个%p是服务器的pid,会输出“cachegrind.out.1408”之类的文件。
可能这样不太方便测试很多文件的网站。
网上看到的中文文章里面都没有关于这个参数的说明。
我从xdebug官网上找来了它的说明翻译成中文了。
符号 含义 配置样例 样例文件名
%c 当前工作目录的crc32校验值 trace.%c trace.1258863198.xt
%p 当前服务器进程的pid trace.%p trace.5174.xt
%r 随机数 trace.%r trace.072db0.xt
%s 脚本文件名(注) cachegrind.out.%s cachegrind.out._home_httpd_html_test_xdebug_test_php
%t Unix时间戳(秒) trace.%t trace.1179434742.xt
%u Unix时间戳(微秒) trace.%u trace.1179434749_642382.xt
%H $_SERVER['HTTP_HOST'] trace.%H trace.kossu.xt
%R $_SERVER['REQUEST_URI'] trace.%R trace._test_xdebug_test_php_var=1_var2=2.xt
%S session_id (来自$_COOKIE 如果设置了的话) trace.%S trace.c70c1ec2375af58f74b390bbdd2a679d.xt
%% %字符 trace.%% trace.%.xt
注 此项不适用于trace file的文件名

从上表可以找到一些适合你的参数。
比如,我想针对每个文件生成一个输出文件。
那么我可以用:
xdebug.profiler_output_name = cachegrind.out.%s
多个域名的话,也可以组合使用
xdebug.profiler_output_name = cachegrind.out.%H.%u.%s
=============================================================
使用Xdebug调试和优化PHP程序系列教程之Xdebug配置,根据Xdebug的官方文档来详细解释Xdebug的参数配置。
Xdebug配置
第一部分:安装
预编译模块
安装预编译模块是很容易的。只需要将它们放到一个目录中,并将下面的内容添加到php.ini中:(不要忘记更改路径和文件名为你自己的值,并确信你使用的是完整路)
zend_extension_ts = "c:/php/modules/php_xdebug.dll"
第二部分:基本特征:
相关参数设置
xdebug.default_enable
类型:布尔型 默认值:On
如果这项设置为On,堆栈跟踪将被默认的显示在错误事件中。你可以通过在代码中使用xdebug_disable()来禁止堆叠跟踪的显示。因为这是xdebug基本功能之一,将这项参数设置为On是比较明智的。
xdebug.max_nesting_level
类型:整型 默认值:100
The value of this setting is the maximum level of nested functions that are allowed before the script will be aborted.
限制无限递归的访问深度。这项参数设置的值是脚本失败前所允许的嵌套程序的最大访问深度。
第三部分:堆栈跟踪:
相关参数设置
xdebug.dump_globals
类型:布尔型 默认值:1
限制是否显示被xdebug.dump.*设置定义的超全局变量的值
例 如,xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER['REQUEST_METHOD']、$_SERVER['REQUEST_URI'] 和 $_SERVER['HTTP_USER_AGENT']。
xdebug.dump_once
类型:布尔型 默认值:1
限制是否超全局变量的值应该转储在所有出错环境(设置为Off时)或仅仅在开始的地方(设置为On时)
xdebug.dump_undefined
类型:布尔型 默认值:0
如果你想从超全局变量中转储未定义的值,你应该把这个参数设置成On,否则就设置成Off
xdebug.show_exception_trace
类型:整型 默认值:0
当这个参数被设置为1时,即使捕捉到异常,xdebug仍将强制执行异常跟踪当一个异常出现时。
xdebug.show_local_vars
类型:整型 默认值:0
当这个参数被设置为不等于0时,xdebug在错环境中所产生的堆栈转储还将显示所有局部变量,包括尚未初始化的变量在最上面。要注意的是这将产生大量的信息,也因此默认情况下是关闭的。
第四部分:分析PHP脚本
相关参数设置
xdebug.profiler_append
类型:整型 默认值:0
当这个参数被设置为1时,文件将不会被追加当一个新的需求到一个相同的文件时(依靠xdebug.profiler_output_name的设置)。相反的设置的话,文件将被附加成一个新文件。
xdebug.profiler_enable
类型:整型 默认值:0
开放xdebug文件的权限,就是在文件输出目录中创建文件。那些文件可以通过KCacheGrind来阅读来展现你的数据。这个设置不能通过在你的脚本中调用ini_set()来设置。
xdebug.profiler_output_dir
类型:字符串 默认值:/tmp
这个文件是profiler文件输出写入的,确信PHP用户对这个目录有写入的权限。这个设置不能通过在你的脚本中调用ini_set()来设置。
xdebug.profiler_output_name
类型:字符串 默认值:cachegrind.out%p
这个设置决定了转储跟踪写入的文件的名称。
第五部分:远程Debug
相关参数设置
xdebug.remote_autostart
类型:布尔型 默认值:0
一般来说,你需要使用明确的HTTP GET/POST变量来开启远程debug。而当这个参数设置为On,xdebug将经常试图去开启一个远程debug session并试图去连接客户端,即使GET/POST/COOKIE变量不是当前的。
xdebug.remote_enable
类型:布尔型 默认值:0
这个开关控制xdebug是否应该试着去连接一个按照xdebug.remote_host和xdebug.remote_port来设置监听主机和端口的debug客户端。
xdebug.remote_host
类型:字符串 默认值:localhost
选择debug客户端正在运行的主机,你不仅可以使用主机名还可以使用IP地址
xdebug.remote_port
类型:整型 默认值:9000
这个端口是xdebug试着去连接远程主机的。9000是一般客户端和被绑定的debug客户端默认的端口。许多客户端都使用这个端口数字,最好不要去修改这个设置。
注意:所有以上参数修改后,要重启Apache才能生效!
=======================================================
Xdebug的配置
[Zend]
;关闭ZendExtensionManager,它和Xdebug有冲突,只能加载一个。
;zend_extension_ts=E:\XAMPP\php\zendOptimizer\lib\ZendExtensionManager.dll
[XDebug]
;; Only Zend OR (!) XDebug
zend_extension_ts=”E:\XAMPP\php\ext\php_xdebug.dll”
xdebug.profiler_enable=1
xdebug.profiler_output_dir=”E:\XAMPP\tmp”
xdebug.profiler_output_name=cachegrind.out.%p.%s
;回答四个 w 问题
xdebug.default_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.dump.GET=*
xdebug.dump.POST=*
;跟踪代码
xdebug.trace_format = 0
xdebug.auto_trace = On
xdebug.trace_output_dir = “E:\XAMPP\tmp”
;每个文件请求会生成一个trace文件,否则会覆盖,你只能看到最后执行的,
xdebug.trace_output_name = trace.%c.%p.%R
xdebug.collect_vars=on
xdebug.collect_params = 4
xdebug.collect_includes = On
xdebug.collect_return = On
xdebug.show_mem_delta = On

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/binger819623/archive/2009/03/12/3985506.aspx
MYSQL的事务处理主要有两种方法:

1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认

2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

常用的是第一种方法!

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
方法如下:
1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。也就说明支持事务transaction了。
4.在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。

I. Mysql扩展库API用法
/*方法一*/
Php代码 复制代码
  1. $link = mysql_connect('localhost', 'root', '');   
  2. if (!$link) {   
  3.     die('Could not connect: ' . mysql_error());   
  4. }   
  5. mysql_select_db('test', $link) or die ('Can\'t use [test]: ' . mysql_error());   
  6. mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");   
  7. //若不使用事務,則$sql執行成功,$sql1執行失敗     
  8. $sql = " insert into test values('11','88') ";   
  9. $sql1 = " insert into test values('11','88','444') ";   
  10. $res = mysql_query($sql);   
  11. $res1 = mysql_query($sql1);     
  12. //因爲使用了事務,則兩個insert都執行失敗   
  13. if($res && $res1){   
  14.      mysql_query("COMMIT");   
  15. } else{   
  16.      mysql_query("ROLLBACK");   
  17. }   
  18. mysql_close($link);  


/*方法二*/
Php代码 复制代码
  1. // connect db....   
  2. mysql_query("SET AUTOCOMMIT=0"); //設置mysql不自動提交,需自行用commit語句提交   
  3. $sql = " insert into test values('11','88') ";   
  4. $sql1 = " insert into test values('11','88','444') ";   
  5. $res = mysql_query($sql);   
  6. $res1 = mysql_query($sql1);     
  7. //因爲使用了事務,則兩個insert都執行失敗   
  8. if($res && $res1){   
  9.          mysql_query("COMMIT");   
  10. }else{   
  11.          mysql_query("ROLLBACK");   
  12. }   
  13. // close db...  


/*方法三*/
Php代码 复制代码
  1. //对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:   
  2. //MyISAM & InnoDB 都支持,   
  3. //Notes:query語句不能寫在一起如:mysql_query("select * from a;select * from b;");   
  4. $sql_1=" LOCK TABLES test WRITE ";   
  5. mysql_query($sql_1);   
  6.   
  7. $sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";   
  8. if(mysql_query($sql_2)){   
  9.   echo 'successful!';   
  10. }else{   
  11.   echo 'Unsuccessful!';   
  12. }   
  13. $sql_3=" UNLOCK TABLES ";   
  14. mysql_query($sql_3);   


II. mysqli和pdo的用法
两个库都提供了commit/rollback函数封装,伪代码如下:
Php代码 复制代码
  1. if(conn.commit()){   
  2.    conn.rollback();   

2012-1-30 17:46 Monday  
◆尽量不要在where中包含子查询;

  关于时间的查询,尽量不要写成:where to_char(dif_date,'yyyy-mm-dd')=to_char('2007-07-01','yyyy-mm-dd');

  ◆在过滤条件中,可以过滤掉最大数量记录的条件必须放在where子句的末尾;

  FROM子句中写在最后的表(基础表,driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有三个以上的连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表;

  ◆采用绑定变量

  ◆在WHERE中尽量不要使用OR

  ◆用EXISTS替代IN、用NOT EXISTS替代NOT IN;

  ◆避免在索引列上使用计算:WHERE SAL*12>25000;

  ◆用IN来替代OR: WHERE LOC_ID=10 OR LOC_ID=15 OR LOC_ID=20

  ◆避免在索引列上使用IS NULL和IS NOT NULL;

  ◆总是使用索引的第一个列;

  ◆用UNION-ALL替代UNION;

  ◆避免改变索引列的类型:SELECT...FROM EMP WHERE EMPNO='123',由于隐式数据类型转换,to_char(EMPNO)='123',因此,将不采用索引,一般在采用字符串拼凑动态SQL语句出现;

  ◆'!=' 将不使用索引;

  ◆优化GROUP BY;

  ◆避免带有LIKE参数的通配符,LIKE '4YE%'使用索引,但LIKE '%YE'不使用索引

  ◆避免使用困难的正规表达式,例如select * from customer where zipcode like "98___",即便在zipcode上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改成select * from customer where zipcode>"98000",在执行查询时就会利用索引来查询,显然会大大提高速度;

  ◆尽量明确的完成SQL语句,尽量少让数据库工作。比如写SELECT语句时,需要把查询的字段明确指出表名。尽量不要使用SELECT *语句。组织SQL语句的时候,尽量按照数据库的习惯进行组织

2012-1-30 17:45 Monday  
/**
* 得到文件目录的大小/此数据只是大小数据,而不是所占用的空间
*/
function dirsize($dirname)
{
if(stripos(PHP_OS, "win")!==false){//For Windows
   $obj = new COM ( 'scripting.filesystemobject' );
   if ( is_object ( $obj ))
   {
    $ref = $obj->getfolder ( $dirname );
    $size = $ref->size;
    $obj = null;
    return $size;
   }
   else{
    return false;
   }
}else{// For Linux-like
   $io = popen ( '/usr/bin/du -sk ' . $dirname, 'r' );
   $size = fgets ( $io, 4096);
   $size = substr ( $size, 0, strpos ( $size, ' ' ) );
   pclose ( $io );
   return $size;
}
}


echo dirsize("E:")/(1024*1024);

一台远程服务器,PCanywhere显示连接忙,无法连接。使用远程连接显示“超过了最大允许连接数”,第一个问题可以过去操作一下服务器,但是也必须把第二个问题解决,搜索了一下,摘抄一些有用的东西。

使用远程桌面的朋友可能经常会遇到“超出最大允许连接数”的问题,这是因为remote desktop for administrator缺省设置是2个连接,而且如果远程登录后不注销而直接关闭远程桌面,实际上session还留在服务器端,所以再次连接就很容 易出现上面的提示。解决办法一是用注销来关闭远程桌面,二是限制已经断开连接的session存在的时间,三是增加连接数。

先说增加连接数,目前的两种方法,我明天去测试一下:

(1)开始- 运行- gpedit.msc- 管理模板- Windows组件- 终端服务- 限制连接数量- 启用 TS允许的最大连接数(可修改,不过好像并没有解决我的问题,远程连接服务器还是提示超过了最大允许连接数)

(2)开始- 运行- gpedit.msc- 管理模板- Windows组件- 终端服务- 限制连接数量- 选择“已禁用”,打开终端服务器配置-网卡-把那个允许最大连接数值改的大一些(经过我的测试,此种方法不可用,因为允许最大连接数不可修改,默认为2)。
第二个答案:这是因为windows2003仅支持2个终端用户的登陆。当这种情况出现后,多数人选择的是给机房打电话进行重启服务器。可是带来的损失也 是显而易见的。那么我们有什么办法来解决呢?方法当然是有的。我们只需要在一台2003的机器上运行“tsmmc.msc”就可以打开远程桌面连接,在这 里我们添加一个新的连接,输入对方的IP地址帐号和密码后就可以成功登陆到对方的桌面中,这时可以再踢下一个用户。就可以解决终端连接数超过最大的问题。

第三个答案:

1、修改终端服务配置
开始 -〉控制面板 -〉管理工具 -〉终端服务配置
左边选择“连接”后双击右边的RDP-Tcp,打开属性设置对话框
选择“会话”标签,选中第一个“替代用户设置”,修改“结束已断开的会话”的时间,此处我修改为“10分钟”,这样当断开连接10分钟内没有再次连接的话,系统就会自动结束这个会话

2、修改组策略
这个级别要高于终端服务配置,在这个里面修改后,上面的终端服务配置那几个修改内容就会变灰,无法修改了。
开始 -〉运行 -〉gpedit.msc 左面计算机配置-〉管理模板-〉windows组件-〉终端服务
右面双击限制连接数量打开设置对话框,选择“已启用”,在结束已断开的会话中选择时间。

今天才知道有一个很简单的方法 mstsc /console

2012-1-30 17:44 Monday  
第1种方法:使用rotatelogs
第1种方法是网上比较流行的做法。
编辑httpd.conf文件,将CustomLog "logs/access.log" common注释掉
加入如下一行:
CustomLog "|bin/rotatelogs logs/access-%Y-%m-%d.log 86400" common
86400代表一天,表示每天生成一个日志文件。
%Y-%m-%d代表年-月-日
第2种方法:使用mod_log_rotate
第2种方法要利用mod_log_rotate.so模块。
1.首先下载mod_log_rotate.so模块,网站http://www.apachelounge.com/download/下载最新版本。目前版本mod_log_rotate-1.00a-w32.zip
2.将mod_log_rotate.so文件拷贝到Apache2/modules目录下。
4.编辑httpd.conf,
加入一行:
LoadModule log_rotate_module modules/mod_log_rotate.so
写日志的地方修改为CustomLog logs/access_log.%Y%m%d-%H%M%S common
再加入下列三行:
RotateLogs On #代表启用自动生成日志;
RotateLogsLocalTime On #代表使用本地时间;
RotateInterval 86400 #代表每天生成
5.重新启动apache,搞定。
2012-1-30 17:43 Monday  
Windows下:
1、开启安全模式,可以禁用exec()、system()等函数
2、在httpd.conf中用php_admin_value open_basedir限制PHP的存取目录
3、在php_admin_value open_basedir别忘了加上php.ini中指定的PHP临时上传目录和session保存目录,不然会无法上传文件、存取session
php.ini中按如下配置:
upload_tmp_dir = "E:/APMServ5.2.0/PHP/uploadtemp/"
session.save_path = "E:/APMServ5.2.0/PHP/sessiondata/"

4、更多内容参考我的APMServ软件的配置 [url]http://apmserv.s135.com[/url]

httpd.conf配置(假如将PHP读写权限限制在E:\smis目录下)

Apache2.0配置示例:
<VirtualHost *:80>
ServerName [url]www.abc.com[/url]
DocumentRoot "E:/smis"
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/smis/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</VirtualHost>




Apache2.2配置示例:

<VirtualHost *:80>
ServerName [url]www.abc.com[/url]
DocumentRoot "E:/smis"
</VirtualHost>
<Directory "E:/smis">
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/smis/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</Directory>
2012-1-30 17:43 Monday  
1. 用打开“httpd.conf”配置文件。

  2. 添加以下内容。

  Alias /icons/ "D:/Apache2/icons/"

  (设置虚拟目录名为“icons”,放到网站根目录的“icons”内,其真实地址为“D:/Apache2/icons/”。请注意,“ /icons/”以斜线结束,这就要求输入访问地址时也要输入最后的斜线,如“http://10.2.1.103/icons/”,如果这里省略的话, 就可以输入访问地址时省略,不过系统会自动给加上这一斜线。真实地址“D:/Apache2/icons/”因安装位置而不同,需要注意)

  (设置虚拟目录属性)

  Options Indexes MultiViews

  (当没有主页时以是否显示文件及文件夹)

  AllowOverride None

  Order allow,deny

  Allow from all

  3. 回车换行后输入修改的以上内容如下。

  Alias /ziyuan "D:/ftproot/" (访问时可以省略最后的斜线)

  Options Indexes MultiViews

  AllowOverride None

  Order allow,deny

  Allow from all

  4. 保存以上内容,重新启动Apache服务器

2012-1-30 17:42 Monday  
2.2.2 相对定位

    相对定位是一个非常容易掌握的概念。如果对一个元素进行相对定位,它将出现在它所在的位置上。然后,可以通过设置垂直或水平位置,让这个元素“相对于”它 的起点进行移动。如果将top设置为20像素,那么框将出现在原位置顶部下面20像素的地方。如果将left设置为20像素,那么会在元素左边创建20像 素的空间,也就是将元素向右移动(见图2-10)。

    #mybox {
      position relative;
      left: 20px;
      top: 20px;
      }

图2-10 对元素进行相对定位

    在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其他框。

    2.2.3 绝对定位

    相对定位实际上被看作普通流定位模型的一部分,因为元素的位置相对于它在普通流中的位置。与之相反,绝对定位使元素的位置与文档流无关,因此不占据空间。普通文档流中其他元素的布局就像绝对定位的元素不存在时一样(见图2-11)。

图2-11 对元素进行绝对定位

    绝对定位的元素的位置相对于最近的已定位祖先元素。如果元素没有已定位的祖先元素,那么它的位置相对于最初的包含块。根据用户代理的不同,最初的包含块可能是画布或HTML元素。

    与相对定位的框一样,绝对定位的框可以从它的包含块向上、下、左、右移动。这提供了很大的灵活性。可以直接将元素定位在页面上的任何位置。

    对于定位的主要问题是要记住每种定位的意义。相对定位是“相对于”元素在文档流中的初始位置,而绝对定位是“相对于”最近的已定位祖先元素,如果不存在已定位的祖先元素,那么是最初的包含块。

    因为绝对定位的框与文档流无关,所以它们可以覆盖页面上的其他元素。可以通过设置z-index属性来控制这些框的堆放次序。z-index值越高,框在堆中的位置就越高。

    绝对定位的元素的位置相对于最近的已定位祖先元素,这使我们能够实现一些非常有意思的效果。例如,假设希望让一个文本段落对准一个大框的右下角。只需对包含框进行相对定位,然后相对于这个框对段落进行绝对定位:

    #branding {
      width: 700px;
      height: 100px;
      position:relative;
      }
     #branding.tel{
     position:absolute;
     right:10px;
     bottom:10px;
     text-align:right;
     }
    <div id="branding">
    <p class="tel">tel:0845 838 6163</p>
    </div>

    相对于相对定位的祖先元素对框进行绝对定位,这在大多数现代浏览器中实现得很好。但是,在Windows上的IE 5.5和IE 6中有一个bug。如果试图相对于相对定位的框的右边或底部设置绝对定位的框的位置,那么需要确保相对定位的框已经设置了尺寸。如果没有,那么IE会相对 于画布定位这个框。在第9章中可以进一步了解这个bug和修复方法。简单的解决方案是为相对定位的框设置宽度和高度,从而避免这一问题。

    在进行页面布局时,绝对定位是非常有用的工具,尤其是在使用相对定位的祖先元素的情况下。完全可能只使用绝对定位创建出整个设计。为此,这些元素需要具有固定尺寸,这样就能够将它们定位在任何地方而不会有重叠的风险。

    因为绝对定位的元素与文档流无关,所以它们不影响普通流中的框。如果扩大绝对定位的框(例如,通过增加字号),周围的框不会重新定位。因此,尺寸的任何改变会导致绝对定位的框产生重叠,从而破坏精心调整过的布局。

    固定定位

    固定定位是绝对定位的一个子类别。差异在于固定元素的包含块是视口。这使我们能够创建总是出现在窗口中相同位置的浮动元素。这种情况的一个示例可以在 snook.ca上看到(见图2-12)。博客评论表单采用固定定位,这使它在页面滚动时一直出现在屏幕上的相同位置。这有助于改进易用性,用户不必为了 发表评论而一直滚动到页面底部。

    图2-12 在snook.ca上,屏幕右边的评论区域采用固定定位,因此一直出现在视口中的相同位置

    不幸的是,IE 6和更低版本不支持固定定位。为了解决这个问题,Jonathan Snook使用JavaScript在IE中重现了这个效果。

购买《精通CSS:高级Web标准解决方案》:http://shop.csai.cn/itbook/itbookinfo.asp?lbbh=10014414

2012-1-30 17:41 Monday  

不能像php那样的语言一样定义,只能采用

function showAlert(str,alertw,alerth){

   var alertw=arguments[1]?arguments[1]:400;
   var alerth=arguments[2]?arguments[2]:100;

}

这样的方式定义..

借肋于arguments 是实参数组

2012-1-30 17:40 Monday  

用smarty插件,

function smarty_prefilter_chpath($tpl_source,&$smarty)
{
/*这个会将绝对路径也修正,不对
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5",$tpl_source);
    */
    /*这个会将js也修正
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */

    /*这个不修正js */
    return preg_replace("/(<(img.*?src|link.*?href)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
}

文件取名prefilter.chpath.php,放到plugins,用 $smarty->load_filter('pre','chpath');就行了

最新修改此函数如下:

function smarty_prefilter_chpath($tpl_source,&$smarty)
{
/*
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5",$tpl_source);
    */
    /*
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */
    /*
    return preg_replace("/(<(img.*?src|link.{1,100}href)=([\"']))(([^(http:\/\/|\{\$imgurl\})])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */
    return preg_replace("/(<(img.*?src|link.{1,100}href)=([\"']))(images|style)(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5$6",$tpl_source);
}