博主资料

留言短消息 加为好友 收藏

用户ID:  513609
昵称:  wilensky
年龄:  25

标题

忙着筹备组自己的网站,买域名,空间。忙得不亦乐乎!

日历

2009 - 7
   1234
567891011
12131415161718
19202122232425
262728293031 
«» 2009 - 7 «»

日志分类

日志文章列表

2005年11月13日 09:18:41

MySQL 4.1的中文乱码问题

用默认的配置,在网页中数据正常,但用phpMyAdmin浏览时数据库中中文乱码(与phpMyAdmin无关,是MySQL的问题),而MySQL4.0没这问题.,我现在的mysql4.1.15还是这个问题!

经过几次尝试发现,如果要网页中数据正常,则把my.ini中[mysqld]处(还有一处为[client],无需修改)的default-character-set设为latin1,即default-character-set=latin1,然后重起MySQL;

如果要phpMyAdmin浏览正常,则把latin1改为gb2312,然后重起MySQL即可.

但还是没找到更简单的方法使两者同时显示正常-_-!!

类别: 无分类 |  评论(0) |  浏览(14455) |  收藏
2005年11月13日 09:08:44

Windows平台下PHP5.0+Mysql4.1.x环境架设

PHP 是一种新型的 CGI 程序编写语言,易学易用,运行速度快,可以方便快捷地编写出功能强大,运行速度快,并可同时运行于 Windows、Unix、Linux 平台的Web后台程序,内置了对文件上传、密码认证、Cookies 操作、邮件收发、动态 GIF 生成等功能,PHP 直接为很多数据库提供原本的连接,包括Oracle、Sybase、Postgres、Mysql、Informix、Dbase、Solid、Access 等,完全支持ODBC接口,用户更换平台时,无需变换 PHP 代码,可即拿即用。

  总而言之PHP是现在很时髦的一种技术,总是看到一些新手在论坛等地发问怎样搭建一个PHP开发及工作的平台,网上有很多这方面的资料但是都写的过于简单,这里,结合我自己的理解和经验,为新手们写了这样的一篇文章。





本文示范的系统:WindowsXP pro+SP2



可选择操作系统:WindowsNT及以上(不支持Windows98)



环境对硬件需求:

233MHz以上CPU,推荐733MHz以上的CPU

128M以上内存,建议512M以上内存

100M以上的磁盘空间



软件介绍及下载:

Apache:根据Web服务器调查公司Netcrafe(http://www.sms55.cn/reg.htmwww.netcraft.co.uk/Survey/)调 查,全Internet有50%以上的Web服务器都在用Apache。Apache和Ms IIS 同属于Web服务器。属于免费服务器,体积小,安全程度高(Apache与IIS选用其一即可)



本文选用:Apache V2.0.53 For Windows



官方网站:http://www.sms55.cn/reg.htmwww.apache.org/









IIS:Windows提供的Internet信息服务器,可由Windows安装光盘通过安装Windows可选组件的方式安装。其中Windows2000中为IIS5.0,WindowsXP中为IIS5.5,Windows2003中为IIS6.0,(Apache与IIS选用其一即可)



官方网站:http://www.sms55.cn/reg.htmwww.microsoft.com/



下载地址:可由Windows安装光盘中安装





PHP:用来解析编辑出来的PHP文件,配置PHP也是围绕它为核心,可以说是整个环境的主体,也是本文的要点本文选用:PHP V5.0.4 For Windows



官方网站:http://www.sms55.cn/reg.htmwww.php.net/











MYSQL:是一个多线程的,结构化查询语言(SQL)开源数据库系统,据说是PHP的最佳排挡,执行性能高,运行速度快,使用简单。是一个很不错的数据库系统。



本文选用:MYSQL V4.1.11 for Windows



官方网站:http://www.sms55.cn/reg.htmwww.mysql.com/











PHPMyAdmin是Sourceforge的一个开源项目,运行在PHP环境中非常好的MYSQL管理软件,通过PHPMyAdmin可以对数据库进行完全操作,例如建立、复制/删除数据等等。



本文选用:PHPMyAdmin V2.6.2rc1



官方网站:http://www.sms55.cn/reg.htmsourceforge.net/projects/PHPmyadmin











Zend Optimizer:(可选)用优化代码的方法来提高PHP应用程序的执行速度。实现的原理是对那些在被最终执行之前由运行编译器(Run-Time Compiler)产生的代码进行优化。一般情况下,执行使用Zend Optimizer的PHP程序比不使用的要快40%到100%。快速

运行PHP程序可以显著降低服务器的CPU负载,并可以减少一半的反应时间,也就是从访问者点击链接到服务器开始读取页面之间的时间



本文选用:Zend Optimizer V2.5.7 For Windows











Zend Studio:(可选)Zend公司的旗帜性产品,提供对PHP5的完全支持,集成软件包包括了用于编辑,调试,配置PHP程序所需要的客户及服务器组件,软件包具有工业标准的PHP开发环境,代码完成引擎,功能齐全的调试器等。



本文选用:Zend Studio V4.0.1











注1:有的人可能会问为什么不选择PHP4,毕竟PHP4是比较成熟得一个版本,但是我们需要PHP5才能很好的支持MYSQL4.1.x



注2:上面提到得几个软件都是可以选择安装路径得,我个人建议处于安全方面考虑,不要将它们放在系统盘中,但是最好都放在一个盘符下。











Windows平台下PHP5.0+Mysql4.1.x环境架设(2)





安装及配置过程:



1.PHP5的安装



和PHP4相比PHP5的安装过程要相对简单一些



第一步:首先解压PHP V5.0.3 For Windows.zip,释放路径按照自己的习惯就可以,比如:X:\PHP,可以改文件夹的名字为PHP



PHP5和PHP4的内容有很大不同简单说明一下PHP目录下各个文件夹的作用



ext:PHP扩展库的dll,这是PHP搜索扩展库和存放扩展库的位置



PEAR:是PHP的扩展与应用库(PHP Extension and Application Repository)的存放路径



install.txt安装说明文件



PHP5ts.all主dll文件



PHP.exe:CGI可执行程序



PHP.ini-dist:PHP的配置文件







第二步:复制PHP目录下的PHP5ts.dll到C:\Windows\目录下(Windows 2000/NT为C:\winnt\目录)





第三步:复制PHP.ini-dist或PHP.ini-recommended文件复制到c:\Windows\目录下(Windows 2000/NT为C:\winnt\目录)并且重命名为PHP.ini。这里要说明一点的是,这两个文件,PHP.ini-dist和PHP.ini-recommended,我个人认为无论哪一个复制后重命

名为PHP.ini都可以起到同样作用,大多数人选择PHP.ini-dist,这里也用的是PHP.ini-dist做示范,并且要注意,PHP目录下最好不要有PHP.ini文件,或者说不要有和在Windows目录下不同的PHP.ini文件。





第四步:对PHP.ini文件进行修改

PHP.ini文件中的各个部分的含义在文件中每行开头的分号后面注释的很清楚,我这里只是对其中几个比较重要或是可能需要更改的地方按照从上到下的顺序来做一下解释,以方便和我一样e文不是很好的朋友。大家可以在文档中搜索找到相应的字段。



Resource Limits



这部分是PHP对系统资源的配置



max_execution_time = 30:每个脚本的最大执行时间, 按秒计



可更改为max_execution_time = 60



max_input_time = 60:分析每个脚本请求的最大时间



可以不用更改



memory_limit = 8M:一个脚本最大可使用的内存总量



可以不用更改



Error handling and logging





这部分是设置PHP警告级别的,是否允许PHP运行出错的时候给出相应的警告或者提示,详细的解释如下



; E_CORE_ERROR: 发生于PHP启动时初始化过程中的致命错误

; E_CORE_WARNING: 发生于PHP启动时初始化过程中的警告(非致命性错误)

; E_COMPILE_ERROR: 编译时致命性错误

; E_COMPILE_WARNING: 编译时警告(非致命性错误)

; E_USER_ERROR: 用户产生的出错消息

; E_USER_WARNING: 用户产生的警告消息

; E_USER_NOTICE: 用户产生的提醒消息



这里我们将警报级别设置为E_ALL 和E_NOTICE,即找到error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT



将其修改成:



error_reporting = E_ALL & ~E_NOTICE



display_errors = On



更改为



display_errors = Off



Data Handling



这部分设置PHP的数据信息处理,其中可能需要更改的有下面的几个



register_globals = Off:是否将EGPCS变量注册为全局变量。 若你不想让用户数据不在全局范围内混乱的话,你可以关闭它。



可更改为



register_globals = On或不更改



post_max_size = 8M:PHP将接受的POST数据最大大小



可更改为



post_max_size = 16M



Paths and Directories



这一部分是设置PHP文件搜索路径的,如果需要多个路径,用分号格开



首先找到到如下字样



; Windows: "\path1;\path2"



;include_path = "X:\PHP\pear"



我们要设置一个搜索路径指向X:\PHP\pear目录,这里的X:\PHP\是你的PHP的安装路径,我们要去掉Windows: "\path1;\path2"下面的;include_path = "X:\PHP\pear"前面的分号,并将引号中的文件路径改成X:\PHP\pear即修改成



; Windows: "\path1;\path2"



include_path = "X:\PHP\pear\"



然后可以找到



extension_dir:



这里设置的是PHP搜索扩展库的位置,将其路径设为ext文件夹的位置,即改成:



extension_dir="X:\PHP\ext\"



File Uploads



这一部分设置的是PHP上传文件的相关信息



upload_max_filesize = 2M:



允许上传的的最大文件大小,默认为2M



upload_tmp_dir:



上传文件存放的临时文件夹,如果不设置临时文件夹,则上传文件被放置到系统临时文件夹里面)



