0

以前は MYSql に PDO を使用していましたが、現在は Microsoft SQL Server Driver for PHP を使用する必要があります。

マニュアルを見つけました。 http://php.net/manual/en/book.sqlsrv.php

例 2 を使用して新しい SQL データベースに接続します: http://www.php.net/manual/en/function.sqlsrv-connect.php

次の (PDO mysql) を sqlsrv で動作するように「変換」するにはどうすればよいですか。

$username = 'test';

try {
$conn = new PDO('mysql:host=$host;dbname=$database', $username, password);
$stmt = $conn->prepare('SELECT username users WHERE username = :username LIMIT 1');
$stmt->execute(array('username' => $username));

if ($stmt->rowCount() > 0) {
$result = $stmt->fetch();

    echo $result['username'];

} else {
    echo 'Nothing found.';
die();
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
4

2 に答える 2

1

php.net より

PHP Data Objects (PDO) 拡張機能は、PHP でデータベースにアクセスするための軽量で一貫したインターフェイスを定義します。

すでに PDO for MySQL を使用しているため、 dev-null-dwellerが言ったように、MS SQL 用の PDO ドライバーを使用することを検討してください。SQLSRV ドライバーは、MS SQL にアクセスするためのもう 1 つの選択肢です。ただし、現在の PHP コードをオーバーホールする必要があります。

Microsoftは、MS SQL 用に 2 種類の PHP ドライバーを提供しています。

php_sqlsrv.dllは、MS SQL 用に指定された SQLSRV API の固有のセットを提供します。

php_pdo_sqlsrv.dllは、MS SQL 用のほぼ PDO 互換の API のセットを提供します。

ドライバーをダウンロードするときは、PHP のバージョンに注意してください。

Version 4.0 supports PHP 7.0+ on Windows and Linux
Version 3.2 supports PHP 5.6, 5.5, and 5.4 on Windows
Version 3.1 supports PHP 5.5 and 5.4 on Windows
Version 3.0 supports PHP 5.4 on Windows

また、PHP5.6 の場合、Microsoft は x86 バージョンのドライバーのみを提供しています。非公式の X64 ドライバーは http://robsphp.blogspot.tw/2012/06/unofficial-microsoft-sql-server-driver.htmlにあります。

ドライバをダウンロードした後。必要なバージョンを PHP extフォルダーにコピーします。そしてドライバー名をphp.ini構成に追加します。例えば:

extension=php_pdo_sqlsrv_56_ts.dll

次に、Web サーバーを再起動します。phpinfo()関数でpdo_sqlsrvのセクションが表示されれば、PDOドライバが正しくインストールされていることが確認できます。

また、MS は PDO コンストラクターで異なる DSN を使用することに注意してください。この線

$conn = new PDO('mysql:host=$host;dbname=$database', $username, password);

に変更する必要があります

$conn = new PDO('sqlsrv:Server=$host;Database=$database', $username, password);

その後、「エラー:ドライバーが見つかりませんでした」というメッセージに再び遭遇することはありません。この助けを願っています。

于 2017-04-07T07:02:07.143 に答える
0

接続の問題を解決したら、MySQL SQL ダイアレクトを使用して記述された SQL ステートメントを T-SQL ダイアレクト (SQL Server で使用) に変換する必要があります。

[1]LIMIT SQL Server には句がありません。さらに、この句はSQL標準には含まれていません。代わりに、 ROW_NUMBER() 関数を使用できます。ただし、この場合、この関数を使用する必要はありません...

[2] ... テーブルのusername列は、users一意の値のみを受け入れる必要があります (もちろん、必須である必要があります)。したがって、列に一意の制約または一意のインデックスがあることを確認する必要がありusernameます。usernameこのスクリプトは、列に一意のインデックスがあるかどうかを確認します。

DECLARE @TableName SYSNAME=N'dbo.users';
DECLARE @ColumnName SYSNAME=N'username';
SELECT  *
FROM    sys.indexes i
WHERE   i.object_id=OBJECT_ID(@TableName)
AND     i.is_unique=1
AND     EXISTS (
    SELECT  *
    FROM    sys.index_columns ic 
    INNER JOIN sys.columns c ON c.object_id=ic.object_id
    AND     c.column_id=ic.column_id
    WHERE   i.object_id=ic.object_id
    AND     i.index_id=ic.index_id
    AND     ic.is_included_column=0
    AND     c.name=@ColumnName
)
AND (
    SELECT  COUNT(*)
    FROM    sys.index_columns ic 
    INNER JOIN sys.columns c ON c.object_id=ic.object_id
    AND     c.column_id=ic.column_id
    WHERE   i.object_id=ic.object_id
    AND     i.index_id=ic.index_id
    AND     ic.is_included_column=0
)=1;

[3]列に一意のインデックスがある場合、SQL ステートメントは常にゼロ (最小) または 1 (最大) のレコードを返すため、句 (または関数)usernameを使用する必要はありません。LIMIT 1ROW_NUMBER()

[4] SQL ステートメントは である必要がありますSELECT username FROM users WHERE username = :param

于 2012-10-28T14:32:01.347 に答える