PDO 通过 MSSQL_* 函数连接到 MSSQL

Posted

技术标签:

【中文标题】PDO 通过 MSSQL_* 函数连接到 MSSQL【英文标题】:PDO To Connect to MSSQL Over MSSQL_* Functions 【发布时间】:2012-12-27 07:30:54 【问题描述】:

有一系列mssql_*不在折旧过程中。

它们的工作方式与mysql_* 函数相同;他们需要我手动转义,请在下面找到手册的链接:

http://uk1.php.net/manual/en/book.mssql.php

MSSQL_* 函数是 php5-mssql 的一部分,但现在已移至 php5-sybase

此外,使用 PDO 构建数据库是可用的,但只是实验性 http://php.net/manual/en/ref.pdo-dblib.php

但我的总体问题是,从 PDO/MySQLI 被推为主要数据库通信解决方案这一事实,我是否应该停止使用函数 mssql_*

或者是否有可能:

PDO 连接:

$dsn = 'mssql:host=localhost;dbname=testdb';
$user = 'dbuser';
$password = 'dbpass';

try 
    $dbh = new PDO($dsn, $user, $password);
 catch (PDOException $e) 
    echo 'Connection failed: ' . $e->getMessage();

但是如果这个过程仍然被列为实验性的,如果开发人员在他们的数据库中使用Microsoft SQL Server,请等到这个扩展对 MSSQL 服务器稳定

所以说到底,PDO 扩展或 MSSQL_* 函数即使没有折旧。如果是这样,为什么?

【问题讨论】:

【参考方案1】:

这可能会引发一场精彩的辩论。我想测试 PDO 函数对 Microsoft SQL Server 的稳定性的唯一方法是设置您自己的本地测试区域并将 PDO 类推向其能力。

如您所说,php5-sybase 包含 MSSQL 函数,并且不在弃用过程中。

我想这取决于开发人员的感受。

如果您对 MSSQL_* 函数感到满意,请继续使用它们,但它们可能会在不久的将来完全从 PHP 中被弃用 - MySQL 函数正在发生这种情况。

不过,如果您正在寻找变化和新挑战,并通过 SQL 注入增加安全性,那么请继续尝试 PDO 与 MSSQL 服务器的兼容性。

这完全取决于你。

根据我的偏好和猜测许多其他开发人员的偏好,我会说选择 PDO 功能。我认为它会正常工作。

<?php
$dsn = 'mssql:host=localhost;dbname=testdb';
$user = 'dbuser';
$password = 'dbpass';

try 
    $dbh = new PDO($dsn, $user, $password);
 catch (PDOException $e) 
    echo 'Connection failed: ' . $e->getMessage();


$Query = $dbh->prepare("SELECT * FROM Tbl WHERE `ID` = :id");
$Query ->bindParam(':id', $ID, PDO::PARAM_INT);
$Query->execute();

// etc..
?>

【讨论】:

【参考方案2】:

考虑到安全性,PDO 是显而易见的选择。 PDO 代码是可移植的 - 可以调整它以将信息发送到多个数据库,而无需更改函数调用并且只需更改几个参数。

MSSQL 类不像 PDO 那样可移植。

PDO 对准备好的语句有很好的支持,而 MSSQL 则没有。 PDO 充当抽象层,很像 Java 中的 JDBC,并且是可移植的。 PDO 支持事务,更适合处理错误

希望答案是显而易见的!

【讨论】:

【参考方案3】:

我自己的意见

我已经使用PDO 连接到MSSQL 数据库一年多了,到目前为止我没有发现任何问题。

事实上,在迁移到 PDO 之前,我曾研究过使用 mssql_* 函数,并得出结论认为它们是一种不太可靠的方法,更不用说连接到 MSSQL 数据库的不安全方式了。

逻辑上

从逻辑的角度来看,PDO 也是更好的选择,因为它只需对代码进行一些调整即可从 MSSQL 更改为 MySQL

我为 PDO 类编写了一个包装类,使连接这些数据库变得非常容易。

以此为例:

<?php

// +------------------------------------------------------------------------+
// | class.mssql.php                                                        |
// +------------------------------------------------------------------------+
// | Copyright (c) Company Ltd 2013. All rights reserved.                   |
// | Version       1.0                                                      |
// | Last modified 30/01/2013                                               |
// | Email         email@company.co.uk                                      |
// | Web           http://www.company.co.uk                                 |
// +------------------------------------------------------------------------+

