2012-07-23 131 views
10

在SQLSRV驱动程序与PDO驱动程序(适用于MS SQL Server的PHP)之间进行选择时应考虑哪些因素?SQLSRV驱动程序与使用MS SQL Server的PHP的PDO驱动程序

我看到了此前的Stackoverflow帖子(When using PHP on Windows, what is better (1) the native driver for SQL Server or (2) the PDO driver?),但答案似乎有点缺乏,并没有提到使用this article中提到的SQLSRV驱动程序的所有好处。

我正在寻找一个全面的,最新的(例如,它仍然是SQLSRV驱动程序只适用于Windows?)答案,程序员可以称为资源。

回答

7

PDO允许你写你的代码是合理的DB中立。

如果你想真正的DB中立,你会想要使用一个完整的数据库抽象层,如NotORM - 与普通的PDO,你仍然需要注意SQL语法的差异,但至少你的基本PHP代码将是DB中立的。

现在数据库中性可能看起来并不重要 - 如果您使用的是SQL Server,那么您可能已被告知这是必需的,没有其他 - 但是您无法预测事情将如何改变未来,所以如果选择是在数据库中立的驱动程序和数据库特定的驱动程序之间进行的,并且您没有任何其他的偏好理由,那么使用中性的驱动程序......它会使生活如果你的公司被接管并且新老板想要使用Oracle作为数据库,那么容易很多!

另外,因为它是数据库中立的,所以PDO在PHP社区中更加标准和更为知名。你会从网站上获得更多的PDO帮助(比如这个),而不是MSSQL驱动。

10

SQLSRV和PDO_SQLSRV是两个current-generation php drivers available from Microsoft,但都使用下面的代码:SQL Server Native Client 11.(这就是为什么没有Mac或Linux版本的PHP驱动程序:它们只是包装。)两个性能司机应该是相似的;这只是你喜欢哪个API的问题。

在大多数情况下,由于跨平台的考虑,会使用PDO_SQLSRV驱动程序。但是,在查看这两个驱动程序之后,我使用SQLSRV驱动程序来查看这两个驱动程序,因为它将数据作为底层SQL Server数据类型的映射返回,而PDO_SQLSRV将所有内容作为字符串返回。

所以,如果你的SQL是:

SELECT 1234 as integer, Cast(123.456 as float) as float, 
     getdate() as date, '1234' as string1,'123.456' as string2; 

然后从PDO_SQLSRV该行的var_dump给出:

array(1) { 
    [0] => 
    array(5) { 
     'integer' => 
     string(4) "1234" 
     'float' => 
     string(7) "123.456" 
     'date' => 
     string(23) "2012-12-06 22:35:05.373" 
     'string1' => 
     string(4) "1234" 
     'string2' => 
     string(7) "123.456" 
    } 
    } 

而SQLSRV驱动程序提供了:

array(1) { 
    [0] => 
    array(5) { 
     'integer' => 
     int(1234) 
     'float' => 
     double(123.456) 
     'date' => 
     class DateTime#1 (3) { 
     ... 
     } 
     'string1' => 
     string(4) "1234" 
     'string2' => 
     string(7) "123.456" 
    } 
    } 

它驱使我坚果PDO_SQLSRV将我的所有数据都转换为字符串,无论我是否愿意,因此我使用了SQLSRV。 (我不得不承认我设置了ReturnDatesAsStrings=true,因为我懒得处理日期类。)

我也喜欢语法稍微好点,但那只是我。

4

微软终于提供了一些资源来定制他们的原生驱动程序,以便与PHP良好协作。我目前正在对Apa​​che 2.4 64位进行beta测试。

Beta PHP 7 SQL_SRV 64Bit Driver