CentOS上安装部署LAMP环境

原文地址:http://os.51cto.com/art/201103/248774.htm

 

CentOS5.4上安装Apache2+PHP5+MySQL(LAMP)

1.注意事项:在这篇教程中,我将使用的主机IP 地址是192.168.0.100.这些设置可能与你的机器不同,因此你需要在合适的地方更换下。

2.安装MySQL5.0

我们通过执行下面的命令来安装MySQl:

  1. yum install mysql mysql-server

然后我们为MySQL创建系统启动快捷键(这样的话,MySQL就会在系统启动的时候自动启动)并且启动MySQL服务器:

  1. chkconfig –levels 235 mysqld on
  2. /etc/init.d/mysqld start

运行

  1. mysqladmin -u root password yourrootsqlpassword
  2. mysqladmin -h server1.example.com -u root password yourrootsqlpassword

来为root用户设置一个密码(否则的话任何人都可以访问你的MySQL数据库!)。

3安装Apache2

Apache2 是CentOS的一个可供选择的包,因此我们可以使用下列命令安装它:

  1. yum install httpd

现在配置你的系统使得Apache可以自动启动。。。

  1. chkconfig –levels 235 httpd on

… 并且启动Apache

  1. /etc/init.d/httpd start

现在你可以在你的浏览器中转到http://192.168.0.114,你应该看到Apache2的预留页:

CentOS/安装/LAMP

  1. apache preloadpage
  2. apache preloadpage

在CentOS里Apache的默认文档路径的位置是在/var/www/html,配置文件的路径是/etc/httpd/conf/httpd.conf。其他的配置存储在/etc/httpd/conf.d/ 文件夹里。

4 安装PHP5

我们可以使用下列命令来安装PHP5和Apache的PHP5模块:

  1. yum install php

然后我们必须重新启动Apache:

  1. /etc/init.d/httpd start

5测试PHP5

获取PHP5安装的一些信息

网站的默认文档的路径是/var/www/html.我们可以在这个目录里创建一个简单的php文件(info.php)并且在浏览器中调用。这文件将会显示很多关于PHP安装时候的有用的细节,例如PHP的安装的版本。

vi /var/www/html/info.php

  1. phpinfo();
  2. ?>

