PDO通过MSSQL_ *函数连接到MSSQL

时间:2013-01-13 01:35:41

标签: 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();
}

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

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

4 个答案:

答案 0 :(得分:15)

我自己的意见

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

事实上,我在迁移到mssql_*之前考虑使用PDO函数,并且得出的结论是,它们不太可靠,更不用说,不安全的方式连接到MSSQL {1}}数据库。

逻辑上

从逻辑角度来看,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_*函数现已弃用,您无论如何都必须使用PDO for MySQL。

我使用PDO进行测试

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

参考

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

<强> See Here

SyBase Extension与mssql_*功能属于同一类别。它们是程序性的,不切实际的,根本不可移植!

功能

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

结论

毋庸置疑,我是道德PDO的支持者(这只是在使用它1年之后!)。这并不是说我不会听取其他人对mssql_*函数的看法,只是很难说服我,而且我认为大多数人都认为这些函数甚至可以与PDO竞争。

总而言之,在我看来,PDO是前进的方式,原因如下:

  1. 它非常便携,使用最少的代码轻松切换到不同的数据库
  2. 无需像mysql_real_escape_string()
  3. 这样的功能,它是安全的
  4. 它正在迅速成为开发者的常态
  5. 如果您没有面向对象编程的经验,那么这是一个很好的介绍
  6. 预装了大多数PHP软件包
  7. 它可以轻松执行comples查询,包括存储过程
  8. 在针对旧的已弃用的mysql_*函数对MySQL数据库进行基准测试后,事实证明,在很多情况下(如果不是所有情况)都会更快。 - { {3}}
  9. 我前一段时间问了一个类似的问题,并得出了同样的结论:

    See Here

答案 1 :(得分:4)

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

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

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

如果您对MSSQL_ *函数感到满意,那么请继续使用它们,但有可能它们最终会在不久的将来完全从PHP中弃用 - 它发生在MySQL函数中。

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

这完全取决于你。

从我的偏好&amp;并猜测许多其他开发人员的偏好,我会说去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 :(得分: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);

你应该好好去。

答案 3 :(得分:0)

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

MSSQL类不像PDO可移植的那样可移植。

PDO对准备好的语句有很好的支持,而MSSQL没有。 PDO充当抽象层,与Java中的JDBC非常相似,并且是可移植的。 PDO支持事务,更好地处理错误

希望答案显而易见!