这里根据大家的实际需要修改,注意设置完毕后去掉前面的分号才能生效



Dynamic Extensions



这里是PHP扩展设置部分,列出了PHP所有的可支持扩展,前面都加了分号注释,表示目前PHP配置不支持扩展,我们可以将分号去掉让PHP支持该扩展



下面列出的是几个常用且较实用的PHP扩展



;extension=php_curl.dll:CURL扩展支持



;extension=php_gd2.dll:GD图像库扩展支持,包括生成图像等的一系列函数



;extension=php_ming.dll:Ming库扩展支持,该扩展库提供生成flash文件的相关函数



;extension=php_pdf.dll:PDF库扩展支持,该扩展库提供操作PDF文件的函数的支持



;extension=php_xsl.dll:提供XSL扩展支持,该扩展提供对XML的转换



;extension=php_mysql.dll:提供MYSQL扩展支持



注意,在PHP4中MySQL的支持是内建的,因此,不需要用它的dll,但是这里我们需要把前面的注释去掉





第五步:PEAR的安装

PEAR是一个功能强大的代码仓库,为你的代码提供很强的扩展性,可以很大程度的提高项目效率。我们选择的PHP种已经自带PEAR了,现在我们来安装它



在PHP目录下找到go-pear.bat双击,会出现一个命令提示窗口,显示欢迎信息和需要下载的PEAR包





按回车键继续安装,提示是否使用代理来下载这些PEAR包,如果你要使用代理,一定按如下格式输入:http://www.sms55.cn/reg.htmuser:password@proxy.myhost.com:port/如果不用,直接按回车,然后会有一个安装和下载的过程,最后提示你安装成功









Windows平台下PHP5.0+Mysql4.1.x环境架设(3)





2,选择服务器种类,Apache还是IIS?



这里看个人喜好吧,如果选用IIS,那么服务器将同时支持ASP,但是不建议同时安装两种服务器软件,会有端口冲突,也有通过修改端口或同时嵌套使用的,这里就不做介绍了。



Apache2.0.53的安装与配置



第一步:安装Apache



我们下载来的是一个.exe安装程序,不用说什么了,双击它,会看到安装界面



点击Next,接下来会出现是否同意安装协议,软件介绍等的对话框,并点击Next会看到下面的对话框,这里会有三个地方让你填写第一个填入你的域名,比如我的是fcg.eicp.net,也可以是IP



第二个填入你的主机头名,比如我的是www. fcg.eicp.net ,也可以是IP



第三个填入管理员的信箱,填你用的就可以,不重要



底下有一个选择,作为服务器用,建议选择第一个,意思是使它作为一个系统服务,工作在80端口。第二个是只能当前用户使用,工作在8080端口,需要手动启动



添好后点击Next选择Custom,下一步选择自己需要安装的组件和安装路径然后点击Next,开始安装。



