2012-12-30 66 views
-2

是否可以从数据源名称获取数据库名称和位置?从DSN-less字符串获取连接详细信息

$dsn = $_GET['dsn']; 
$conn=odbc_connect($dsn,'',''); 

更新代码

$dsn = "JuniorDSN"; 
$conn=odbc_connect($dsn,'','') or die ("Can't connect to DSN"); 

$dsnarray = explode(";",$dsn); 
$dsn0 = $dsnarray[0]; 

echo $dsn0; 
+0

是的,这是可能的。现在你已经意识到了,你可以试着去做。 –

+0

没有看到任何其他的代码,它似乎是一个_terrible_想法从'$ _GET/$ _ POST/anywyere'中检索一个dsn字符串。它可以让你的网站服务于别人的数据,或者更糟糕的是,欺骗你的用户与未知的第三方存储_their_数据。 –

+0

DSN字符串通常用''key = value'对分隔';'。所以''爆炸()'''''并且随后在'='上再次爆炸()'在一个循环中取出你需要的值。或者使用正则表达式。 –

回答

1

典型DSN是这样的:

Driver={Driver name with space hence curly braces};dbname=testdb 

所以这是parameter=value对用分号隔开。您可以从得到的信息只有通过;{}

但是,您没有使用DSN但别名预定义的配置,存储在odbc.ini(通常位于/ etc/ODBC爆炸字符串,然后=,并修整值与空间.ini在unix系统上)或Windows注册表(HKEY_CURRENT_USER\Software\ODBC\ODBC.INIHKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI)。如果您正在使用Linux,并有机会获得ODBC.INI,您可以使用parse_ini_file解析它:

$connectionInfo = parse_ini_file('/etc/odbc.ini', true); 
var_dump($connectionInfo['JuniorDSN']); 

如果您使用的是Windows,那么你必须从注册表获得此信息,与COM对象应该是可能的。

$shell = new COM("WScript.Shell"); 
$odbcServer = $shell->RegRead("HKEY_CURRENT_USER\\Software\\ODBC\\ODBC.INI\\JuniorDSN\\Server"); 
+0

完美。谢谢你的帮助。我发现它在:“HKEY_LOCAL_MACHINE \\ SOFTWARE \\ ODBC \\ ODBC.INI \\ JuniorDSN \\ DBQ” – Dion