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 连接:

$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_* 函数,即使它们没有折旧。如果是这样,为什么?

4

4 回答 4

15

我自己的意见

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

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

逻辑上

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

我为 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 PARAMETERS, OUTPUT PARAMETERS, INOUT PARAMETERS, 在包含 100,000,000 多条记录的数据库上运行复杂的存储过程。这些工作绝对完美无缺,并将继续这样做!

参考

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

看这里

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_*函数进行基准测试后,事实证明它在很多情况下(即使不是所有情况)都更快。-看这里

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

看这里

于 2013-01-30T17:30:44.003 回答
4

This could spark up a good debate. I guess the only way to test the stability of the PDO functions towards Microsoft SQL Servers, is to setup your own local testing zone and push the PDO Class to its abilities.

As you said, php5-sybase contains MSSQL Functions and are not in the deprecation process.

I guess it's down to what the developer feels comfortable with.

If you're happy with MSSQL_* Functions, then go ahead and use them, but there could be a possibility they will end up getting deprecated from PHP altogether in the near future -- it's happening with MySQL Functions.

Although, if you're looking for a change and new challenges, with added security from SQL Injection, then go ahead and try out the PDO compatibility with MSSQL Servers.

It's entirely down to you.

From my preference & and guess many other developers preference, I would say go for the PDO functions. I assume it would work as normal.

<?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..
?>
于 2013-01-13T01:44:51.923 回答
1

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);

你应该很高兴。

于 2017-02-14T06:54:39.637 回答
0

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

MSSQL 类不像 PDO 那样可移植。

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

希望答案是显而易见的!

于 2013-01-26T22:50:55.207 回答