【问题标题】:PDO To Connect to MSSQL Over MSSQL_* FunctionsPDO 通过 MSSQL_* 函数连接到 MSSQL
【发布时间】: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_* 函数即使没有折旧。如果是这样,为什么?

【问题讨论】:

    标签: php database sybase


    【解决方案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 是前进的方向,主要原因如下:

        1. 非常便携,用最少的代码轻松切换到不同的数据库
        2. 无需mysql_real_escape_string() 等功能即可安全使用
        3. 这正迅速成为开发人员的常态
        4. 如果您没有面向对象编程的经验,那么这是一个很好的介绍
        5. 大多数 PHP 包都预装了它
        6. 它可以轻松执行复杂的查询,包括存储过程
        7. 在使用 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);
        

        你应该很高兴。

        【讨论】:

          猜你喜欢
          • 2013-12-08
          • 2015-11-19
          • 2011-08-22
          • 2014-12-02
          • 2016-12-18
          • 2015-03-10
          • 1970-01-01
          • 2016-10-19
          相关资源
          最近更新 更多