4

現在、MSSQL に接続してデータをフェッチする大規模な Web アプリケーションがあります。この Web アプリには、何百もの .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 タイプのコマンドに変更できるツールは少なくともありますか?

どんな助けでも大歓迎です。

4

3 に答える 3

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'

そうしないと、select、datetime、および limit という単語が MySql 構文に干渉します。

于 2012-09-22T09:16:09.527 に答える
0

たとえば、お気に入りの 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を使用できます

于 2012-09-22T09:19:57.743 に答える