将PHP代码从MSSQL迁移到MySQL

4

我目前有一个大型的 web 应用程序,它连接到 MSSQL 来获取数据。这个 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>';
}

Into something like:

$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>';
}

此外,您可以看到,我正在使用旧版的mssql_query代码,该代码甚至在PHP的新版本中都已不再受支持。是否有工具可以将我的代码从mssql_query更改为sqlserv_query类型的新版本命令?非常感谢任何帮助。

mysqli很好,它不是“旧的mysql_函数”。 - artragis
2
为了避免未来的痛苦,我建议创建一个数据库类,从核心代码中推导出它。这将使您的数据库类包含标准函数,您只需要更新几个位置而不是所有PHP文件。 - endyourif
mysqli和PDO一样,是来自于PHP 5的。它具有与PDO相同的防注入优势,并且除了模拟准备语句之外,还比PDO具有更多的功能。mysqli仅使用服务器端准备语句。但是PDO并不“比”mysqli更好。mysqli比mysql_更新,能够更好地完成工作,这就是它所需要的。 - artragis
我认为 mssqli_query 应该是 mysqli_query,而且我不明白为什么你想用 sqlserv_query 替换 mssql_query。难道不是要将 SQLServer 替换为 MySQL 吗?! - axiac
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语法。

1
反引号(`)不是必需的。除非表名使用保留字作为名称,否则我从未使用过它们。 - artragis

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。


0

我最近遇到了这个问题。发现使用MYSQL Workbench可以解决从MSSQL迁移到MYSQL的问题。然而,仍然存在一个问题,即虽然数据库中没有进行太多编辑,但由于某些问题,PHP端代码经常被编辑。因此,每天逐个迁移每个文件变得困难。所以我进行了研究,并提出了一个函数,它仍然不是100%完美,有其缺点,但解决了我的问题。

我使用Sublime Text Editor,用它替换了所有mssql_的出现,并包含了该函数。

我尝试首先定义mssql_函数,但结果是,我必须实际上禁用PHP模块中的mssql。如果只有一个应用程序使用该PHP,则没问题,但由于有许多应用程序,我不得不将每个页面重写为新函数。

你可以在这里找到我的代码。但我不能保证你会得到完整的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接