PDO通过MSSQL_*函数连接到MSSQL

use*_*541 9 php database sybase

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();
}
Run Code Online (Sandbox Code Playgroud)

但是如果这个过程仍然是实验性的,那么开发人员是否应该使用Microsoft SQL Server他们的数据库,等到这个扩展对MSSQL服务器来说稳定的

所以在一天结束时,PDO扩展或MSSQL_*功能,即使它们没有折旧.如果是这样,为什么?

Ben*_*rey 15

我自己的意见

我一直PDO用来连接MSSQL数据库超过一年,到目前为止我发现绝对没有问题.

实际上,我mssql_*在迁移之前考虑使用这些函数PDO,并得出结论,它们是一种更不可靠,更不用说,不安全的连接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()";
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

任何独特的东西都MSSQL在此扩展中定义,然后传递给父类class.sql.php.PDO的优点在于文件class.sql.php中的代码不必以任何方式更改为任何数据库(或者我迄今为止尝试过的所有数据库).

所以这里需要的是每个数据库类型的小扩展,它将起作用.

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

我用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. 它可以轻松执行comples查询,包括存储过程
  7. 在针对旧的已弃用mysql_*函数对MySQL数据库进行基准测试之后,事实证明,在很多情况下,如果不是所有情况都会更快.- 见这里

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

看这里


Dar*_*ill 4

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

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

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

如果您对 MSSQL_* 函数感到满意,那么就继续使用它们,但它们有可能在不久的将来从 PHP 中完全弃用——MySQL 函数就是这样。

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

这完全取决于你。

根据我的偏好以及猜测许多其他开发人员的偏好,我会说选择 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..
?>
Run Code Online (Sandbox Code Playgroud)