安装好后,系统托盘处会有Apache监视器图标。这时候可以打开浏览器,输入地址 127.0.0.1 测试一下服务器的状态。会出现如下的画面:







您能看见这个页面,说明Apache web server 已经安装成功。您可以在这个目录中增加内容,或者把这个页面替换掉。



这不是你想看见的页面吧?

之所以会看见这个页面,是因为网站管理员改变了这个站点的设置。如果有疑问,请咨询维护此站点的人员。 Apache软件基金会, 即此站点所使用的网站服务器软件的开发者,不负责此站点的维护工作,也无法为您解决设置上的问题。



Apache 文档已经包含在此发行版中。



您可以在使用Apache的网站服务器上,自由地使用下面的图片。感谢使用Apache!







第二步:httpd.conf 的配置



首先来说明一下Apache目录下各个文件夹的作用:



bin:存放Apache运行的的各个软件,包括一个名为ad.exe的服务器调试工具



conf:Apache的配置文件放在这个文件夹里面,我们要修改其中的httpd.conf文件



htdocs:默认的web主目录,我们可以在httpd.conf中修改网站根目录的路径



下面让我们来修改httpd.conf文件



httpd.conf文件是Apache工作的重要配置文件,在X:\Apache Group\Apache2\conf里面,找到并用记事本打开。大家可以参照下面进行修改:





ServerRoot "X:/Apache Group/Apache2"



这个是服务器的根路径,不用更改





MaxKeepAliveRequests 100



最大在线人数,根据你需要的人数和你服务器机器的配置来确定







Listen 80



Apache2监听端口,一般情况下不用改,也就是网站的http端口







DocumentRoot "C:/htroot"



这个是你放置网页文件的地方,编译后的PHP文件就放在这里,一定要确保这个文件夹存在,这个也就是是你的站点目录







<Directory "C:/htroot">



同上,跟着上一步一起修改,确保文件夹的存在







DirectoryIndex index.htm index.php index.html



这个是服务器默认打开的主页文档类型,可以改成如上的,中间用空格格开







LanguagePriority zh-CN zh-TW en ca cs da de el eo es et fr he hr it ja ko

ltz nl nn no pl pt pt-BR ru sv



语言优先级,把中文(zh-CN zh-TW)的部分剪切放到前面(也就是将原来文件中的相应部分改成如上的)







另外,如果想要禁止主页浏览,找到如下代码:



Options Indexes FollowSymLinks



去掉其中的indexes即可,即改成:



Options FollowSymLinks







第三步:PHP的挂载



还是在httpd.conf中搜索LoadModule找到相关章节 ,在后面添加如下内容







LoadModule php5_module "X:/PHP/php5Apache2.dll"



AddType application/x-httpd-php .php







注意:其中X:PHP/PHP5Apache2.dll 中的X:/PHP/是你安装PHP的路径



重启Apache使修改生效







IIS的安装与配置



Windows2000和WindowsXP--Pro默认是没有安装IIS的,WindowsXP-Home的用户因为无法安装IIS而只能使用Apache作为服务器。







安装IIS,我们需要一张Windows的安装盘,这里用WindowsXP-Pro做示范,其他的版本大同小异,光盘自动运行后选择“安装可选的Windows组件”



而后会出现一个对话框,看到Internet信息服务(IIS)了么,我们需要的就是这个,将该项勾选并点击下一步开始安装



安装结束后我们会在控制面板>管理工具中看到一个“Internet信息服务”。



双击打开,在左侧选择本地计算机,右键点击“默认站点”(Windows2000中是默认web站点),选择属性,会看到默认站点属性的对话框打开后找到主目录标签,我们可以在这里修改网站的根目录,就是C:\inetpub\wwwwroot 的位置,点击配置按钮,进入“应用程序配置对话框我们浏览找到php5isapi.dll,就在你刚才安装PHP的地方,作为应用扩展,在扩展名中写入.PHP



然后我回到默认网站属性对话框,找到文档选项卡,添加一个PHP的目录默认文件:index.php



注:因为本文采用的是WindowsXP系统,安装便到此为止,而使用Windows server 2003的朋友们还要IIS管理窗口左侧的web服务扩展中,右键点击“添加一个新的web服务扩展”写入PHP服务扩展,将要求添加的文件同样指向上文的php5isapi.dll,并选中扩展状态为允许,来进行进一步的配置。



重启IIS使修改生效,到此,IIS的安装告于段落









Windows平台下PHP5.0+Mysql4.1.x环境架设(4)







3.MYSQL的安装



这里我们选用mysql4.1.11 for Windows版本,这是最新的版本,老版本的安装过程网上已经有了很详细的介绍,这里就不做说明了





第一步:双击.exe文件出现的第一个需要选择的对话框是Setup Type 也就是安装种类,这里我们可以选择Custom,根据自己的需要来安装组件和配置安装路径



点击Next,右键点击对话框出现几个硬盘形状的图标,根据自己的需要选择安装组件,



点击窗口右下的Change按钮更改安装路径的,设置好后,点击Next开始安装安装到最后会有如下一个对话框在这里的三个选项分别是:



1:如果你没有MYSQL.com帐户,选第一个,创造一个新的免费的MYSQL.com帐户



2:如果你有MYSQL.com帐户,选第二个,填入已经注册好的邮箱名和密码



3:跳过此步骤



我们选第一个



接下来会一次出现三个对话框,在三个对话框中有* 号的部分是必须要填的,按顺序分别是邮箱名,密码,确认密码;first name ,last name;邮政编码,国家,省名。国家名选china,省名选other or N/A即可4.1.x和4.0.x系列版本很大一个区别就是在安装完毕后不是运行 mysql文件夹下面的winmysqladmin.exe来启动服务器后设置选项,而是有一个设置的过程。



第二步:设置MYSQL



首先你会看到这样的一个窗口,这里有两个选项,分别是详细配置和标准配置,小型应用选第二项就可以了点击Next后出现下面的对话框,这里是重要的,一定要在下拉菜单里选择MySQL41,否则不能正常启动,下面的选项是是否应用命令行,最好选上点击Next后设置数据库密码的对话框,中间偏右和下面的选项分别是是否允许远程控制和是否允许匿名帐号登入,为了安全,不要选择好了,点击Next后出现最后的对话框,点击Execute按钮数据库服务器便启动了,依次出现四个对号后点击Finish结束安装



