web-dev-qa-db-ja.com

PHP7を使用してSQLサーバーに接続する方法は? (私は何が欠けていますか?)

Phpinfoの出力は次のとおりです。 version.php

コードは次のとおりです。

$serverName = "X.X.X.X";
$connection = array( "UID"=>"UserID", "PWD"=>"Password123", "Database"=>"database_name");
$conn = sqlsrv_connect( $serverName, $connection);

if ($conn === false) {
    $myfile3 = fopen("log.txt", "w");
    fwrite($myfile3, sqlsrv_errors());
    fclose($myfile3);

};

$tsql = "SELECT top 10 pName from products";
$stmt = sqlsrv_query( $conn, $tsql);
$row = sqlsrv_fetch_array($stmt);

$myfile4 = fopen("log.txt", "w");
fwrite($myfile4,  $row[0]);
fclose($myfile4);
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);

ログファイルには何も書き込まれません。 fwrite($ myfile3、 "hardcoded text")でテキストをハードコーディングしたとしても;場所、何も書かれていません。

Php.iniファイルの拡張機能セクションは次のとおりです。

[ExtensionList]
;extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_mbstring.dll
extension=php_Gd2.dll
extension=php_gettext.dll
extension=php_curl.dll
extension=php_exif.dll
extension=php_xmlrpc.dll
extension=php_openssl.dll
extension=php_soap.dll
extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll
extension=php_imap.dll
extension=php_tidy.dll
extension=php_sqlsrv_7_nts_x64.dll
;extension=php_sqlsrv_7_ts_x64.dll

最後に、これらのすべてが必要というわけではありませんが、これらはextフォルダーにある4つのdllです。

php_sqlsrv_7_nts_x64.dll
php_sqlsrv_7_nts_x86.dll
php_sqlsrv_7_ts_x64.dll
php_sqlsrv_7_ts_x86.dll
10
Mark

pdo:を使用して

$serverName = "(local)\sqlexpress";  

/* Connect using Windows Authentication. */  
try  
{  
  $conn = new PDO( "sqlsrv:server=$serverName ; Database=AdventureWorks", "", "");  
  $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
}  
catch(Exception $e)  
{   
  die( print_r( $e->getMessage() ) );   
} 

手順:

$serverName = "(local)\sqlexpress";  
$connectionOptions = array("Database"=>"AdventureWorks");  

/* Connect using Windows Authentication. */  
$conn = sqlsrv_connect( $serverName, $connectionOptions);  
if( $conn === false )  
die(sqlsrv_errors());  

詳細については here をクリックしてください

8
viral barot

まず、問題を特定する必要があります。これは、ファイルの書き込みに問題があるか、SQLサーバーへの接続に問題があるか、PHPセットアップに問題がありますか?

SQL Serverのトラブルシューティング

sqlsrv_errors()をできるだけ詳細に呼び出すときに_SQLSRV_ERR_ALL_フラグを使用し、die()または単に_print_r_/echo(ファイルに書き込む代わりに)画面に結果が表示されるので、何か問題があるかどうかを確認できます。 _sqlsrv_connect_ ドキュメントページの例をご覧ください。

次に、ポートを正しく指定していることを確認しようとします、例えば:

_$serverName = 'X.X.X.X, 1433';_

または、SQL Serverインスタンスを指定します、例:

_$serverName = 'X.X.X.X\sqlexpress';_

また、ユーザー、パスワード、データベース名がすべて正しいこと、指定したユーザーがそのデータベースに対する正しい権限を持っていることを確認してください。そしてもちろん、ポート1433で実行されています(または、上記を実行しているポートに変更します)。

その後、これらのプロパティpriorsqlsrv_connect()呼び出しに追加して、接続のトラブルシューティングのために戻ってくるエラーを可能な限り高めることを検討します。

_sqlsrv_configure('WarningsReturnAsErrors', true);
sqlsrv_configure('LogSubsystems', SQLSRV_LOG_SYSTEM_ALL);
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL);
_

それがSQLサーバーからより有用なものを直接見つけるかどうかを確認してください。

ファイル書き込みのトラブルシューティング

  • fopenを確認する必要があります-aの代わりにwモードを使用して、ファイルを開くときにファイルが切り捨てられないようにすることができます
  • また、ファイルのオープン自体が失敗した場合に、返される_$myfile3_が ドキュメント に従ってfalseであるかどうかを確認する必要があります。
    • 存在する場合は、ファイルを作成しようとしているディレクトリにアクセス許可の問題がある可能性があります。ファイルが事前に既に作成されている場合(作成について心配する必要はありません)、そのファイルに対する書き込み権限がない場合もあります。オープンが失敗した場合は、_E_WARNING_を生成する必要があります(_error_reporting_設定が_E_ALL_に設定されているため、ページに表示されますが、PHP error logfile)。 _file_exists_ および is_readable() を使用して権限を確認することもできます。
    • 書き込み値をハードコーディングしても書き込みが行われないと言うと、これが実際の問題だと思うようになります。
  • また、各部分に異なるログファイルを使用することも検討します(どちらの場合も_log.txt_ではありません)

PHPのトラブルシューティング

Microsoft documentation をご覧になり、ご使用のバージョンのWindowsで使用している正しいPHP7 dllとDLLが一致することを確認してください。ただし、v4.0のオペレーティングシステム要件は指定されていませんドライバー:彼らはmay Windows Server 2008をサポートしていませんが、私は驚くでしょう。また、接続をサポートしているSQLサーバーのバージョンも表示されないため、古いバージョンのSQLサーバーを使用している場合も問題になる可能性があります。

2
Leith

ドキュメントから、これはより多くの情報を提供します: http://php.net/manual/en/function.sqlsrv-connect.php

$connectionInfo = array( "Database"=>"dbName");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
     echo "Connection established.<br />";
}else{
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}

それがあなたにエラーを与えないなら、おそらくあなたは許可のためにファイルに書き込めないでしょうか?

1
bstricks

別の方法として、 PDO_SQLSRV 代わりにドライバー。これは、Windows認証を使用してSQL-Serverに接続する例です。

$serverName = "(local)\sqlexpress";    

/* Connect using Windows Authentication. */  
try  
{  
$conn = new PDO( "sqlsrv:server=$serverName ; Database=database_name", "", "");  
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
}  
catch(Exception $e)  
{   
die( print_r( $e->getMessage() ) );   
} 

詳細については、をご覧ください

1
Peter Darmis