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

ただし、このプロセスがまだ実験的なものとしてリストされている場合、開発者がデータベースに使用する必要がある場合は、この拡張機能がMSSQL サーバーで安定するMicrosoft SQL Serverまで待ちます

結局のところ、PDO 拡張機能または MSSQL_* 関数は減価償却されていませんが..もしそうなら、なぜですか?

4

4 に答える 4

15

私自身の意見

PDOデータベースへの接続に1 年以上使用してい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_*言うまでもなく、関数が現在非推奨であることを考えると、PDO for MySQL を使用する必要があります。

PDO での私のテスト

私は複雑なストアド プロシージャを実行しておりINPUT PARAMETERS、1 億以上のレコードを含むデータベースで、、、を使用していますOUTPUT PARAMETERSINOUT PARAMETERSこれらは完全に完璧に機能し、引き続き機能します。

参考文献

関数を使用しないもう 1 つの理由は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

これは良い議論を引き起こす可能性があります。Microsoft SQL Server に対する PDO 機能の安定性をテストする唯一の方法は、独自のローカル テスト ゾーンをセットアップし、PDO クラスをその能力にプッシュすることだと思います。

あなたが言ったように、php5-sybase には MSSQL 関数が含まれており、非推奨プロセスではありません。

開発者が何に満足しているかにかかっていると思います。

MSSQL_* 関数に満足している場合は、それらを使用してください。ただし、近い将来、PHP から完全に廃止される可能性があります。それは MySQL 関数で発生しています。

ただし、SQL インジェクションによってセキュリティが強化された変更や新しい課題を探している場合は、MSSQL サーバーとの PDO 互換性を試してみてください。

それは完全にあなた次第です。

私の好みと、他の多くの開発者の好みからすると、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..
?>
于 2013-01-13T01:44:51.923 に答える
0

PDO は、セキュリティを考慮して当然の選択です。PDO コードは移植可能です。関数呼び出しを変更せずに、いくつかのパラメーターを変更するだけで、多数のデータベースに情報を送信するように調整できます。

MSSQL クラスは、PDO のように移植可能ではありません。

PDO はプリペアド ステートメントの優れたサポートを備えていますが、MSSQL にはサポートがありません。PDO は、Java の JDBC によく似た抽象化レイヤーとして機能し、移植可能です。PDO はトランザクションをサポートしており、エラー処理に適しています

答えが明らかであることを願っています!

于 2013-01-26T22:50:55.207 に答える