mysql4.1.x和以前得版本并不一样,在运行时系统托盘里并没有提示,打开任务管理器和Windows服务,会发现mysql server已经运行





第三步:让PHP5支持mysql





在c:\Windows找到刚才修改的php.ini文件



找到;extension=php_mysql.dll



去掉前面的";"



即改成extension=php_mysql.dll(如果你在前面没有修改的话)



然后将以下三个文件



X:\PHP\libmysql.dll



X:\PHP\ext\php_mysql.dll



X:\PHP\ext\php_mysqli.dll



拷贝到C:\Windows\system32下



重启Apache或者IIS,PHP5就支持mysql了





注:MySQL 4.1 及其后版本验证协议使用的密码哈希算法与老的客户端不兼容。所以很可能出现一种情况,那就是你所需要用到MYSQL的服务端,比如说论坛,博客,私服服务端等即使填入和刚才设置的用户名和密码也会提示因为用户名和密码不匹配而连不上数据库,我们要采用这样的方法来解决这个问题:开始菜单中找到刚刚安装的MYSQL命令行工具,输入root的密码后键入如下的字样:



->SET PASSWORD FOR

->'yourusername'@'localhost' = OLD_PASSWORD('yourpassword');



在yourusername部分是你的数据库用户名,可以是root,也可以是马上我们要提到的在PHPmysql中设置的新的用户,yourpassword部分添入该帐号所对应的密码



这里要注意第二句括号后面的分号一定要打上分号,否则不会生效,然后你会看到修改成功的成功的提示。这样你就可以正常使用了









Windows下PHP5.x+MYSQL4.1.x开发·工作环境的架设(5)



4.phpmyadmin的安装



解压压缩包,改文件夹名为phpmyadmin或者其他,复制文件夹到你的网站根目录下,也就是你在Apache的httpd.conf文件中修改设置的那个



在浏览器输入 http://www.sms55.cn/reg.htm127.0.0.1/phpmyadmin/



会发现一个错误提示,不要紧,修改如下几项



用记事本打开config.inc.php,在phpmyadmin的根目录下



找到



$cfg['PmaAbsoluteUri'] =' '



修改为:



$cfg['PmaAbsoluteUri'] = 'http://www.sms55.cn/reg.htmlocalhost/phpmyadmin/ ;



注意:这里的链接是你phpmyadmin的网站路径比如当你把文件夹目录改成myadmin,这个路径则是'http://www.sms55.cn/reg.htmlocalhost/myadmin/ ;



找到



$cfg['Servers'][$i]['auth_type'] = 'config';



修改为



$cfg['Servers'][$i]['auth_type'] = 'http';



找到



$cfg['Servers'][$i]['user'] = ' ';



修改为



$cfg['Servers'][$i]['user'] = 'root';



找到



$cfg['Servers'][$i]['password'] = ' '



修改为



$cfg['Servers'][$i]['password'] = '你刚才设定得mysql密码';



最后的两步经过我的试验,在重新配置MYSQL密码后(就是前面提到的在MYSQL命令行中重新配置)可以不用更改,而且出于安全性考虑,这里还是不要写入密码的好,但是为了照顾到可能出现的连不上数据库的情况,还是写给大家做一个参考



然后重新在IE浏览器里输入http://www.sms55.cn/reg.htm127.0.0.1/PHPmyadmin/



敲入用户名“root”和密码后,就可以重新进入到phpmyadmin管理页面了,选择中文界面,操作很简单,这里就不做另外的说明了。



这里建议大家建立一个新的有密码的用户名,因为root用户的权限太大,为了安全最好还是建立一个新的具有相应权限的用户比较合适



至此,一个PHP5.0.3+MYSQL4.1.11的工作环境就架好了,这时你可以在网站根目录下建立一个新的文本文档,写上这样一句代码:



<?php

echo phpinfo();

?>



并保存为test.PHP文件,在浏览器中输入http://www.sms55.cn/reg.htm127.0.0.1/test.PHP你将会看到刚刚安装的PHP,Apache,MYSQL的信息









Windows下PHP5.x+MYSQL4.1.x开发·工作环境的架设(6)



6.Zend Studio的安装



注意:在安装zend studio时要确保你已经连上了互联网开始安装Zend Studio的客户端,开始和其他的软件一样,无非是accept和Next.这里我们要把Zend studio Server选中,然后继续Next,选择安装路径.



Choose Shortcut Folder界面是选择一个快捷方式的位置,默认即可,下面有个Create lcons for all users 这个的意思应该是要不要为所有的用户在菜单里面创建图标,根据个人情况决定Extension associate这里是为zend选择扩展支持,前三个一定要选,后面的随意



Default PHP settings这里我们要选择 PHP version5.x



然后点击next,安装软件会自动连接Studio Server的下载服务器,连接成功后会有一个提示,点击download开始下载这些组件。中间的set proxy按钮是调整代理服务器,你也可以使用其他的代理服务器工具实现。



下载完毕以后程序会自动开始安装,按照默认目录安装,选择于前面对应的IIS或者Apache服务器,点确定这里会出现一个对话框,是让你选择安装PHP或者是使用已经安装了的PHP,我们选择已经安装的PHP



然后会让你选择PHP.ini位置,Apache位置等,一路按照默认安装,最后会弹出提示对话框,点击确定继续,按照上面的提示Debug级别选择Always,然后会出现设置管理员密码的对话框,这里是用来管理zend server center的密码这里选择是,其余的继续一路Next到安装结束,点击Finish转到Zend Studio client的安装界面,会出现提示问你要不要安装Zend SafeGuard Suite 我们选择yes



注意,这里也是需要网络连接的,而后,同上面安装Studio Server时候一样,会出现一个提示下载的界面,点击Download然后要选择Zend SafeGuard Suite的安装路径,和前面的保持一致,一路Next,最后点击Done结束安装。



安装程序会自动启动Zend Studio Server,这里,需要你有一个注册名和许可证号,如果没有点击对话框右下脚给出的连接进入注册页面在打开的网页中,按照提示从上到下分别填入用户名,密码确认密码,邮箱,first name ,lastname,国家。点击Submit进入下一步,这里提示一下,邮箱最好用如gmail.hotmail这样的国外邮箱,一会要发给你的确认邮件和激活邮件,国内的邮箱可能收不到