// Make sure the SQL class is included
require_once("class.sql.php");

/*
 * Class mssql
 *
 * @version   1.0
 * @author    Ben Carey <email@company.co.uk>
 * @copyright Company Ltd
 *
*/

class mssql extends sql

    /**
     * Initialize the object and set/reset all variables
     *
     * This function is called when the object is constructed
     *
     * @access private
     */
    function __construct(&$memcache)

        // Call the sql construct
        parent::__construct($memcache);

        // Global MsSQL defaults
        $this->query_escaper_left               = "[";
        $this->query_escaper_right          = "]";
        $this->connection_engine                = "sqlsrv";
        $this->connection_parameter_host        = "server";
        $this->connection_parameter_database    = "Database";
        $this->select_db_function               = "db_name()";
    


?>

MSSQL 独有的任何东西都在此扩展中定义,然后传递给父类class.sql.php。 PDO 的美妙之处在于,文件class.sql.php 中的代码无需以任何方式更改即可与任何数据库(或迄今为止我尝试过的所有数据库)一起使用。

所以这里只需要为每个数据库类型做一个小的扩展,它就可以工作。

然而,使用本机 mssql_* 函数,如果您因任何特定原因决定更改数据库,则必须重写所有内容。更不用说,鉴于 mysql_* 函数现在已被弃用,您无论如何都必须为 MySQL 使用 PDO。

我的 PDO 测试

我一直在运行复杂的存储过程,包括INPUT PARAMETERSOUTPUT PARAMETERSINOUT PARAMETERS,在其中包含 100,000,000 多条记录的数据库上。这些工作绝对完美无缺,并将继续这样做!

参考文献

不使用mssql_* 函数的另一个原因是PHP 5.3 或更高版本的Windows 不再支持它们:

See Here

SyBase 扩展与mssql_* 函数属于同一类别。它们是程序性的,不切实际的,根本不便携!

功能

乍一看,我注意到这些扩展中没有一个具有与mysql_real_escape_string() 函数等效的功能。而在 PDO 中,则不需要这样做

结论

不用说,我是一个道德的 PDO 支持者(这只是在使用它 1 年后才出现的!)。这并不是说我不会听别人对mssql_*函数的意见,只是很难说服我,我想大多数人,这些函数甚至可以与PDO竞争。

因此,在我看来,PDO 是前进的方向,主要原因如下:

    非常便携,用最少的代码轻松切换到不同的数据库 无需mysql_real_escape_string() 等功能即可安全使用 这正迅速成为开发人员的常态 如果您没有面向对象编程的经验,那么这是一个很好的介绍 大多数 PHP 包都预装了它 它可以轻松执行复杂的查询,包括存储过程 在使用 MySQL 数据库对已弃用的旧 mysql_* 函数进行基准测试后,事实证明它在很多情况下(即使不是所有情况)都更快。 - See Here

不久前我问了一个类似的问题,得出了同样的结论:

See here

【讨论】:

我的赏金给你好心的先生。我喜欢你的回复。 @DarylGill 非常感谢 :-) 您能多解释一下您的课程吗?【参考方案4】:

PDO 绝对是要走的路,对于 linux 用户,我强烈建议使用 sybase 连接器和 dblib DSN。

对于使用 PHP7 的 ubuntu 用户,它将是:

sudo apt-get install php-sybase freetds-common libsybdb5

对于连接:

$db = new PDO("dblib: host=$hostname:$port; dbname=$dbname", $dbuser, $dbpassword);

你应该很高兴。

【讨论】:

以上是关于PDO 通过 MSSQL_* 函数连接到 MSSQL的主要内容,如果未能解决你的问题,请参考以下文章

通过 PDO ODBC 将 PHP 连接到 MSSQL

通过 SSL 上的 PHP PDO 连接到 MSSQL 服务器

通过 php 中的 PDO 将 xampp 连接到在线 MSSQL 数据库

使用 SQL Server Driver 通过 PDO 连接到 SQL Server

PHP PDO 连接到具有集成安全性的 SQL Server?

使用 PDO 连接到 SQL Server 2008