在Zend Framework 中使用 PDO_ODBC
February 02, 2009
其实只需要小改一下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