打开你的邮箱,会发现邮件已经发来了,题目是:Zend account email activation ,点击邮件中给出的确认连接,进入确认界面,然后zend的网站会再次给你的邮箱发送一封邮件,(Zend Studio Evaluation Activation Information),包含给你的一套有效期为21天的注册名和许可证号我们把得到的注册名和许可证号填入刚才出现的对话框中,点击OK(不要点Buy now 哦),便大功告成了







最后,我们要把php.ini中被zend修改的的地方再改回来



; Directory in which the loadable extensions (modules) reside.



extension_dir = .”X:\zend\lib\PHP_ext”



改回成



; Directory in which the loadable extensions (modules) reside.



extension_dir = ./(或extension_dir = “X:\PHP\ext\”)



类别: 无分类 |  评论(0) |  浏览(18846) |  收藏
2005年11月12日 19:28:08

phpbb的模版思想简述.......

    个人觉得phpbb的论坛做的要比phpwind成熟一些,我现在在用phpbb,因为它是opensource的,所以我们可以自己改动自己想要的地方,这是转自:phpbb.com的一片文章,原文章链接在最底部!



-----------------------------------------------------------------------------------------
Description: Information on how the phpBB Template system works
Author: Xore
Date: Wed May 12, 2004 11:58 pm
Type: Tutorial
Keywords: template,tutorial,loop,switch,variable,variables
Category: MODifications

This article will hopefully shed some light on the usage of phpBB 2.0.x template system to enable mod authors to be able to write their own template files properly without much confusion.


1.Template Basics
Before creating a new template file, first consider whether or not you should. If it's very similar or almost identical to another template that already exists, except perhaps that you add a column here or there, or add another table with some extra data at the top or bottom of the page, it might just be a better idea to alter the current template. If you're not creating a new template, but instead altering an old one, disregard points (2) and (3), and skip right to (4)


2.Creating a new template file
A template file can have any extension, but by phpBB standards, we prefer that you limit it to the extension .tpl (makes it compatible with most/all filesystems and allows other programmers to know where the templates are stored in an easier fashion). The file itself is plaintext/html, with just a couple of extra html-style tags that allow you to format your template data properly.


3.Specifying a template file
To begin with, you need to include the standard phpBB code (if it hasn't been included already) to gain access to the template, amongst other things.
Code:
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);

//
// Start session management
//
$userdata = session_pagestart($user_ip, PAGE_PROFILE);
init_userprefs($userdata);
//
// End session management
//

The template inclusion is fairly easy:
Code:
    $template->set_filenames(array(
      'body' => 'your_template.tpl')
    );


It's also a good idea at this point to get the header specified (if it hasn't been already), assuming you want the normal phpBB menu and stuff at the top that you get in all the regular phpBB pages. This will also let you set the title of the page:
Code:
    $page_title = $lang['My_title']; // You'll have to set this in a $lang file somewhere
    include($phpbb_root_path . 'includes/page_header.'.$phpEx);

Just be sure that you remember to render it at the end of the file:
Code:
    $template->pparse('body');

Don't do this before you've finished passing variables to the template engine... anything you do afterwards won't be included!
The 'body' in pparse() corresponds to the 'body' in set_filenames()

