formDin icon indicating copy to clipboard operation
formDin copied to clipboard

SqlServer not port

Open bjverde opened this issue 6 years ago • 2 comments

SqlServer not port

bjverde avatar Jul 09 '19 18:07 bjverde

Está relacionado com https://pt.stackoverflow.com/questions/396341/como-conectar-pdo-com-inst%c3%a2ncias-nomeadas-do-sqlserver

bjverde avatar Jul 10 '19 17:07 bjverde

Solução em https://github.com/microsoft/msphpsql/issues/927#issuecomment-510185524


/***
 * By Peter Stalman (Sarke) 
 * https://github.com/microsoft/msphpsql/issues/927
 */
function getPortSqlServer($host, $instance) {
	$msg = chr(4) . $instance;
	// make the UDP request
	$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
	socket_connect($socket, $host, 1434);
	socket_write($socket, $msg, strlen($msg));
	$buf = '';
	socket_recv($socket, $buf, 2048, MSG_WAITALL);
	socket_close($socket);


	// format it nicely
	$recv = explode(chr(0), $buf, 2);
	$info = [];
	foreach (array_chunk(explode(';', rtrim($recv[1], ';')), 2) as $pair)
		$info[$pair[0]] = $pair[1];


	//For Debug
	//var_dump($info);
	//$correctServer = $host . ',' . $info['tcp']; // 192.168.12.34,49161
	//var_dump($correctServer);
	
	return $info['tcp'];
}


function getHostPort($server, $port=null) {
	list($host, $instance) = explode('\\', $server);
	if( !empty($instance) && empty($port) ){
		$port = getPortSqlServer($host,$instance);
	}	
	if( !empty($port) ){
		$server = $server.','.$port;
	}	
	return $server;
}


$hostname = "SERVERNAME\INSTANCENAME";
$hostname = getHostPort($hostname);	
$dbname   = "myDataBase";
$username = "myUser";
$password = "myPass";

$conn = new PDO('sqlsrv:Server='.$hostname.';Database='.$dbname, $username , $password);

bjverde avatar Jul 10 '19 18:07 bjverde