2012-09-22 191 views
4

我目前有一個連接到MSSQL以獲取其數據的大型Web應用程序。這個網絡應用程序有數百個.php文件。我有一個新客戶,他不想使用MSSQL,而是使用MySQL。將PHP代碼從MSSQL遷移到MySQL

我搜索了很多關於如何遷移數據的文章。但那不是我的問題。我知道該怎麼做,除了幾個默認目錄之外,我們將從一個空白數據庫開始。

我需要知道的是,是否有辦法自動將mssql_query代碼更改爲mysqli代碼。例如:

$SqlText = 'SELECT a, b, c FROM table WHERE x=y'; 
if (!$result = mssql_query($SqlText) { 
    die('Error'); 
} 
while ($row = mssql_fetch_assoc($result) { 
    echo '<td>' . $row['a'] . '</td>'; 
    echo '<td>' . $row['b'] . '</td>'; 
    echo '<td>' . $row['c'] . '</td>'; 
} 

成類似:

$SqlText = 'SELECT a, b, c FROM table WHERE x=y'; 
if (!$result = mssqli_query($db, $SqlText) { 
    die('Error'); 
} 
while ($row = mssqli_fetch_assoc($result) { 
    echo '<td>' . $row['a'] . '</td>'; 
    echo '<td>' . $row['b'] . '</td>'; 
    echo '<td>' . $row['c'] . '</td>'; 
} 

此外,你可以看到,我用它甚至沒有PHP的新版本支持舊mssql_query代碼。是否至少有一個工具可以將我的代碼從mssql_query更改爲新版本的sqlserv_query類型的命令?

任何幫助非常感謝。

+0

mysqli是好的,它不是「舊的mysql_函數」 – artragis

+2

爲了避免未來的痛苦,我會建議創建一個數據庫類,從外推的核心代碼。這將允許你的數據庫類包含標準函數,你只需要更新幾個位置而不是所有的PHP文件。 – endyourif

+0

這是一個很好的解決方案 – artragis

回答

2

我不認爲有一個完全自動的方式。因爲MySQL有'LIMIT',例如MSSQL有'TOP'。當然,這不會是一個問題,但我不確定複雜的MSSQL查詢是否會將1:1轉換爲MySQL。

並建議您使用``符號來指出MySql它是一個數據庫,表或列名稱的成員。例如:

$SqlText = 'SELECT a, b, c FROM table WHERE x=y'; 

將變爲

$SqlText = 'SELECT `a`, `b`, `c` FROM `table` WHERE `x`=y'; 

現在您可以查詢,如

'SELECT `select` FROM `datetime` WHERE `limit` = 1' 

否則的話,選擇日期時間和限制將與MySQL的語法干擾。

+1

'注意是強制性的。我從來沒有使用過它們,除了那個命名桌子的人給出了一個保留字作爲名字。 – artragis

0

您可以使用發現&與favourit IDE例如替換,在NetBeans中單擊在項目窗口,然後在編輯,替換並鍵入你的函數名

您也可以使用PHP腳本這樣的:

$config = array('msssql_query'=>'mysqli_query' /*... all the functions*/) 

$dirs = array('./','subDirectory1','subDirectory2');/*all your sub dirs*/); 
foreach($dirs as $dir){ 
    foreach(glob($dir.'/*.php') as $filename){ 

     $filecontent = file_get_contents($filename); 
     file_put_contents(str_replace($config,$filecontent,$filename)); 

    } 
} 

此外,正如@endyourif所說,你最好將數據庫連接包裝在類和接口中。

interface DAOInterface{ 
    public function query($string); 
    public function prepare($string); 
    public function quote($string);//etc 

} 
interface DAOStatementInterface{ 
    public function execute($array = array()); 
    public function bind($value,$param,$type); 
    /*etc*/ 
} 

,或者您可以使用PDO

0

我居然遇到了這個問題最近。使用MYSQL Workbench發現確實解決了將數據庫從MSSQL遷移到MYSQL的問題。但是,仍然存在一個問題,即在數據庫中發生的編輯不多的情況下,由於某些問題,PHP代碼會被頻繁編輯。所以很難每天逐一遷移每個文件。所以我研究並提出了一個仍然不是100%的功能,並且有其缺點,但是解決了我的問題。

我使用了Sublime Text Editor,並使用它將所有出現的mssql_替換爲sql_,然後包含該函數。

我試着先定義mssql_函數,但事實證明,我必須從PHP模塊中實際禁用mssql。如果只有一個應用程序使用該PHP,那很好,但由於有很多,所以我不得不將每一個頁面改寫爲新的函數。

你可以找到我的代碼here。但我不能保證你得到完整的結果。