Finally, you want to include the page footer (if it hasn't been already):
Code:
    include($phpbb_root_path . 'includes/page_tail.'.$phpEx);



4.Basic template variables
There are two sides to making a template variable. The first side is the .php side, to generate the data that goes into the variable. The second is the .tpl side, which shows where in the document the variable goes.

PHP-side
Once you've specified your template file, you can set a template variable as follows:
Code:
$template->assign_var('VARIABLE' , $value );


Template-side
Inside the template, you would put the associated variable wherever you will in the html, surrounded by curly braces { }:
Code:
{VARIABLE}


The names of the template variables can contain both lower and uppercase letters (a-zA-Z), numerical digits (0-9), the hyphen (-), and the underscore (_), however, standard phpBB code uses only uppercase letters, numbers, and underscore.

If you want to set more than one variable at the same time, you can do this as follows:

PHP-side
Code:
$template->assign_vars(array( 'VARNAME1' => $phpstringval1,
                    'VARNAME2' => $phpstringval2,
                    'VARNAME3' => $phpstringval3,
                    ... etc ..
                    'VARNAMEn' => $phpstringvaln
                  )
              );


Template-side
Code:
{VARNAME1} {VARNAME2} {VARNAME3} ... etc ... {VARNAMEn}



5.Switches
Switches are like "optional" parts of the template. They only appear if the switch is set. If the switch is not set, it's simply not shown.

PHP-side
Creating a switch is pretty easy. Just test whether you want it turned on or not, then use the template's assign_block_vars() to set it accordingly:
Code:
if ( $userdata['session_logged_in'] )
{
  $template->assign_block_vars('switch_user_logged_in',array() );
}


Template-side
Inside the template, you would set the associated tags as follows:
Code:
<!-- BEGIN switch_user_logged_in -->
... stuff that only shows up when the user is logged in...
<!-- END switch_user_logged_in -->

Note that it's important that the <!-- BEGIN ... --> and <!-- END ... --> appear on their own lines otherwise they might not work


Unfortunately there is no "if - else" kind of switch, but there are ways of getting around that, as you'll see:

PHP-side
Code:
if ( $userdata['session_logged_in'] )
{
  $template->assign_block_vars('switch_user_logged_in',array() );
}
else
{
  $template->assign_block_vars('switch_user_logged_out',array() );
}


Template-side
Code:
<!-- BEGIN switch_user_logged_in -->
... stuff that only shows up when the user is logged in...
<!-- END switch_user_logged_in -->
<!-- BEGIN switch_user_logged_out -->
... stuff that only shows up when the user is logged out...
<!-- END switch_user_logged_out -->




6.Loops
Now we're going to start getting into some more complicated stuff. What happens if you want to show something more than once? You could duplicate the html in your template, which is easy enough, but what happens if this is non-static, and instead specified in the PHP?

For example, lets say we want to repeat some text 10 times:

PHP-side
This is very similar to making a switch, except you're calling the same string in assign_block_vars() multiple times.
Code:
$n = 10;
for ( $i = 0; $i < $n; $i++ )
{
  $template->assign_block_vars('my_loop',array() );
}



Template-side
This side is pretty much the same:
Code:
<!-- BEGIN my_loop -->
This text will show up ten times
<!-- END my_loop -->


That was pretty simple. But it's not very useful... unless of course, you have different data in each of the loop iterations, which brings us to...


7.Loop variables
Have you been wondering what that empty array() in assign_block_vars() is all about? This is it. Lets say you want in each loop iteration to say which iteration it is, out of however many there are:

PHP-side
similar to the way we had regular template variables, we specify loop variables inside the loop array()
Code:
$n = 10;
for ( $i = 0; $i < $n; $i++ )
{
  $template->assign_block_vars('my_loop',array( 'THIS_LOOP' => ($i + 1),
                                  'TOTAL_LOOPS' => $n
                                )
                      );
}



Template-side

Code:
<!-- BEGIN my_loop -->
This text will show up ten times (this is #{my_loop.THIS_LOOP} of {my_loop.TOTAL_LOOPS} )
<!-- END my_loop -->

An important thing to notice here is that before the variable, you need to put the loop name followed by a dot (.), if you don't, the template engine will thing it's a regular template variable, and (probably) won't find a match, and so it won't display anything.


You'll notice that the value of TOTAL_LOOPS is always the same. This is a bit of a waste, because we're storing TOTAL_LOOPS for each loop, but there's only one value. As long as it's within the same loop structure at a higher level, (if you don't understand what that means, don't worry) you can display variables that aren't in that loop's scope:

PHP-side
Code:
$n = 10;
$template->assign_vars(array ( 'TOTAL_LOOPS' => $n ) );
for ( $i = 0; $i < $n; $i++ )
{
  $template->assign_block_vars('my_loop',array( 'THIS_LOOP' => ($i + 1) ) );
}



Template-side
Code:
<!-- BEGIN my_loop -->
This text will show up ten times (this is #{my_loop.THIS_LOOP} of {TOTAL_LOOPS} )
<!-- END my_loop -->



Here's another, more complicated (and more applicable) example:
List all the users with user_id between 1 and 25

PHP-side
Code:
$sql = "SELECT user_id, username FROM " . USERS_TABLE . " WHERE user_id >= 1 AND user_id <= 25";
if ( ! ( $result = $db->sql_query($sql) ) )
{
  message_die(GENERAL_ERROR, 'Error retrieving user data', '', __LINE__, __FILE__, $sql);
}
while ( $row = $db->sql_fetchrow($result) )
{
  $template->assign_block_vars('user_row',array( 'USERNAME' => htmlspecialchars($row['username']),
                                'USER_ID' => $row['user_id']
                                )
                    );
}



Template-side
Code:
<table>
<!-- BEGIN user_row -->
<tr><td>{user_row.USER_ID}</td><td>{user_row.USERNAME}</td></tr>
<!-- END user_row -->
</table>





8.Nested loops/switches
This is where it sometimes gets tricky, and code authors get confused. What happens if you want a loop or a switch inside another loop or switch?

For example, you want to show a list of the first twenty-five users, and their emails, but only show the emails if the user looking at the page is an admin or a moderator? Let's add a bit to our last example:

PHP-side
Code:
$sql = "SELECT user_id, username, user_email FROM " . USERS_TABLE . " WHERE user_id >= 1 AND user_id <= 25";
if ( ! ( $result = $db->sql_query($sql) ) )
{
  message_die(GENERAL_ERROR, 'Error retrieving user data', '', __LINE__, __FILE__, $sql);
}
while ( $row = $db->sql_fetchrow($result) )
{
  $template->assign_block_vars('user_row',array( 'USERNAME' => htmlspecialchars($row['username']),
                                'USER_ID' => $row['user_id'],
                                'USER_EMAIL' => $row['user_email']
                                )
                    );
  if ( ($userdata['user_level'] == ADMIN) || ($userdata['user_level'] == MOD) )
  {
    $template->assign_block_vars('user_row.switch_admin_or_mod',array());
  }
}



Template-side
Code:
<table>
<!-- BEGIN user_row -->
<tr><td>{user_row.USER_ID}</td><td>{user_row.USERNAME}</td>
<!-- BEGIN switch_admin_or_mod -->
<td>{user_row.USER_EMAIL}</td>
<!-- END switch_admin_or_mod -->
</tr>
<!-- END user_row -->
</table>



Some important things to notice are that in the PHP, the name of the switch is 'user_row.switch_admin_or_mod', but in the template, the name is only 'switch_admin_or_mod', which inside 'user_row'. This means that you can't create two switches in the same scope and expect them to work inside each other:

PHP-side
Code:
$template->assign_block_vars('switch_user_logged_in',array() );
$template->assign_block_vars('switch_admin_or_mod',array() );


Template-side
Code:
<!-- BEGIN switch_user_logged_in -->
<!-- BEGIN switch_admin_or_mod -->
some text if it's an admin or mod, logged in
<!-- END switch_admin_or_mod -->
<!-- END switch_user_logged_in -->


this won't work, because the template engine will look for 'switch_user_logged_in.switch_admin_or_mod', and it won't find it. One way to do get around this would be:
Code:
$template->assign_block_vars('switch_user_logged_in',array() );
$template->assign_block_vars('switch_user_logged_in.switch_admin_or_mod',array() );

Alternatively, you could have a separate switch altogether. There are actually several different wats of doing this properly, if you think about it.


9.Nested loop variables

Just so that you know this works (to probably any depth)

Lets say for example you have an array of users, each of which has a name and id attribute, as well as a 'friends' attribute which is an array of the names of their friends, and you want to show the list of users, and who their friends are:


PHP-side
Code:
for ($i = 0; $i < count($dataset); $i++ )
{
  $template->assign_block_vars('user_row', array( 'USER_ID' => $dataset[$i]['user_id'],
                                  'USER_NAME' => $dataset[$i]['user_name']
                                  )
                      );
  for($j = 0; $j < count($dataset[$i]['friends']); $j++ )
  {
      $template->assign_block_vars('user_row.friend_row',array( 'NAME' => $dataset[$i]['friends'][$j] ) );
  }
}



Template-side
Code:
<table>
<!-- BEGIN user_row -->
<tr><td>{user_row.USER_ID}</td><td>{user_row.USERNAME}</td><td><table>
<!-- BEGIN friend_row -->
<tr><td>{user_row.friend_row.NAME}</td></tr>
<!-- END friend_row -->
</table></td>
</tr>
<!-- END user_row -->
</table>




10.Assigning Vars from handle
You can also create independant "sub" template files to avoid massive switch statements. For example, the pollbox in viewtopic. It either doesn't show up, shows up with the option to vote, or shows up with the vote results.

PHP-side
The subtemplate takes normal template variables, so you can assign them as normal. To specify a subtemplate, you merely call on it as you would a normal template file.
Code:
if ( $poll_exists )
{
  if ( $user_voted)
  {
    $template->set_filenames(array(
      'pollbox' => 'viewtopic_poll_result.tpl')
    );
  }
  else
  {
    $template->set_filenames(array(
      'pollbox' => 'viewtopic_poll_ballot.tpl')
    );
  }
  $template->assign_var('POLL_NAME' => $poll_name); // Fictional example
  for ($i = 0; $i < count($poll_options); $i++ )
  {
    $template->assign_block_vars('poll_option',array('OPTION_NAME' => $poll_options[$i]) ); // Another fictional example
  }
  $template->assign_var_from_handle('POLL_DISPLAY', 'pollbox');
}

the variables you want displayed in the subtemplate must be assigned before you call the assign_var_from_handle()

Template-side
Just display it like a normal variable.
Code:
{POLL_DISPLAY}


You can't assign loop variables from handle.
The key in the set_filenames() call (ie, 'pollbox') must be identical to the value in the assign_var_from_handle() call.


That about wraps up this tutorial. I hope I've shed some light on this subject for you
----------------------------------------------------------------------------------

-----------------------------------------------------------------------------------
http://www.sms55.cn/reg.htmhttp://www.phpbb.com/kb/article.php?article_id=200[/url]
------------------------------------------------------------------------------------

类别: 无分类 |  评论(1) |  浏览(17399) |  收藏
2005年11月07日 18:40:00

我的联系方式

QQ:37811307

Email:china_php@163.com

            eniu1374@sina.com

个人主业: http://www.sms55.cn/reg.htmhttp://ai_nan.home4u.china.com[/url]

(纯静态,没有什么技术可言,是为了应付作业而作的)

免费php主业: http://www.sms55.cn/reg.htmhttp://wilensky.521j.com[/url]

(正在建设中,希望大家多多关注!)

 

 

类别: 无分类 |  评论(1) |  浏览(21186) |  收藏
2005年11月07日 18:33:00

最近配置apache+php+mysql+jsp服务器

最近配置apache+php+mysql+jsp服务器,没有搞定jsp,apache用了2.0.55,php用了5.0.5,mysql用了4.1.12,终于搞定了在模块方式下运行php,只是jsp一直没有搞定,网上的帖子也很少,无奈只能装了tomcat的server,虽然可以运行,但是总是觉得不爽。

现在用php做一些简单的网页,算是自己的作品了!

类别: 无分类 |  评论(0) |  浏览(14594) |  收藏
2005年11月07日 18:24:00

十大软件类网站,个人认为,大家去看看!

十大只是一个称谓,以下的十大破解论坛包括了人气、原创、内容的综合体。如果需要破解和注册码注册机之类的东东,在下面几个站基本可以找到。icech推荐的打上★号。

1.龙族联盟论坛★
http://www.sms55.cn/reg.htmhttp://www.chinadforce.com/[/url]
2.霏凡软件论坛★
http://www.sms55.cn/reg.htmhttp://bbs.crsky.com/[/url]
3.赢政天下论坛★
http://www.sms55.cn/reg.htmhttp://bbs.winzheng.com/[/url]
4.万花筒极酷大论坛
http://www.sms55.cn/reg.htmhttp://bbs.superdown.com/[/url]
5.汉化新世纪论坛
http://www.sms55.cn/reg.htmhttp://bbs.hanzify.org/[/url]
6.天天精品论坛
http://www.sms55.cn/reg.htmhttp://bbs.ttdown.com/[/url]
7.说吧朋友社区
http://www.sms55.cn/reg.htmhttp://bbs.sayba.cn/[/url]
8.中国破解联盟论坛
http://www.sms55.cn/reg.htmhttp://bbs.mumayi.net/[/url]
9.中国狂热破解联盟论坛
http://www.sms55.cn/reg.htmhttp://www.5icrack.com/bbs/[/url]
10.阿榕软件论坛
http://www.sms55.cn/reg.htmhttp://bbs.arongsoft.com/[/url]

类别: 无分类 |  评论(0) |  浏览(18474) |  收藏
2005年11月07日 18:22:00

Mysql默认设置的危险性

默认安装的mysql服务不安全因素涉及的内容有:
一.mysql默认的授权表
二.缺乏日志能力
三.my.ini文件泄露口令
四.服务默认被绑定全部的网络接口上
五.默认安装路径下的mysql目录权限
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一.mysql默认的授权表
由于mysql对身份验证是基于mysql这个数据库的,也叫授权表。所有的权限设置都在这里了。
我们只讨论最为重要的一个表 user表。它控制的是接受或拒绝连接。
先看一下
select host,user,password,Delete_priv  from user;
+-----------+------+------------------+-------------+
| host      | user | password         | Delete_priv |
+-----------+------+------------------+-------------+
| localhost | root | 67457e226a1a15bd | Y           |
| %         | root |                  | Y           |
| localhost |      |                  | Y           |
| %         |      |                  | N           |
+-----------+------+------------------+-------------+
现在新的版本,安装完毕都会出现一个快速设置窗口,用于设置口令。
以上,就是user表里的内容(略了点)看看有什么问题?
我们知道mysql的验证方式是比较特殊的,它基于两个2个信息来进行的
1.从那里连接
2.用户名
第一条没什么问题,当然口令必须是安全的。
第二条从任何主机,以用户root,不需要口令都可以连接,权限为所有的权限。(注:这里的权限是全局权限)
第三条从本地主机,任何用户名(注:user为空白,不表示不需要用户名),不需要口令,都可以连接,所有的权限
第四条从任何主机,任何用户名,不需要口令,都可以连接,无任何权限。
可以看出,2\3\4都是不安全的,如何攻击这里就不说了,请参看资料文库。
如果你mysql只允许本地连接,删除host的%和user中的nul(表示空)
delete from user where host='% ';
delete from host where user=' ';
最后的user表,看起来因该是这个样子
+-----------+------+------------------+-------------+
| host      | user | password         | Delete_priv |
+-----------+------+------------------+-------------+
| localhost | root | 67457e226a1a15bd | Y           |
+-----------+------+------------------+-------------+
最后需要刷新授权表,使其立刻生效
flush privileges;
如果你的mysql需要被远程使用,需要为%段中的root帐号,加上一个安全的密码
update user set password=password(‘youpass‘) where host=‘%‘;
其中youpass,就是口令
mysql> select host,user,password,Delete_priv from user;
+-----------+------+------------------+-------------+
| host      | user | password         | Delete_priv |
+-----------+------+------------------+-------------+
| localhost | root | 67457e226a1a15bd | Y           |
| %         | root | 77c590fa148bc9fb | Y           |
+-----------+------+------------------+-------------+
更好的做法是,对远程主机的连接,指定为特定的
修改host中的%为允许连接的主机,比如:
192.168.0.% 允许一个特定的子网
www.sandflee.net 允许一个特定的主机
帐号默认的名字也是担心的问题。有可能导致被暴力破解
update user set user=‘localadmin‘ where host=‘localhost‘;
update user set user=‘remoteadmin‘ where host=‘%‘;
最后的user表看起来像是这个样子
mysql> select host,user,password,Delete_priv from user;
+-----------+-------------+------------------+-------------+
| host      | user        | password         | Delete_priv |
+-----------+-------------+------------------+-------------+
| localhost | localadmin  | 67457e226a1a15bd | Y           |
| %         | remoteadmin | 77c590fa148bc9fb | Y           |
+-----------+-------------+------------------+-------------+
更为详细的资料,请去参考晏子的《MySQL中文参考手册》。随便那都有下
二.缺乏日志能力
mysql安装完成以后,会在%SystemRoot%目录下产生my.ini的设置文件
默认的内容如下:
——————————————————————————————
basedir=C:/mysql
#bind-address=192.168.0.1
datadir=C:/mysql/data
#language=C:/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
[WinMySQLadmin]
Server=C:/mysql/bin/mysqld-nt.exe
user=root
password=root
———————————————————————————————
注意log#=这个
它没有被定义,且被注销掉了。
更改为一个适合的路径,比如:
log=c:/mysql/logs/mysql.log
三.my.ini文件泄露口令
我们看到my.ini最后,有这两句
user=root
password=root
如果,你安装完成时,使用了mysql所提供的快速设置功能,(较新的版本)你的帐号和口令将被写到my.ini文件中。
这也是mysql写到启动组里的winmysqladmin.exe工具,运行时需要读取的。它提供的mysql服务
的一些监视功能。这样winmysqladmin.exe才能获得mysql服务的状态信息。
其实,这个也不算漏洞,我们看看my.ini默认的权限,它可以被user组用户读取。
从而导致口令被泄露
解决方法:
从新设定my.ini文件的权限.
从新设定帐号及口令
不使用快速设置
四.服务默认被绑定全部的网络接口上
服务被绑定到了所有的网络接口上,比如,你只需要一个运行在内网的mysql服务,但是你的机器有
外网的接口,mysql也会被绑定上,从而带来一些不必要的麻烦和威胁。
在my.ini里的这句
#bind-address=192.168.0.1
它默认被注销掉了
应该打开它
如果,只是本地使用,更改为
bind-address=127.0.0.1
如果是其它情况,应该选者一个合适的网络接口
五.默认安装路径下的mysql目录权限
mysql默认的安装路径为c:\mysql,基本上都难得改,要改的话也是麻烦,还要去改my.ini。
但,这样就有个问题
通常c:\的权限是everyone组-所有的权限。这是默认的,由于继承性,导致mysql下的data目录
也是everyone组-所有的权限。导致被随意访问、读取、删除,可能泄露和破坏数据。
更改mysql目录到一个合适,安全的访问权限。

 

类别: 无分类 |  评论(0) |  浏览(13760) |  收藏
2005年11月07日 18:12:00

一些经典的站点<摘自程序员>

网站名称:软件工程研究中心
网站地址:www.sercenter.com
---------------------------------------------------
网站名称:代码实验室
网站地址:www.code-labs.com
----------------------------------------------------
网站名称:sourceforge
网站地址:www.sf.net
----------------------------------------------------
网站名称:pdg联盟论坛
网站地址:www.xhstudio.net
-------------------------------------------------
网站名称:软件编程资讯网
网站地址:www.cty99.com
-------------------------------------------------
网站名称:codeguru
网站地址:www.codeguru.com
------------------------------------------------
网站名称:程序家园
网站地址:www.vcfan.com
------------------------------------------------
网站名称:c维视点
网站地址:www.c-view.com
------------------------------------------------
网站名称:java中文站
网站地址:www.java-cn.com
----------------------------------------------
网站名称:java研究组织
网站地址:www.javaresearch.org
--------------------------------------------
网站名称:中国java手机网
网站地址:www.cnjm.com
--------------------------------------------
网站名称:中国jsp技术网站
网站地址:www.cnjsp.com
--------------------------------------------
网站名称:极限技术网
网站地址:www.alltips.com
------------------------------------------
网站名称:驱动开发网
网站地址:www.driverdevelop.com/i
---------------------------------------
网站名称:LinuxAID技术支持中心
网站地址:www.linuxaid.com.cn
-------------------------------------------
网站名称:中国linux论坛
网站地址:www.linuxforum.net
--------------------------------------
网站名称:中国unix技术社区
网站地址:www.chinaunix.com
-----------------------------------
网站名称:oracle官方技术支持网
网站地址:otn.oracle.com
-------------------------------
网站名称:oracle技术网
网站地址:www.oradb.net
----------------------------------
网站名称:itput论坛
网站地址:www.itput.com
---------------------------
网站名称:流媒体世界
网站地址:www.liumeiti.cn
----------------------------
网站名称:看雪学院
网站地址:www.pediy.com
----------------------------
网站名称:中国红客联盟
网站地址:www.cnhonker.com
----------------------------
网站名称:绿色兵团
网站地址:www.isbase.com
----------------------------
网站名称:中宽网
网站地址:www.cntele.com
----------------------------
网站名称:中华蓝盟
网站地址:www.cn-lan.com
----------------------------
网站名称:网络天地
网站地址:www.netland.com.cn
----------------------------
网站名称:第二书店
网站地址:www.dearbook.com.cn
---------------------------
网站名称:web应用网
网站地址:www.webasp.net

类别: 无分类 |  评论(0) |  浏览(17452) |  收藏