Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dla połączenia protokołu kontroli transmisji (TCP) bez portu jawnego domyślnym portem jest 1433. Połączenia z nazwanymi instancjami mogą użyć przeglądarki SQL Server do wykrycia portu instancji. Aby wybrać TCP i konkretny port wprost, użyj tcp:<server>,<port>. Aby uzyskać informacje o konfiguracji strony serwera, zobacz Konfigurowanie serwera do nasłuchiwania na określonym porcie TCP.
Przygotuj endpoint
- Popytaj administratora serwera o nazwę hosta i port TCP. Ciąg połączenia klienta nie zmienia portu, na którym SQL Server nasłuchuje.
- Zezwól na ten port w zaporze serwera i pośrednich zabezpieczeniach sieciowych.
- Ustaw dla
SQL_SERVERtylko nazwę hosta, dlaSQL_PORTdziesiętny numer portu, a dlaSQL_DATABASEnazwę bazy danych. Programy tworzątcp:<server>,<port>. Używaj przecinka przed portem, nie dwukropka. - Ustaw
SQL_PASSWORDiSQL_USERza pomocą konfiguracji chronionego procesu dla tych przykładów uwierzytelniania SQL. Dla uwierzytelniania zintegrowanego lub Microsoft Entra użyj odpowiednich ustawień poświadczeń z Łączenie z serwerem.
Jawnie określony port pozwala uniknąć wykrywania portów instancji za pomocą przeglądarki SQL Server. Utrzymuj nazwę hosta serwera zgodną z certyfikatem. Żaden z tych przykładów nie wyłącza walidacji certyfikatów.
Przechowuj rzeczywistą nazwę bazy danych, nazwę użytkownika i hasło w zmiennych środowiskowych. Oba programy stosują znaki ucieczki dla tych wartości jednokrotnie na potrzeby obsługi połączeń w stylu ODBC przez sterownik PHP, podwajając zamykające nawiasy klamrowe i ujmując każdą wartość w nawiasy klamrowe. Więcej informacji można znaleźć w artykule Łączenie z serwerem.
SQLSRV
Zapisz ten program jako connect-port-sqlsrv.php, i uruchom php connect-port-sqlsrv.php.
<?php
$config = [];
foreach (['SQL_SERVER', 'SQL_PORT', 'SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$value = getenv($name);
if ($value === false || $value === '') {
throw new RuntimeException("Set $name before running this example.");
}
$config[$name] = $value;
}
foreach (['SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$config[$name] = '{' . str_replace('}', '}}', $config[$name]) . '}';
}
$port = filter_var($config['SQL_PORT'], FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 65535],
]);
if ($port === false) {
throw new RuntimeException('SQL_PORT must be an integer from 1 through 65535.');
}
$serverName = 'tcp:' . $config['SQL_SERVER'] . ',' . $port;
$conn = sqlsrv_connect($serverName, [
'Database' => $config['SQL_DATABASE'],
'UID' => $config['SQL_USER'],
'PWD' => $config['SQL_PASSWORD'],
'Encrypt' => true,
'TrustServerCertificate' => false,
'LoginTimeout' => 30,
]);
if ($conn === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$stmt = null;
try {
$stmt = sqlsrv_query($conn, 'SELECT CAST(1 AS int) AS Connected');
if ($stmt === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
if ($row === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
if ($row !== ['Connected' => 1]) {
throw new RuntimeException('Unexpected connection-test result.');
}
echo "Connected on TCP port $port.", PHP_EOL;
} finally {
if (is_resource($stmt)) {
sqlsrv_free_stmt($stmt);
}
sqlsrv_close($conn);
}
PDO_SQLSRV
Zapisz ten osobny program jako connect-port-pdo.php, i uruchom php connect-port-pdo.php w tej samej konfiguracji.
<?php
$config = [];
foreach (['SQL_SERVER', 'SQL_PORT', 'SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$value = getenv($name);
if ($value === false || $value === '') {
throw new RuntimeException("Set $name before running this example.");
}
$config[$name] = $value;
}
foreach (['SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$config[$name] = '{' . str_replace('}', '}}', $config[$name]) . '}';
}
$port = filter_var($config['SQL_PORT'], FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 65535],
]);
if ($port === false) {
throw new RuntimeException('SQL_PORT must be an integer from 1 through 65535.');
}
$serverName = 'tcp:' . $config['SQL_SERVER'] . ',' . $port;
$database = $config['SQL_DATABASE'];
$pdo = new PDO(
"sqlsrv:Server=$serverName;Database=$database;Encrypt=true;"
. "TrustServerCertificate=false;LoginTimeout=30",
$config['SQL_USER'],
$config['SQL_PASSWORD'],
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$stmt = null;
try {
$stmt = $pdo->query('SELECT CAST(1 AS int) AS Connected');
if ($stmt->fetch(PDO::FETCH_ASSOC) !== ['Connected' => '1']) {
throw new RuntimeException('Unexpected connection-test result.');
}
echo "Connected on TCP port $port.", PHP_EOL;
} finally {
$stmt = null;
$pdo = null;
}
Dla SQL_PORT=1433, jeden z programów drukuje:
Connected on TCP port 1433.
Pobrany int w SQLSRV ma w PHP typ int, a domyślnie jest ciągiem w PDO_SQLSRV. Port jest częścią argumentu server dla SQLSRV oraz częścią słowa kluczowego DSN Server dla PDO_SQLSRV. W tym wzorcu nie ma osobnego słowa kluczowego PDO Port .
Rozwiązuj problem z wyborem portu
| Objaw | Action |
|---|---|
| Nazwana instancja działa, ale port jawny nie | Potwierdź rzeczywisty port nasłuchu. Instancja może korzystać z dynamicznego portu, który zmienił się po restarcie. |
| Limit czasu TCP upłynął | Sprawdź listener i zaporę sieciową na hoście PHP. Otwarty port nadal nie dowodzi, że uwierzytelnianie SQL się powiedzie. |
| Weryfikacja nazwy certyfikatu kończy się niepowodzeniem po użyciu adresu IP | Użyj nazwy hosta na certyfikacie z jawnie określonym portem. Nie wyłączaj walidacji w związku ze zmianą nazwy. |
| Aplikacja nadal łączy się gdzie indziej | Sprawdź środowisko działającego procesu PHP oraz wygenerowane ustawienia serwera, bez drukowania danych uwierzytelniających. Uruchom ponownie proces składania wniosku, jeśli jego konfiguracja tego wymaga. |
Wybór TCP i odkrywanie instancji należą do ODBC oraz konfiguracji sieci serwera. PHP dostarcza punkt końcowy i raportuje wynik połączenia. W przypadku Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, bazy danych SQL w usłudze Fabric lub magazynu danych w usłudze Fabric należy zachować punkt końcowy i port dostarczone przez usługę, zamiast wybierać dowolny port. Programy SQL-login nie są przykładami uwierzytelniania dla żadnego z produktów Fabric. Więcej informacji można znaleźć w artykule Połączenia platform Azure i Fabric.