2011-06-09 26 views
3

我剛剛將mssql_connect的連接驅動程序(擴展名)更改爲sqlsrv_connect。不幸的是,事情似乎並不像我想要的那樣工作。如果有人能告訴我發生了什麼問題,我該如何解決。mssql_connect和sqlsrv_connect之間的區別

代碼摘錄:

//a oracle DB moudle with a generic functions such as 
//db_connect() db_query() 

/// turn on verbose error reporting (15) to see all warnings and errors 
error_reporting(15); 
//generic DB operations 

// Global record . for using in 
$curr_rec = NULL; 

function dbok($res) 
{ 
    if($res==false){ 
     echo "DB error: "."FIXME need error mesg"."\n"; 
     exit; 
    } 
    return $res; 
} 

function db_now_expr() 
{ 
    return "getdate()"; 
} 

function db_is_connected($dbh) 
{ 
    return $dbh>0; 
} 

function ensure_connected($dbh) 
{ 
    if(!db_is_connected($dbh)) die("DB is not connected, operation failed"); 
    //echo "DEBUG: hdb=$dbh"; 
} 

//connect to given database 
//return handler to DB 


function dbo_logon($dbserver,$dbname) 
{ 

    $tsql = ??????? ====>>> what should i put here???? 

    $dbserver = "computername\SQLEXPRESS"; 
    $dbname = MY_Database_name; 

    $connectionOptions = array("Database"=>"BULL"); 

    $dbh=dbok(sqlsrv_connect($dbserver, $connectionOptions)); 
    dbok(sqlsrv_query($dbname,$dbh)); 

    $stmt = sqlsrv_query($connectionOptions, $tsql); 

    return $dbh; 

} 

//close DB 
function dbo_logoff($dbh) 
{ 
    if(!db_is_connected($dbh)) echo("DB disconnect error"); 
    sqlsrv_close($dbh); 
} 

下面是使用mssql_connect原代碼:

//a oracle DB module with a generic function such as 
//db_connect() db_query() 

/// turn on verbose error reporting (15) to see all warnings and errors 
error_reporting(15); 
//generic DB operations 

// Global record . for using in 
$curr_rec = NULL; 

function dbok($res) 
{ 
    if($res==false){ 
     echo "DB error: "."FIXME need error mesg"."\n"; 
     exit; 
    } 
    return $res; 
} 

function db_now_expr() 
{ 
    return "getdate()"; 
} 

function db_is_connected($dbh) 
{ 
    return $dbh>0; 
} 

function ensure_connected($dbh) 
{ 
    if(!db_is_connected($dbh)) die("DB is not connected, operation failed"); 
    //echo "DEBUG: hdb=$dbh"; 
} 

//connect to given database 
//return handler to DB 
function dbo_logon($dbserver,$dbuser,$dbpass,$dbname) 
{ 
    // $dbh=dbok(mssql_pconnect($dbserver,$dbuser,$dbpass)); 
    $dbh=dbok(mssql_connect($dbserver,$dbuser,$dbpass)); 
    //error_log("connect to [$dbname]".date("His")." \r\n",3,"/tmpbull.log"); //DBEUG DELME 
    dbok(mssql_select_db($dbname,$dbh)); 
    //dbo_exec($dbh,"alter session set NLS_DATE_FORMAT='dd-mm-yyyy //hh24:mi:ss'"); 
    return $dbh; 

} 

//close DB 
function dbo_logoff($dbh) 
{ 
    if(!db_is_connected($dbh)) echo("DB disconnect error"); 
    mssql_close($dbh); 
} 

注意,我不得不改變從SQL驗證的驗證方法Windows身份驗證,因爲sqlsrv_connect使用Windows身份驗證,而不是的SQL身份驗證。是對的嗎?

+1

定義「似乎不按我想要的方式工作」。 – 2011-06-09 19:05:13

回答

2

我認爲這兩個環節,將有助於瞭解MSSQL和SQLSRV之間差異

雖然在短期,引用的文章之一:

SQLSRV驅動程序內置,維護和支持Microsoft`

MSSQL驅動程序是由社區建設的驅動程序。

我不確定這個驅動程序最近是如何作爲官方PHP擴展更新或維護的,但是從PHP 5.3的發佈開始,它不再可用於PECL。一個快速的互聯網搜索出現了幾個地方來下載mssql驅動程序,但是我沒有發現它們表明驅動程序正在被主動維護。

來源:http://blogs.msdn.com/b/brian_swan/archive/2010/03/08/mssql-vs-sqlsrv-what-s-the-difference-part-1.aspx

至於你的代碼示例,見下圖:

$dbserver = "computername\SQLEXPRESS"; 

$dbname = "BULL"; 
$connetion = dbo_logon($dbserver,$dbname); 
function dbo_logon($dbserver,$dbname) { 
    $connectionOptions = array("Database"=>$dbname); 
    $dbh=sqlsrv_connect($dbserver, $connectionOptions); 
    if(!$dbh){ 
     die("Error in Database connection"); 
     return false; 
    } 
return $dbh; 
} 

我認爲這將用於連接工作。 請注意代碼未經測試。

0

「的SQLSRV驅動程序內置,維護和支持Microsoft`」那麼現在2014年9月,也沒有正式發佈,支持PHP 5.6最後的正式發佈,從2012年4月MS風格。