Category: PHP     Comments    

在Zend Framework 中使用 PDO_ODBC

其实只需要小改一下Zend_Db_Adapter_Pdo_Mssql就可以支持ODBC

function _dsn()

判断PDO Type 的时候加多一个

case 'odbc':
$this->_pdoType = 'odbc';
break;

再增加一個方法

public function quote($value)
{
if (is_int($value) || is_float($value)) {
return $value;
}
return "'".addslashes($value)."'";
}

然后,传递参数的时候参考下面的例子:

// 数据库连接参数
$params = array(
'SERVER' => "192.168.1.2"
'DATABASE' => "king",
'username' => "king",
'password' => "kingpsw",
'dbname' => "king",
'pdoType' => "odbc",
'DRIVER' => "SQL Server",
);
// 单件模式
if (!Zend_Registry::isRegistered("db")) {
$db = Zend_Db::factory('Pdo_Mssql', $params);
Zend_Registry::set("db", $db);
}else {
$db = Zend_Registry::get("db");
}

使用上面的参数会生成类似
odbc:DRIVER=SQL Server;SERVER=192.168.1.2;DATABASE=king;
这样的Data Source Name (DSN) 串,这样就会通过ODBC连接数据库了,当然要记得打开 php_pdo_odbc.dll 扩展

虽然使用ODBC驱动可以避免SQL SERVER 中VARCHAR长度超过255的限制,但是也并不是这样就可以解决问题,PDO_ODBC存在一个BUG:
http://bugs.php.net/bug.php?id=40452 上面有些评论可以参考一下
当INSERT的时候DATETIME字段会出现以下错误:

[Microsoft][ODBC 驅動程式管理員] 函數順序錯誤
Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[HY010]: Function sequence error: 0 [Microsoft][ODBC Driver
Manager] Function sequence error (SQLExecute[0] at
ext\pdo_odbc\odbc_stmt.c:133)'

參考:http://framework.zend.com/issues/browse/ZF-905

Category: PHP     Comments    

关于PHP只能读取MsSQL的char/varchar字段前256个字符的问题

很不幸地用PHP操作MsSQL(SQL Server)数据库的时候,如果您的char或者varchar字段长度超过256的话只能读取到前256个字符的内容,后面的会被无情的CUT掉,无论你用最基本的MSSQL DB库还是PDO_MSSQL,或者自己写一个专门的MSSQL DB扩展也无济于事,因为PHP操作MSSQL都是通过微软提供的SQL Server Client Library工作,也就是ntwdblib.dll 这个文件,目前“最新”版本是2000.80.194.0(需要自行去搜索下载),就算最新版本(PHP 5.3 alpha2)的PHP自带的都是这个98年的版本2000.2.8.0,“最新” 版本估计是2000年的产物(根据这个判断© 1988-2000 Microsoft Corp. 保留所有权利。)难怪2001年提交的这个BUG至今还没有被FIX

http://bugs.php.net/bug.php?id=11593

调整php.ini中的 mssql.textlimit 和 mssql.textsize 也没用,这两个参数形同虚设…

鉴于这个库的版本太老,用PHP+MsSQL这种鸡肋组合的同志们要小心了…

解决办法就是使用ODBC驱动,请参考:
在Zend Framework 中使用 PDO_ODBC

Category: PHP     Comments    

在IIS6下配置官方的FASTCGI使用PHP

1.首先到微軟官方IIS網站下載,並安裝 FastCGI Extension for IIS6.0 - RTM
http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1521
(安裝後不需要重啟SERVER)

2.設置IIS
設置支持.php文件

  1. Double click the machine icon for the local computer
  2. Right click on “Web Sites” and pick “Properties”
  3. Click on the tab labeled “Home Directory”
  4. Click on the “Configuration…” button.
  5. Click on the “Add…” button.
  6. Browse to %WINDIR%\system32\inetsrv\ to select fcgiext.dll as the Executable.
  7. Enter .php as the Extension
  8. Select “All verbs”
  9. Ensure that “Script Engine” and “Verify that file exists” are checked.
設置.php擴展名映射

添加影射

設置默認首頁

  1. Double click the machine icon for the local computer.
  2. Right click “Web Sites” and pick “Properties.”
  3. Click the “Documents” tab.
  4. Click the “Add…” button and enter “index.php” for “Default Document Name:”
  5. Click “OK.”
IIS中設置缺省index.php首頁

IIS中設置缺省index.php首頁

3.配置PHP FastCGI

編輯%WINDIR%\system32\inetsrv\fcgiext.ini
在[Types]下面加入
PHP=C:\PHP\php-cgi.exe
[C:\PHP\php-cgi.exe]
QueueLength=1000
MaxInstances=4
InstanceTimeout=30
InstanceMaxRequests=200

上面的參數根據實際環境進行配置

configuration settings (per process pool):
fullPath: path to application for this pool (e.g. d:\php\php-cgi.exe, NOTE: must match handlers section)
maxInstances: maximum number of processes to create in this pool
instanceTimeout: maximum duration a request can last
instanceMaxRequests: process will be retired after exceeding this number of requests
protocol: use named pipes or tcp. The tech preview currently only supports named pipes, but TCP should be simple to add.
queueLength: maximum number of requests to queue (when this is exceeded the module will start 500'ing)
flushNamedPipe: Flush the named pipe at the end of each request. This is to workaround, what seems to be a bug in libfcgi: if two FastCGI requests arrive in a single ReadFile call, libfcgi closes the pipe. (If anyone wants to tackle this problem, I'd be happy to provide a repro)

4.配置php.ini
設置好extension_dir並打開需要的extension

; fastcgi.impersonate = 1; 改成 fastcgi.impersonate = 1
; cgi.fix_pathinfo=1 改成 cgi.fix_pathinfo=1
; cgi.force_redirect = 1 改成 cgi.force_redirect = 0

更詳細的安裝說明可以參考
%WINDIR%\system32\inetsrv\fcgireadme.htm
http://learn.iis.net/page.aspx/247/using-fastcgi-to-host-php-applications-on-iis-60/

PS
當你已經打開過php文件後,你再去修改php.ini必須用命令行重啟IIS才會生效

net stop w3svc
net start w3svc

Copyright © 2005-2009 kingchan.net, All rights reserved, Wordpress-Theme by Felix Krusch 粤ICP备09019789号