首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过MSSQL_*函数连接到MSSQL的PDO

通过MSSQL_*函数连接到MSSQL的PDO
EN

Stack Overflow用户
提问于 2013-01-13 01:35:40
回答 4查看 22.1K关注 0票数 9

有一系列的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连接:

代码语言:javascript
复制
$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_*函数即使没有折旧..。如果是,为什么?

EN

回答 4

Stack Overflow用户

发布于 2013-01-30 17:30:44

我自己的观点

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

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

逻辑上

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

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

将此作为一个例子:

代码语言:javascript
复制
<?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函数现在已经不再推荐使用PDO了,所以您必须对mysql_*使用PDO。

我的PDO测试

我一直在数据库中运行复杂的存储过程,包括INPUT PARAMETERSOUTPUT PARAMETERSINOUT PARAMETERS,数据库中都有100,000,000+记录。这些都是完美无瑕的工作,并继续这样做!

参考文献

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

看这里

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

功能

乍一看,我注意到这些扩展中没有一个具有与mysql_real_escape_string()函数相同的函数。然而,在PDO中,没有必要这样做。

结论

不用说,我是一个道义上的PDO支持者(这是在使用它一年之后才出现的!)这并不是说我不会听取其他人对mssql_*功能的意见,我只是很难说服我,我认为大多数人认为这些功能甚至可以与PDO竞争。

因此,最后,我认为,PDO是前进的方向,主要原因如下:

  1. 它非常便携,很容易用最少的代码切换到不同的数据库。
  2. 它是安全的,不需要像mysql_real_escape_string()这样的功能。
  3. 它正迅速成为开发人员的标准。
  4. 如果您没有面向对象编程的经验,那么这是一个很好的介绍。
  5. 它与大多数PHP包一起预装。
  6. 它可以轻松地执行复杂查询,包括存储过程。
  7. 在使用一个mysql_*数据库对旧的被弃用的函数进行基准测试之后,事实证明它在许多情况下(如果不是所有情况下)都更快。

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

看这里

票数 15
EN

Stack Overflow用户

发布于 2013-01-13 01:44:51

这可能会引发一场好的辩论。我想测试PDO函数对Microsoft服务器的稳定性的唯一方法是设置您自己的本地测试区域,并将PDO类推向它的能力。

如前所述,php5-sybase包含MSSQL函数,不处于弃用过程中。

我想这取决于开发人员对什么感到满意。

如果您对MSSQL_*函数很满意,那么继续使用它们,但是在不久的将来,它们可能会完全被MySQL函数所反对-- MySQL函数也会出现这种情况。

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

完全取决于你。

根据我的偏好&并且猜到许多其他开发人员的偏好,我会说选择PDO函数。我想它会正常工作的。

代码语言:javascript
复制
<?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..
?>
票数 4
EN

Stack Overflow用户

发布于 2017-02-14 06:54:39

PDO绝对是最好的选择,对于linux用户,我强烈建议使用sybase连接器和dblib DSN。

对于使用PHP7的ubuntu用户,应该是:

代码语言:javascript
复制
sudo apt-get install php-sybase freetds-common libsybdb5

以及连接:

代码语言:javascript
复制
$db = new PDO("dblib: host=$hostname:$port; dbname=$dbname", $dbuser, $dbpassword);

你应该可以走了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14299813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档