现在我们可以再浏览器中访问这个文件(例如http://192.168.0.114/info.php):

CentOS/安装/LAMP

  1. phpinfo
  2. phpinfo

正如你所看到的,PHP5现在正在工作,正如Server API这一行中显示的一样,它是工作在Apache 2.0 Handler模式下。如果你向下滑动的话,你将会看到所有的模块都可以在PHP5中使用了,MySQL并没有在这里被列出来,这也就意味着PHP5并不 支持MySQL。

6 使得PHP5支持MySQL

要使得在PHP中支持MySQL,我们可以安装 php-mysql这个包。最好的办法是安装一些其他的PHP5模块,这些模块可能其他应用程序会用到。你可以使

用search命令寻找可用的PHP5模块:

  1. yum search php

选择你所需要的包,然后通过下列命令安装他们:

  1. yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc

现在重新启动Apache2

  1. /etc/init.d/httpd restart

现在在你的浏览器中重新加载http://192.168.0.114/info.php 这个页面,并再次查看模块部分,你现在就能看到多了很多模块,包括我们刚刚安装的MySQL模块。

CentOS/安装/LAMP

  1. mysqlmodule
  2. mysql module

7 phpMyAdmin

phpMyAdmin是一款MySQL数据库web化的管理工具。

第一步我们先使我们的CentOS支持RPMforge repository,因为phpMyAdmin并不在CentOS5.3官方的依赖包里:

对于 x86_64 系统:

  1. wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
  2. rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

对于 i386系统

  1. wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
  2. rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

现在你就可以使用下列命令来安装phpMyAdmin了:

  1. yum install phpmyadmin

现在我们配置下phpMyAdmin。我们改下Apache的配置文件,使的 phpMyAdmin不单单是本机访问。

  1. vi /etc/httpd/conf.d/phpmyadmin.conf
  2. #
  3. # Web application to manage MySQL
  4. #
  5. #
  6. # Order Deny,Allow
  7. # Deny from all
  8. # Allow from 127.0.0.1
  9. #
  10. Alias /phpmyadmin /usr/share/phpmyadmin
  11. Alias /phpMyAdmin /usr/share/phpmyadmin
  12. Alias /mysqladmin /usr/share/phpmyadmin

下面我们改变下phpMyAdmin的认证方式,从cookie改成http:

  1. vi /usr/share/phpmyadmin/config.inc.php
  2. […]
  3. /* Authentication type */
  4. $cfg[‘Servers’][$i][‘auth_type’] = ‘http’;
  5. […]

最后,你就可以通过http://192.168.0.114/phpmyadmin/当问phpMyAdmin了:

CentOS/安装/LAMP

  1. phpmyadmin

DEDECMS如何取消服务器/主机空间目录脚本的执行权限

网站安全中,对目录的执行权限是非常敏感的,一般来说,可以写入的目录是不能够拥有脚本的执行权限的,像DedeCMS系统,可写入的有两个目录data、uploads,data目录主要是基本配置文件和缓存数据,uploads则是附件上传保存的目录,本篇将针对不同服务器环境来介绍如何取消这两个目录的执行权限,当然我们也建议用户其他一些生成纯静态html的目录,拥有可写入权限的也统统去除执行权限,这样系统会更为安全。

Windows下的IIS

IIS6.0

打开IIS中站点,在站点uploads目录、data目录以及静态html生成目录点击右键,菜单中选择“属性”,在目录属性面板选择执行权限为“无”即可。(如图1)

(图1)

 

IIS7

IIS7也类似于IIS6.0,选择站点对应的目录,data、uploads及静态html文件目录,双击功能试图面板中的“处理程序映射”(如图2)

(图2)

在“编辑功能权限……”中,我们直接去除脚本的执行权限即可。(如图3)

(图3)

 

Apache下目录脚本的执行权限设置

独立主机配置

在Apache中,没有Windows 下IIS的图形管理界面,我们需要手工修改下apache的配置文件,来进行目录脚本的执行权限的设定。
首先我们找到apache的配置文件httpd.conf,通常情况下,该配置文件在apache安装目录下的conf文件夹中(如图4)。

(图4)

打开httpd.conf文件,找到内容中如图5的位置:

(图5)

 

将需要限制执行脚本文件的目录配置添加到下方:

配置内容为:

1 <Directory "DIR">    
2 <FilesMatch ".(php|asp|jsp)$">     
3     Deny from all    
4 </FilesMatch>
5 </Directory>

 

配置内容中的DIR为需要限制执行脚本文件的目录,FilesMatch后的内容为需要限定的执行的脚本后缀名。例如:这里需要禁止测试站点uploads文件夹下的PHP,ASP,JSP脚本的运行,则进行如下图6配置:

(图6)

 

在配置完成后,重启一下apache,配置便生效!
在操作前,uploads文件夹下我新建了一个index.php文件,图7为未作配置前访问情况

(图7)

图8为重启apache后访问该页面的效果。

(图8)

虚拟主机/空间配置

在配置前需要确认你的空间是否支持.htaccess和rewrite,该方法基于.htaccess文件中使用rewrite来达到禁止指定脚本的运行效果。
规则内容如下:

1 RewriteEngine on  RewriteCond % !^$  
2 RewriteRule uploads/(.*).(php)$ – [F]  
3 RewriteRule data/(.*).(php)$ – [F]  
4 RewriteRule templets/(.*).(php)$ – [F]

 

针对uploads,data,templets 三个目录做了执行php脚本限制;
将如上内容存储至到.hatccess文件中,将该文件存放到你的站点根目录下,

这样,目录脚本的执行权限就控制好了,规则上传前后的效果同图7,图8。

对于虚拟主机用户,可直接下载此压缩包(里面为.htaccess文件),解压后上传到网站根目录即可。

点击下载htaccess

Cakephp数据库中文乱码问题

页面上显示正常,数据库里是乱码,解决方法如下:

/app/Config/database.php

var $default = array(
‘driver’ => ‘mysql’,
‘persistent’ => false,
‘host’ => ‘localhost’,
‘login’ => ‘root’,
‘password’ => ”,
‘database’ => ‘cp’,
‘prefix’ => ”,
 ‘encoding’ =>’utf8′
);

CakePHP2命名规范

CakePHP的命名规范相当重要,遵循CakePHP框架的命名规范,可以获得框架内置的各种功能。CakePHP2发布之后,命名规范这块与老的框架没有任何区别,本文同时适用于CakePHP 2.x和CakePHP 1.x框架。

总得来说,文件名使用下划线,类名用驼峰命名法。比如,MyNiftyClass类对应的文件名就是my_nifty_class.php。下面是不同类型的类和其相对应的文件命名方式的一些例子,

控制器类KissesAndHugsController,可以在kisses_and_hugs_controller.php文件中找到(注意文件名中的_controller)。

组件类MyHandyComponent,可以在my_handy.php文件中找到。

模型类OptionValue可以在option_value.php文件中找到。

行为类EspeciallyFunkableBehavior,可以在especially_funkable.php文件中找到。

视图类SuperSimpleView,可以在super_simple.php文件中找到。

助手类BestEverHelper,可以在best_ever.php文件中找到。

上述的每个文件都存放在相应的文件夹中。

总结:类名中,除了模型类,都需要在类命中标明该类的身份,比如Controller,Component,Behavior等。文件名中,只有控制器类需要标明身份,即在文件末尾加上_controller.

模型和数据库命名规范

模型类名使用单数驼峰命名法,Person,BigPerson以及ReallyBigPerson都是约定的模型命名。

表名使用复数和下划线命名。与上述模型相对应的表名分别是people,big_people和really_big_people。

可以使用“inflector”库检查单词的单复数形式。

包含两个或更多单词的字段名,以下划线命名,比如first_name。

在hasMany,belongsTo,hasOne关系中,外键默认由相关表加_id表示。举例来说,一个Baker和Cake之间的关系是一对多,那么在cakes表中会存在一个baker_id外键来关联bakers表(注意,这里的关联外键是单数)。对于多个单词组成的表名,像category_types,外键会事category_type_id。即表名虽然是复数,但是在其它表中存在的该表外键,要以单数形式命名。

多对多关系中一般会存在一个链接表,该链接表字段的一个命名方式是需要以单词首字母字母顺序排列,例如apples和zebras两张表,在链接表中,他们应该是apples_zebras,而非zebras_apples。

所有CakePHP模型交互的表,都需要唯一的主键来标示每一行数据。CakePHP不支持组合主键,如果你想直接操作链接表数据,可以直接使用SQL语句。

除了使用递增字段作为主键之外,还可以使用char(36)作为主键。在使用odel::save方法保存记录时,CakePHP会自动识别该字段,并使用(String::uuid)生成一个36位的字符串作为唯一主键。

控制器命名规范

控制器类名使用复数驼峰命名法,并且以Controller结尾。PeopleController以及LatestArticlesControlle都是合法的控制器命名方式。

控制器中的首个方法应该是index()方法,当请求只指定了控制器,没有动作方法时,CakePHP默认执行该控制器的index()方法。

通过在控制器方法名之前加一个下划线,可以更改该控制器方法的可见范围。如果控制器方法前有一个下划线,这个方法就只能在内部使用,而无法通过浏览器访问。

控制器类名与URL地址

单个单词的控制器能够非常容易的被映射到小写的URL地址上。例如,ApplesController可以通过http://example.com/apples访问。

多词控制器的访问地址,可以是该控制器名的任何曲折形式。

  • /redApples
  • /RedApples
  • /Red_apples
  • /red_apples

都能指向到RedApples控制器的index方法。不过,命名约定规定,url地址应该是小写单词加下划线组成。因此,/red_apples/go_pick是请求RedApplesController::go_pick方法的正确形式。

视图命名规范

视图模板文件通过调用他们的控制器方法命名,以下划线分隔多词。PeopleController类中得getReady()方法,会自动关联/app/views/people/get_ready.ctp视图模板。

命名方式就是/app/views/<controller name>/<underscored_function_name>.ctp。

总结

数据库表名:people
模型类:person,路径app/models/person.php
控制器类:PeopleController,路径app/contollers/people_controller.php
视图类:app/views/people/index.ctp

使用这种命名约定,CakePHP能够将http://example.com/people/映射到PeopleController控制器的index()方法,Person模型可以直接在该控制器中使用,并且该模型会自动与people表绑定,然后输出视图。所有这一些不需要配置,只要你遵守CakePHP的命名约定即可。

转载请注明:锐想Magento » CakePHP2命名规范

修改PHP上传文件大小限制

1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.
但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行.
这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time
在php.ini里查找
max_execution_time
默认是30秒.改为
max_execution_time = 0
0表示没有限制

2. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。
php默认的post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空.
查找 post_max_size .改为
post_max_size = 150M

3. 很多人都会改了第二步.但上传文件时最大仍然为 8M.
为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大大小。
查找upload_max_filesize,默认为8M改为
upload_max_filesize = 100M

另外要说明的是,post_max_size 大于 upload_max_filesize 为佳.

php“内存位置访问无效”错误的解决办法

突然发现网页登不上去了,提示错误“内存位置访问无效”。但服务器上ASP的站点可以运行,于是猜想应该是PHP出现了错误。

配置环境如下:

Win2003SP2+IIS6+php5.26+mysql5.0.51a+zend3.3a+PhpMyAdmin2.11.7.1 PHP执行方式:isapi。Mysql为手动安装。

关于“内存位置访问无效”的错误解决办法与步骤:(前三步可忽略)

一、将IIS的错误显示打开,未发现错误原因!

二、检查IIS扩展,ISAPI、php.ini与Mysql配置以及相应的安装目录ACLs权限,均无误。

三、回收IIS进程,错误仍然出现”内存位置访问无效”….

四、将php.ini中 display_startup_errors = On 打开,重新启动IIS,问题所在终于发现了… (注:如果将php.ini的display_startup_errors打开,如果php有错误出理,就会提示,而且在事件查看器中有记录。如果设置为display_startup_errors = Off,则不会有任何提示)

五、Warning

Cannot load module ‘SQLite’ because required module ‘pdo’ is no loaded

上面这条错误信息终于被发现了。大概意思就是因为php.ini配置中开启了SQLite桌面数据库的支持,但未开启相关的pdo模式,pdo模块加载失败…..

六、解决办法也很简单了,因为加载php_sqlite.dll时未加载到php_pdo.dll文件,所以运行phpinfo()函数时提示内存 位置访问无效。找到php.ini配置文件,然后去掉”;extension=php_pdo.dll”前面的分号, extension=php_sqlite.dll

然后再回收一下IIS应用程序池进程,问题彻底解决….

hoho,希望对遇到此问题的朋友有点儿帮助…

php ODBC连接sqlserver

开放资料链接 (Open Database Connectivity,ODBC) 是链接数据库的共通界面。ODBC 是由微软主导的数据库链接标准,实作环境也以微软的系统最成熟。在 UNIX 系统中,通常要使用其它厂商所提供的 ODBC 界面,有些 UNIX 厂商会自己提供 ODBC 界面 (如 SUN 有为 Solaris 提供 ODBC)。
ODBC 和数据库的查询采用 SQL 语言,这和大部份的数据库查询方式一样,这使得系统可以很容易和各种数据库沟通。当然,透过 ODBC 界面,后端的数据库不一定要 DBMS 这种大型数据库系统,亦可以是资料表 (如 Microsoft Access)、或者是试算表 (如 Microsoft Excel)。

odbc_autocommit: 开关自动改动功能。
odbc_binmode: 配置二进位资料处理方式。
odbc_close: 关闭 ODBC 链接。
odbc_close_all: 关闭所有 ODBC 链接。
odbc_commit: 改动 ODBC 数据库。
odbc_connect: 链接至 ODBC 数据库。
odbc_cursor: 取得游标名。
odbc_do: 执行 SQL 指令。
odbc_exec: 执行 SQL 指令。
odbc_execute: 执行预置 SQL 指令。
odbc_fetch_into: 取得返回的指定列。
odbc_fetch_row: 取得返回一列。
odbc_field_name: 取得字段名称。
odbc_field_type: 取得字段资料类型。
odbc_field_len: 取得字段资料长度。
odbc_free_result: 释出返回资料的内存。
odbc_longreadlen: 配置返回栏的最大值。
odbc_num_fields: 取得字段数目。
odbc_pconnect: 长期链接至 ODBC 数据库。
odbc_prepare: 预置 SQL 指令。
odbc_num_rows: 取得返回列数目。
odbc_result: 取得返回资料。
odbc_result_all: 返回 HTML 表格资料。
odbc_rollback: 撤消当前交易。
odbc_setoption: 调整 ODBC 配置。

odbc_autocommit 开关自动改动功能。
语法: int odbc_autocommit(int connection_id, int [OnOff]);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来打开或关闭自动更新 (auto-commit) 功能。参数 connection_id 为 ODBC 链接的 ID 值。参数 OnOff 可省略,表打开或关闭自动改动功能,默认值为 on,欲关闭则设 off。返回值为目前的自动更新状态,若打开自动更新功能则返回 true;若关闭自动更新功能则返回 false。
参考: odbc_commit() odbc_rollback()

odbc_binmode 配置二进位资料处理方式。
语法: int odbc_binmode(int result_id, int mode);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来配置二进位资料返回时的处理方式。受到本函数影响的资料类型有 BINARY、VARBINARY 及 LONGVARBINARY。参数 result_id 为返回的 ID 值,若设为 0,则程序将配置一个新的 ID 值。

参数 mode 为配置的二进位处理方式,有下列的值

ODBC_BINMODE_PASSTHRU 返回二进位资料
ODBC_BINMODE_RETURN 转成十六进位返回
ODBC_BINMODE_CONVERT 转成字符串资料返回

注意: 若使用 odbc_fetch_into(),ODBC_BINMODE_PASSTHRU 会导至返回字符串值都是空的 (empty)。而返回资料最大治募 默认大小为 4096 位组,若要返回更多的资料需使用 odbc_longreadlen()。
参考: odbc_fetch_into() odbc_longreadlen()

odbc_close 关闭 ODBC 链接。
语法: void odbc_close(int connection_id);
返回值: 无
函数种类: 数据库功能
内容说明: 本函数用来关闭与 ODBC 数据库之间的链接。参数 connection_id 为 ODBC 链接代号 ID 值。若正在执行 transactions 则无法关闭链接。

odbc_close_all 关闭所有 ODBC 链接。
语法: void odbc_close_all(void);
返回值: 无
函数种类: 数据库功能
内容说明: 本函数用来关闭与 ODBC 数据库之间所有的链接。和 odbc_close() 一样,若正在执行 transactions 则无法关闭链接。使用本函数不需要使用任何参数。

odbc_commit 改动 ODBC 数据库。
语法: int odbc_commit(int connection_id);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来改动 (commit) ODBC 数据库。参数 connection_id 为 ODBC 链接的 ID 值。若有配置 odbc_autocommit() 成自动改动数据库时,则不需使用本函数。

odbc_connect 链接至 ODBC 数据库。
语法: int odbc_connect(string dsn, string user, string password, int [cursor_type]);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来链接到 ODBC 数据库,返回值为链接的代号 ID 值。参数 dsn 为资料来源名称 (Data Sources Name)。参数 user 及 password 分别为链接的帐号及密码。参数 cursor_type 通常省略,其值有 SQL_CUR_USE_IF_NEEDED、SQL_CUR_USE_ODBC、SQL_CUR_USE_DRIVER 及 SQL_CUR_DEFAULT 等四种。当使用复杂的资料存取时可能会有类似 Cannot open a cursor on a stored procedure that has anything other than a single select statement in it 的错误信息字符串,此时若将参数 cursor_type 的值设为 SQL_CUR_USE_ODBC 就可以避开了。
参考: odbc_pconnect()

odbc_cursor 取得游标名。
语法: string odbc_cursor(int result_id);
返回值: 字符串
函数种类: 数据库功能
内容说明: 本函数用来取得打开的 ODBC 数据库游标 (cursor)。参数 connection_id 为 ODBC 链接代号 ID 值。返回值为游标的名称字符串。

odbc_do 执行 SQL 指令。
语法: int odbc_do(int connection_id, string query);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来执行 SQL 的 query 指令。参数 connection_id 为 ODBC 链接代号 ID 值。参数 query 则为欲执行的指令。返回值为 Result ID 值。
参考: odbc_prepare() odbc_execute() odbc_exec()

odbc_exec 执行 SQL 指令。
语法: int odbc_exec(int connection_id, string query);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来执行 SQL 的 query 指令。参数connection_id 为 ODBC 链接代号 ID 值。参数 query 则为欲执行的指令。返回值为 Result ID 值。
参考: odbc_prepare() odbc_execute() odbc_do()

odbc_execute 执行预置 SQL 指令。
语法: int odbc_execute(int result_id, array [parameters_array]);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来执行预置在4.36.20 odbc_prepare() 的 query 指令。参数 result_id 为 ODBC 返回 ID 值。参数 parameters_array 通常省略。

使用范例
<?php
$conn=odbc_connect(mydb,,);
$stmt = odbc_prepare($conn, INSERT INTO mytable (jor_from, jor_to) valueS($from$to); );
if (!odbc_execute($stmt)) {
echo 错误;
}
odbc_close($conn);
?>
参考: odbc_prepare() odbc_exec() odbc_do()

odbc_fetch_into 取得返回的指定列。
语法: int odbc_fetch_into(int result_id, int [rownumber], array result_array);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来取得 Query 的返回资料列,并放入数组资料之中。参数 result_id 为 ODBC 返回 ID 值。参数 rownumber 为指定的取得列 (row)。数组参数 result_array 为取得列的资料数组,通常在前面加上 & 符号。例如 vbhunt@silverfox.com 所提供的范例 (27-Sep-1998)
$cols = odbc_fetch_into($QueryID, $RowNum, &$YourArray);

odbc_fetch_row 取得返回一列。
语法: int odbc_fetch_row(int result_id, int [row_number]);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来取得 Query 的返回资料的一列。参数 result_id 为 ODBC 返回 ID 值。参数 rownumber 可省略,为指定的取得列 (row)。

使用范例
<?php
$conn = odbc_connect(WebDB);
$query = select user, idno ;
$query .= from userinfo;
$result_id = odbc_do($conn, $query);
while(odbc_fatch_row($result_id)) {
$user = odbc_result($result_id, 1);
$idno = odbc_result($result_id, 2);
echo $user.的身份证字号为.$idno.<br>n;
}
odbc_close($conn);
?>

odbc_field_name 取得字段名称。
语法: string odbc_fieldname(int result_id, int field_number);
返回值: 字符串
函数种类: 数据库功能
内容说明: 本函数用来取得 Query 的返回资料的字段名称。参数 result_id 为 ODBC 返回 ID 值。参数 field_number 为指定的字段,起始值为 1。

odbc_field_type 取得字段资料类型。
语法: string odbc_field_type(int result_id, int field_number);
返回值: 字符串
函数种类: 数据库功能
内容说明: 本函数用来取得 Query 的返回资料的字段资料类型。参数 result_id 为 ODBC 返回 ID 值。参数 field_number 为指定的字段,起始值为 1。

odbc_field_len 取得字段资料长度。
语法: int odbc_field_len(int result_id, int field_number);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来取得 Query 的返回资料的字段资料长度。参数 result_id 为 ODBC 返回 ID 值。参数 field_number 为指定的字段,起始值为 1。

odbc_free_result 释出返回资料的内存。
语法: int odbc_free_result(int result_id);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数可用来释出返回资料所使用的内存,通常在系统内存资源不足的情形下才需要使用。参数 result_id 为 ODBC 返回 ID 值。返回值永远都是 true。

odbc_longreadlen 配置返回栏的最大值。
语法: int odbc_longreadlen(int result_id, int length);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来配置返回资料栏的最大资料值。参数 result_id 为 ODBC 返回 ID 值。参数 length 即为欲配置的长度值,本参数若设为 0,表示不限长度。

odbc_num_fields 取得字段数目。
语法: int odbc_num_fields(int result_id);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来取得返回资料的字段数目。参数 result_id 为 ODBC 返回 ID 值。若发生错误则返回 -1。

odbc_pconnect 长期链接至 ODBC 数据库。
语法: int odbc_pconnect(string dsn, string user, string password, int [cursor_type]);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来保持长期链接链接到 ODBC 数据库,即使 PHP 程序结束,链接仍然存在,返回值为链接的代号 ID 值。这对链接负责很重的系统可以加快链接的速度。参数 dsn 为资料来源名称 (Data Sources Name)。参数 user 及 password 分别为链接的帐号及密码。参数 cursor_type 通常省略。
参考: odbc_connect()

odbc_prepare 预置 SQL 指令。
语法: int odbc_prepare(int connection_id, string query_string);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来配置 SQL query 指令。参数 result_id 为 ODBC 返回 ID 值。参数 query_string 即为预设的指令。
参考: odbc_execute()

odbc_num_rows 取得返回列数目。
语法: int odbc_num_rows(int result_id);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来取得返回列的数目。参数 result_id 为 ODBC 返回 ID 值。若有错误发生则返回 -1。

odbc_result 取得返回资料。
语法: string odbc_result(int result_id, mixed field);
返回值: 字符串
函数种类: 数据库功能
内容说明: 本函数用来取得返回的资料。参数 result_id 为 ODBC 返回 ID 值。参数 field 可以是数字类型,代表指定的字段序号 (从 1 开始);亦可以是字符串类型,为指定的字段名称。

odbc_result_all 返回 HTML 表格资料。
语法: int odbc_result_all(int result_id, string [format]);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来将取得的资料转成 HTML 的表格 (table) 格式。参数 result_id 为 ODBC 返回 ID 值。参数 format 可省略,为表格的特殊配置值。返回值为资料列数。

使用范例
<?php
$conn = odbc_connect(WebDB);
$query = select item, price ;
$query .= from userinfo;
$result_id = odbc_do($conn, $query);
odbc_result_all($result_id, border=1 width=50%);
odbc_close($conn);
?>

odbc_rollback 撤消当前交易。
语法: int odbc_rollback(int connection_id);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数取消 ODBC 交易处理 (transaction) 对数据库所做的修改。若成功则返回 true,反之返回 false。

odbc_setoption 调整 ODBC 配置。
语法: int odbc_setoption(int id, int function, int option, int param);
返回值: 整数
函数种类: 数据库功能
内容说明: 本函数用来调整 ODBC 的配置值。参数 id 不一定指 connection_id,SQLSetConnectOption() 则为 connection_id;若为 SQLSetStmtOption() 则为 result_id。参数 function 值为 1 表 SQLSetConnectOption();若为 2 则为 SQLSetStmtOption()。参数 option 为配置的选项。参数 param 为配置值。

使用范例
<?
// 例一: 配置为 autocommit,即与 odbc_autocommit($conn, true) 相同。
// 第三个参数值 102 表 SQL_AUTOCOMMIT。
// 第四个参数值 1 表 SQL_AUTOCOMMIT_ON。
odbc_setoption ($conn, 1, 102, 1);
// 例二: 配置查询时间
// 第三个参数 0 表 SQL_QUERY_TIMEOUT
// 第四个参数为最久执行时间,本例设为 30 秒
$result = odbc_prepare ($conn, $sql);
odbc_setoption ($result, 2, 0, 30);
odbc_execute ($result);
?>

URL的井号

去年9月,twitter改版。

一个显著变化,就是URL加入了”#!”符号。比如,改版前的用户主页网址为

http://twitter.com/username

改版后,就变成了

http://twitter.com/#!/username

在我印象中,这是主流网站第一次将”#”大规模用于直接与用户交互的关键URL中。这表明井号(Hash)的作用正在被重新认识。本文根据HttpWatch的文章,整理与井号有关的所有重要知识点。

一、#的涵义

#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,

http://www.example.com/index.html#print

就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name=”print”></a>,二是使用id属性,比如<div id=”print” >。

二、HTTP请求不包括#

#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包括#。

比如,访问下面的网址,

http://www.example.com/index.html#print

浏览器实际发出的请求是这样的:

GET /index.html HTTP/1.1

Host: www.example.com

可以看到,只是请求index.html,根本没有”#print”的部分。

三、#后的字符

在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。

比如,下面URL的原意是指定一个颜色值:

http://www.example.com/?color=#fff

但是,浏览器实际发出的请求是:

GET /?color= HTTP/1.1

Host: www.example.com

可以看到,”#fff”被省略了。只有将#转码为%23,浏览器才会将其作为实义字符处理。也就是说,上面的网址应该被写成:

http://example.com/?color=%23fff

四、改变#不触发网页重载

单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页。

比如,从

http://www.example.com/index.html#location1

改成

http://www.example.com/index.html#location2

浏览器不会重新向服务器请求index.html。

五、改变#会改变浏览器的访问历史

每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置。

这对于ajax应用程序特别有用,可以用不同的#值,表示不同的访问状态,然后向用户给出可以访问某个状态的链接。

值得注意的是,上述规则对IE 6和IE 7不成立,它们不会因为#的改变而增加历史记录。

六、window.location.hash读取#值

window.location.hash这个属性可读可写。读取时,可以用来判断网页状态是否改变;写入时,则会在不重载网页的前提下,创造一条访问历史记录。

七、onhashchange事件

这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+支持该事件。

它的使用方法有三种:

window.onhashchange = func;

<body onhashchange=”func();”>

window.addEventListener(“hashchange”, func, false);

对于不支持onhashchange的浏览器,可以用setInterval监控location.hash的变化。

八、Google抓取#的机制

默认情况下,Google的网络蜘蛛忽视URL的#部分。

但是,Google还规定,如果你希望Ajax生成的内容被浏览引擎读取,那么URL中可以使用”#!”,Google会自动将其后面的内容转成查询字符串_escaped_fragment_的值。

比如,Google发现新版twitter的URL如下:

http://twitter.com/#!/username

就会自动抓取另一个URL:

http://twitter.com/?_escaped_fragment_=/username

通过这种机制,Google就可以索引动态的Ajax内容。

 

——摘自 阮一峰的网络日志

fastcgi error 14001错误原因与解决办法

FastCGI Error
The FastCGI Handler was unable to process the request.
——————————————————————————–

Error Details:

Error Number: 14001 (0x800736b1).
Error Description: 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
HTTP Error 500 – Server Error.
Internet Information Services (IIS)

 

发生此错误的关键原因在于没有安装VC9运行库。Microsoft Visual C++ 2008 Redistributable Package (x86)下载地址:

http://www.microsoft.com/downloads/details.aspx?FamilyID=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=zh-cn

文件不大,1.6M左右,安装后就能正常使用了。

缩略图无法显示_timthumb.php中的路径问题_Broadside_cn 1.0_ProgressionStudios_汉化:唯艾迪 weidea.net

用了一个wordpress主题:Broadside_cn 1.0,作者为 ProgressionStudios,汉化:唯艾迪 weidea.net。结果出现图片无法显示的问题。出现很多警告,如下取第一条警告。

Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(/usr/local/apache2/htdocs/wp-content/themes/Broadside_cn/images/backgrounds/blog-background.jpg) is not within the allowed path(s): (/webhome:/tmp) in /webhome/********/web/www/wp-content/themes/Broadside_cn/timthumb.php on line 902

从警告中我们就可以猜测出是文件路径的问题。应该是找不到指定的图片。下面给出解决办法,希望能帮到同样碰到此问题的童鞋。

找到该主题所在目录下的timthumb.php文件,打开后找到函数getLocalImagePath($src),找到函数中的下面这段:

[php]
if(file_exists ($this->docRoot . ‘/’ . $src)) {
$this->debug(3, “Found file as ” . $this->docRoot . ‘/’ . $src);
$real = $this->realpath($this->docRoot . ‘/’ . $src);
if(stripos($real, $this->docRoot) === 0){
return $real;
} else {
$this->debug(1, “Security block: The file specified occurs outside the document root.”);
//allow search to continue
}
}
[/php]

修改成下面的代码:

[php]
if(@file_exists ($this->docRoot . ‘/’ . $src)) {
$this->debug(3, “Found file as ” . $this->docRoot . ‘/’ . $src);
$real = $this->realpath($this->docRoot . ‘/’ . $src);
if(stripos($real, $this->docRoot) === 0){
return $real;
} else {
$this->debug(1, “Security block: The file specified occurs outside the document root.”);
//allow search to continue
}
} else {
$this->docRoot = str_replace(dirname($_SERVER[‘PHP_SELF’]),””,dirname(__FILE__));
}
[/php]

如果还是有问题,可以在下方评论中提出,或者通过QQ联系我363165133,希望能帮到大家。

PHP使用ODBC连接数据库(转载)

示例:使用 ODBC 连接 PHP

接下来,您必须安装 PHP ODBC 驱动程序。通过将 iODBC 或 unixODBC 添加到 PHP 编译脚本中(非常复杂),或者通过安装 PHP-ODBC 库,都可以实现 PHP ODBC 驱动程序的安装。在基于 apt 的发行版中,可以使用以下命令:
[shell]sudo apt-get install php5-odbc[/shell]

可通过在交互模式下运行 PHP (php -a) 来测试流量。这将打开 PHP 交互控制台,在那里您可以使用与清单 1 中的示例类似的方式进行交互。
清单 1. 命令行 ODBC 连接

[shell]
php > $conn = odbc_connect(
“DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=phpodbcdb”,
“username”, “password”);
php > $sql = “SELECT 1 as test”;
php > $rs = odbc_exec($conn,$sql);
php > odbc_fetch_row($rs);
php > echo “\nTest\n—–\n” . odbc_result($rs,”test”) . “\n”;

Test
—-
1
php > odbc_close($conn);
php > exit;
[/shell]

让我们来分析一下清单 1 中的代码:

  1. 使用 PHP 中的 odbc_connect() 函数建立一个连接。该函数将 ODBC 连接器字符串、用户名称和密码作为参数。连接器字符串应与 odbc.ini 文件匹配,以确保它与预先安排的相符。
  2. 将一个变量实例化为字符串,该字符串代表了您的 SQL 语句。
  3. 使用 odbc_exec 函数执行该 SQL 语句,此函数将接受您的连接和您的 SQL 字符串,并返回一个结果集。
  4. 使用 odbc_fetch_row() 仅从结果集中提取一行结果,该函数接受作为参数的结果集。这是一个迭代函数,这意味着如果您再次调用它,会得到结果集中的下一个结果(依此类推,直到结果集中没有结果,如果没有结果,则返回 false)。
  5. 使用函数 odbc_result(),该函数接受结果集和列名称(字符串形式),并返回行迭代程序所指向的行中的单元值。
  6. 使用 odbc_close 函数关闭 ODBC 连接,该函数接受连接本身。
  7. 通过发送 exit 命令退出 PHP 交互模式。

这方法很有用,但在 Web 应用程序级别上不常使用。如果您想在客户端/服务器样式的 Web 浏览模式下测试流量,则需要安装一台 Web 服务器,比如 Apache 或 Lighttpd。(如果运行的是 Linux 系统,则必须确保提供了用于 Web 服务的 PHP 模块,否则,PHP 将无法运行。)

清单 2 展示了通过 Web 服务器执行此操作时使用的相同技术。PHP 代码类似于清单1中使用的代码,但它通过 XHTML 而不是命令行导出结果。
清单 2. 基于 XHTML 的 ODBC 连接的示例
[php]
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


PHP and ODBC: XHTML Example 1



< ?php $conn = odbc_connect( "DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=phpodbcdb", "username", "password"); if (!($conn)) { echo "

Connection to DB via ODBC failed: “;
echo odbc_errormsg ($conn );
echo “\n”;
}

$sql = “SELECT 1 as test”;
$rs = odbc_exec($conn,$sql);
echo “

“;
echo “

“;
while (odbc_fetch_row($rs))
{
$result = odbc_result($rs,”test”);
echo “

“;
}
odbc_close($conn);
echo “

Test
$result

“;
?>


[/php]

该清单在清单1的基础上添加了一些内容:现在可以完全将 odbc_fetch_row() 函数用作迭代函数,只需将它放在 while 循环中即可。这意味着,如果 SQL 稍微有点复杂,并且要查询一个表来查找多个结果,那么该函数会在所呈现的 XHTML 表中创建一个新行。

有许多类型的 XHTML 和 HTML,它们配备有各种数量的浏览器支持,且易于使用。清单2生成了标准化的 XHTML 1.0 Strict,它是 XHTML 用来开发以数据为中心的、强大的、跨浏览器的文档的最佳形式之一。

PHP-ODBC 编程

ODBC 函数有 4 种主要类型:用于连接、查询、提取数据和错误报告的函数。查询函数能够处理标准化数据库事务,以便创建、读取、更新和删除数据(通称 CRUD 操作)。

连接函数

每个已开始的进程都必须有一个完结;否则,就会导致内存和处理器问题。所以,您要确保已经关闭了数据库连接。

如您已经看到的,odbc_connect() 函数接受 ODBC 友好的链接字符串、数据库用户名称和相关密码。它返回一个您可以在整个 PHP 程序中使用的连接对象。以下代码显示了一个示例:
[php]
$connection = odbc_connect($connection_string, $username, $password);
[/php]
在前面的示例中还可以看见,odbc_close() 函数接受了一个连接对象,并终止了与 ODBC 和数据库的通信。我要强调的是,您必须关闭您的链接,否则会有过多的连接到您的数据库的连接,此外,您还必须重启您的数据库管理系统,在更糟糕的情况下,您甚至需要重启机器。以下是该函数的运行方式:odbc_close($connection);。

查询函数

前面曾使用过 odbc_exec() 函数,它接受了一个连接对象和一个 SQL 字符串,执行该函数后,会返回一个结果集对象。该结果集对象是一个复杂对象,它通常位于数据库管理系统的存储器中,并且只能通过与之交互的函数辨认。odbc_exec() 行与以下代码类似:[php]$resultset = odbc_exec($connection, $sql);[/php]

在将未知变量注入 SQL 中时,odbc_prepare() 和 odbc_execute 函数非常有用。odbc_prepare() 函数为数据库管理系统准备了一个 SQL 语句,然后 odbc_execute() 函数会在变量中发送该语句。这意味着它比使用 PHP 建立一串 SQL 字符串并通过 odbc_exec() 发送 SQL 语句更强大、更安全、更有效。将这些函数放在一起时,它们看起来如下所示:
[php]
$resultset = odbc_prepare($connection, $sql);
$success = odbc_execute($resultset, $variables);
[/php]

清单 3 是一个很好的示例,创建它是为了根据位置和出生日期变量来搜索用户表中的用户。请注意 SQL 字符串中的问号 (?),它表示odbc_execute() 函数的串行数组中定义的变量。
清单 3. 使用 prepare 和 execute 命令实现 SQL 变量注入
[php]
$location = “London”;
$mindateofbirth = time() – 567648000; /* i.e. 18 years ago from now */
$resultset = odbc_prepare(
$connection,
“SELECT * FROM user WHERE location = ? AND dateofbirth < = ?" ); $success = odbc_execute($resultset, array($location, $mindateofbirth)); [/php] 提取函数 odbc_fetch_row() 函数接受来自某个查询的结果集,并将迭代器指针从一行转向下一行。此函数常常与 odbc_result() 函数结合使用,以提取各种单元格的值: [php] odbc_fetch_row($resultset); [/php] 在前面的示例中,odbc_result() 函数接受了一个 $resultset 和一个列名称字符串,并返回某个单元格的值。此函数可以与odbc_fetch_row() 函数结合使用,以指向结果集中的特定行: [php] $value = odbc_result($resultset,"columnname"); [/php] odbc_fetch_array() 函数在某些地方类似于用来从查询结果集中提取数据的迭代函数。但是,在这里,它返回了一个代表行的数组, 并使用列名称作为键,使用单元格值作为值: [php] $rowarray = odbc_fetch_array($resultset); [/php] 与 odbc_fetch_array() 函数类似,odbc_fetch_object() 提取代表行的面向对象的结构。它将列名称作为对象属性,并将单元格值作为属性值: [php] $rowobject = odbc_fetch_object($resultset); [/php] 此函数在打印 HTML 形式的结果集时非常有用。它只是简单地呈现结果,但在原型制作或调试时很有用: [php] odbc_result_all($resultset); [/php] odbc_num_fields() 函数是一个相当不错的函数,它只接受结果集,并会告诉您结果集中的行数: [php] $numberofrows = odbc_num_rows($resultset); [/php] 问题解决和调试 PHP ODBC 有两个得心应手的函数,其中一个是 odbc_error(),如果发生错误,它会返回错误代码,如果没有发生错误,则返回 false;另一个函数是 odbc_errormsg(),它返回用户友好的消息。您可以组合使用这两个函数,从而形成一个简单的错误消息序列: [php] if (odbc_error()) { echo "I've found a problem: " . odbc_errormsg($conn); } [/php] 如果在开发的时候出错,您会获得另一个提示,不要害怕向导致问题的行附近添加打印语句,当然,在显示其他行时,系统会为您提供删除这些 “调试行” 的权利。请注意下面的 PHP 函数,它通常会在关键时候为您伸出援手: [php] print_r($variable); [/php] 这个简单的函数接受任何变量,并将它显示在屏幕上。变量可以像一个整数或字符串那样简单,也可以像多维数组或对象那样复杂。 本文引用自http://www.ibm.com/developerworks/cn/opensource/os-php-odbc/