Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Pour une connexion Transmission Control Protocol (TCP) sans port explicite, le port par défaut est 1433. Les connexions à instances nommées peuvent utiliser SQL Server Browser pour découvrir le port de l'instance. Pour sélectionner explicitement TCP et un port spécifique, utilisez tcp:<server>,<port>. Pour des informations sur la configuration du côté serveur, voir Configurer un serveur pour écouter sur un port TCP spécifique.
Préparer le point de terminaison
- Demandez à l’administrateur du serveur le nom de l’hôte et le port TCP. Une chaîne de connexion client ne change pas le port sur lequel SQL Server écoute.
- Autorisez ce port dans le pare-feu du serveur et les contrôles réseau intermédiaires.
- Réglez
SQL_SERVERuniquement sur le nom de l’hôte,SQL_PORTsur le numéro de port décimal, etSQL_DATABASEsur le nom de la base de données. Les programmes créenttcp:<server>,<port>. Utilisez une virgule avant le numéro de port, pas un deux-points. - Définissez
SQL_USERetSQL_PASSWORDvia la configuration du processus protégé pour ces exemples d’authentification SQL. Pour une authentification intégrée ou Microsoft Entra, utilisez les paramètres d’identifiants appropriés de la section Connexion au serveur.
Un port explicite évite la découverte du port d’instance via SQL Server Browser. Gardez le nom de l’hôte serveur cohérent avec son certificat. Aucun des deux exemples ne désactive la validation des certificats.
Stockez le nom réel de la base de données, le nom d’utilisateur et le mot de passe dans les variables d’environnement. Les deux programmes échappent à ces valeurs une fois pour la gestion de la connexion de type ODBC du pilote PHP en doublant les accolades fermantes et en encadrant chaque valeur entre accolades. Pour plus d’informations, voir Connexion au serveur.
SQLSRV
Enregistrez ce programme sous le nom de connect-port-sqlsrv.php, et exécutez 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
Enregistrez ce programme séparé sous le nom de connect-port-pdo.php, et exécutez php connect-port-pdo.php avec la même configuration.
<?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;
}
Pour SQL_PORT=1433, l’un ou l’autre programme imprime :
Connected on TCP port 1433.
L’int récupéré est un entier PHP int dans SQLSRV et par défaut une chaîne dans PDO_SQLSRV. Le port fait partie de l’argument serveur pour SQLSRV et du Server mot-clé DSN pour PDO_SQLSRV. Il n’existe pas de mot-clé PDO Port séparé dans ce schéma.
Résoudre les problèmes liés à la sélection du port
| Symptôme | Action |
|---|---|
| Une instance nommée fonctionne, mais un port explicite ne fonctionne pas | Confirmez le port d’écoute réel. L’instance peut utiliser un port dynamique qui a changé après un redémarrage. |
| Délai d’attente TCP dépassé | Vérifie l’écouteur et le pare-feu depuis l’hôte PHP. Un port ouvert ne prouve toujours pas que l’authentification SQL réussira. |
| La validation du nom de certificat échoue après l’utilisation d’une adresse IP | Utilisez le nom d’hôte sur le certificat avec le port explicite. Ne désactivez pas la validation pour compenser le changement de nom. |
| L’application se connecte encore ailleurs | Vérifiez l’environnement du processus PHP en cours d’exécution et le paramètre serveur généré, sans imprimer les identifiants. Redémarrez le processus de l’application si sa configuration l’exige. |
La sélection TCP et la découverte d’instance appartiennent à ODBC et à la configuration réseau du serveur. PHP fournit le terminau et rapporte le résultat de la connexion. Pour Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL database dans Fabric ou Warehouse dans Fabric, conservez le point de terminaison et le port fournis par le service au lieu de choisir un port arbitraire. Les programmes de connexion SQL ne sont pas des exemples d'authentification pour l’un ou l’autre des produits Fabric. Pour plus d’informations, voir connexions Azure et Fabric.